summaryrefslogtreecommitdiff
path: root/modules/codec/c++/data.hpp
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-06-12 15:04:42 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-06-12 15:04:42 +0200
commite4e49a117702945066e3e279fa0f005200400cb7 (patch)
tree3e9bab0804083461c9ef0732a47abba1fb8a9fdf /modules/codec/c++/data.hpp
parent6831edddd22d2d8dbb73c88fb612c0bdd5b8ba19 (diff)
Separated Encoding and Storage approaches
Diffstat (limited to 'modules/codec/c++/data.hpp')
-rw-r--r--modules/codec/c++/data.hpp91
1 files changed, 45 insertions, 46 deletions
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp
index 2a5f082..79f5264 100644
--- a/modules/codec/c++/data.hpp
+++ b/modules/codec/c++/data.hpp
@@ -20,10 +20,9 @@ struct Default {};
}
namespace encode {
-template<typename Storage = storage::Default>
struct Native {};
}
-template<typename Schema, typename Encode>
+template<typename Schema, typename Encode, typename Storage = storage::Default>
class codec;
/*
* Helper for the basic message container, so the class doesn't have to be
@@ -81,14 +80,14 @@ struct native_data_type<schema::Primitive<schema::FloatingPoint, 8>> {
using type = double;
};
-template<typename T, typename Encoding = encode::Native<storage::Default>>
+template<typename T, typename Encoding = encode::Native, typename Storage = storage::Default>
class data {
private:
static_assert(always_false<T>, "Type not supported");
};
-template<typename T, size_t N, typename Platform>
-class data<schema::Primitive<T,N>, encode::Native<Platform>> {
+template<typename T, size_t N>
+class data<schema::Primitive<T,N>, encode::Native, storage::Default> {
private:
typename native_data_type<schema::Primitive<T,N>>::type value_;
public:
@@ -106,19 +105,19 @@ public:
typename native_data_type<schema::Primitive<T,N>>::type get() const {return value_;}
- data<schema::Primitive<T,N>, encode::Native<Platform>> operator*(const data<schema::Primitive<T,N>, encode::Native<Platform>>& rhs)const{
+ data<schema::Primitive<T,N>, encode::Native, storage::Default> operator*(const data<schema::Primitive<T,N>, encode::Native, storage::Default>& rhs)const{
return {get() * rhs.get()};
}
- data<schema::Primitive<T,N>, encode::Native<Platform>> operator/(const data<schema::Primitive<T,N>, encode::Native<Platform>>& rhs)const{
+ data<schema::Primitive<T,N>, encode::Native, storage::Default> operator/(const data<schema::Primitive<T,N>, encode::Native, storage::Default>& rhs)const{
return {get() / rhs.get()};
}
- data<schema::Primitive<T,N>, encode::Native<Platform>> operator+(const data<schema::Primitive<T,N>, encode::Native<Platform>>& rhs)const{
+ data<schema::Primitive<T,N>, encode::Native, storage::Default> operator+(const data<schema::Primitive<T,N>, encode::Native, storage::Default>& rhs)const{
return {get() + rhs.get()};
}
- data<schema::Primitive<T,N>, encode::Native<Platform>> operator-(const data<schema::Primitive<T,N>, encode::Native<Platform>>& rhs)const{
+ data<schema::Primitive<T,N>, encode::Native, storage::Default> operator-(const data<schema::Primitive<T,N>, encode::Native, storage::Default>& rhs)const{
return {get() - rhs.get()};
}
@@ -136,7 +135,7 @@ public:
* Casts
*/
template<typename Target>
- data<Target, encode::Native<Platform>> cast_to(){
+ data<Target, encode::Native, storage::Default> cast_to(){
auto raw_to = static_cast<typename saw::native_data_type<Target>::type>(value_);
return {raw_to};
}
@@ -145,12 +144,12 @@ public:
/**
* Mixed precision class for native formats
*/
-template<typename TA, uint64_t NA, typename TB, uint64_t NB, typename Platform>
-class data<schema::MixedPrecision<schema::Primitive<TA,NA>, schema::Primitive<TB,NB>>, encode::Native<Platform>>{
+template<typename TA, uint64_t NA, typename TB, uint64_t NB>
+class data<schema::MixedPrecision<schema::Primitive<TA,NA>, schema::Primitive<TB,NB>>, encode::Native, storage::Default>{
public:
using Schema = schema::MixedPrecision<schema::Primitive<TA,NA>, schema::Primitive<TB,NB>>;
private:
- data<typename Schema::StorageSchema, encode::Native<Platform>> value_;
+ data<typename Schema::StorageSchema, encode::Native, storage::Default> value_;
public:
data():value_{}{}
@@ -169,9 +168,9 @@ public:
* Union type for native data classes
*/
template<typename... T, string_literal... literals>
-class data<schema::Union<schema::Member<T, literals>...>, encode::Native<storage::Default>> {
+class data<schema::Union<schema::Member<T, literals>...>, encode::Native, storage::Default> {
private:
- std::variant<data<T,encode::Native<storage::Default>>...> value_;
+ std::variant<data<T,encode::Native, storage::Default>...> value_;
public:
data() = default;
@@ -179,12 +178,12 @@ public:
SAW_DEFAULT_MOVE(data);
template<string_literal lit>
- void set(data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native<storage::Default>> val){
+ void set(data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native, storage::Default> val){
value_ = std::move(val);
}
template<string_literal lit>
- data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native<storage::Default>>& init(){
+ data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native, storage::Default>& init(){
value_.template emplace<parameter_key_pack_index<lit, literals...>::value>();
return get<lit>();
}
@@ -195,12 +194,12 @@ public:
}
template<string_literal lit>
- data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native<storage::Default>>& get(){
+ data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native, storage::Default>& get(){
return std::get<parameter_key_pack_index<lit, literals...>::value>(value_);
}
template<string_literal lit>
- const data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native<storage::Default>>& get() const{
+ const data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value, T...>::type, encode::Native, storage::Default>& get() const{
return std::get<parameter_key_pack_index<lit, literals...>::value>(value_);
}
};
@@ -209,12 +208,12 @@ public:
* Data class which represents a struct in the native format.
*/
template<typename... T, string_literal... literals>
-class data<schema::Struct<schema::Member<T, literals>...>, encode::Native<storage::Default>> {
+class data<schema::Struct<schema::Member<T, literals>...>, encode::Native, storage::Default> {
private:
/**
* Tuple storing the member values.
*/
- std::tuple<data<T,encode::Native<storage::Default>>...> value_;
+ std::tuple<data<T,encode::Native, storage::Default>...> value_;
public:
/**
* Default constructor.
@@ -233,7 +232,7 @@ public:
literal, literals...
>::value
, T...>::type
- , encode::Native<storage::Default>>& get(){
+ , encode::Native, storage::Default>& get(){
return std::get<parameter_key_pack_index<literal, literals...>::value>(value_);
}
@@ -247,7 +246,7 @@ public:
literal, literals...
>::value
, T...>::type
- , encode::Native<storage::Default>>& get() const {
+ , encode::Native, storage::Default>& get() const {
return std::get<parameter_key_pack_index<literal, literals...>::value>(value_);
}
@@ -260,21 +259,21 @@ public:
};
template<typename... T>
-class data<schema::Tuple<T...>, encode::Native<storage::Default>> {
+class data<schema::Tuple<T...>, encode::Native, storage::Default> {
private:
- std::tuple<data<T,encode::Native<storage::Default>>...> value_;
+ std::tuple<data<T,encode::Native, storage::Default>...> value_;
public:
data() = default;
SAW_DEFAULT_COPY(data);
SAW_DEFAULT_MOVE(data);
template<size_t i>
- data<typename parameter_pack_type<i,T...>::type, encode::Native<storage::Default>>& get(){
+ data<typename parameter_pack_type<i,T...>::type, encode::Native, storage::Default>& get(){
return std::get<i>(value_);
}
template<size_t i>
- const data<typename parameter_pack_type<i,T...>::type, encode::Native<storage::Default>>& get() const{
+ const data<typename parameter_pack_type<i,T...>::type, encode::Native, storage::Default>& get() const{
return std::get<i>(value_);
}
@@ -284,11 +283,11 @@ public:
};
template<typename T, size_t Dim>
-class data<schema::Array<T,Dim>, encode::Native<storage::Default>> {
+class data<schema::Array<T,Dim>, encode::Native, storage::Default> {
private:
// data<schema::FixedArray<schema::UInt64, Dim>> dims_;
std::array<uint64_t, Dim> dims_;
- std::vector<data<T, encode::Native<storage::Default>>> value_;
+ std::vector<data<T, encode::Native, storage::Default>> value_;
uint64_t get_full_size() const {
uint64_t s = 1;
@@ -320,7 +319,7 @@ class data<schema::Array<T,Dim>, encode::Native<storage::Default>> {
}
template<size_t i = 0>
- error_or<void> add(saw::data<T,encode::Native<storage::Default>> data){
+ error_or<void> add(saw::data<T,encode::Native, storage::Default> data){
/** @todo
* Generally the last dimension can always accept a element so to say.
* Changing the others would require moving data due to the stride changing.
@@ -355,29 +354,29 @@ class data<schema::Array<T,Dim>, encode::Native<storage::Default>> {
static_assert(sizeof...(Dims)==Dim, "Argument size must be equal to the Dimension");
}
- data<T, encode::Native<storage::Default>>& at(const std::array<uint64_t, Dim>& ind){
+ data<T, encode::Native, storage::Default>& at(const std::array<uint64_t, Dim>& ind){
return value_.at(this->get_flat_index(ind));
}
- const data<T, encode::Native<storage::Default>>& at(const std::array<uint64_t, Dim>& ind) const {
+ const data<T, encode::Native, storage::Default>& at(const std::array<uint64_t, Dim>& ind) const {
return value_.at(this->get_flat_index(ind));
}
template<std::integral... Dims>
- data<T, encode::Native<storage::Default>>& at(Dims... i){
+ data<T, encode::Native, storage::Default>& at(Dims... i){
return value_.at(this->get_flat_index(std::array<uint64_t, Dim>{static_cast<uint64_t>(i)...}));
}
template<std::integral... Dims>
- const data<T, encode::Native<storage::Default>>& at(Dims... i) const {
+ const data<T, encode::Native, storage::Default>& at(Dims... i) const {
return value_.at(this->get_flat_index(std::array<uint64_t, Dim>{static_cast<uint64_t>(i)...}));
}
- data<T,encode::Native<storage::Default>>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i){
+ data<T,encode::Native, storage::Default>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i){
return value_.at(this->get_flat_index(i));
}
- const data<T,encode::Native<storage::Default>>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i)const{
+ const data<T,encode::Native, storage::Default>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i)const{
return value_.at(this->get_flat_index(i));
}
@@ -425,39 +424,39 @@ private:
};
template<typename T, uint64_t... D>
-class data<schema::FixedArray<T,D...>, encode::Native<storage::Default>> {
+class data<schema::FixedArray<T,D...>, encode::Native, storage::Default> {
private:
- //using inner_type = std::array<data<T, encode::Native<storage::Default>>, multiply_helper<Dims...>::value>;
+ //using inner_type = std::array<data<T, encode::Native, storage::Default>, multiply_helper<Dims...>::value>;
//std::unique_ptr<inner_type> value_;
- using ArrayT = std::array<data<T, encode::Native<storage::Default>>, ct_multiply<uint64_t, D...>::value>;
+ using ArrayT = std::array<data<T, encode::Native, storage::Default>, ct_multiply<uint64_t, D...>::value>;
ArrayT value_;
public:
data() = default;
- data<T, encode::Native<storage::Default>>& at(const std::array<uint64_t, sizeof...(D)>& ind){
+ data<T, encode::Native, storage::Default>& at(const std::array<uint64_t, sizeof...(D)>& ind){
return value_.at(this->get_flat_index(ind));
}
- const data<T, encode::Native<storage::Default>>& at(const std::array<uint64_t, sizeof...(D)>& ind) const {
+ const data<T, encode::Native, storage::Default>& at(const std::array<uint64_t, sizeof...(D)>& ind) const {
return value_.at(this->get_flat_index(ind));
}
template<std::integral... Dims>
- data<T, encode::Native<storage::Default>>& at(Dims... i) {
+ data<T, encode::Native, storage::Default>& at(Dims... i) {
return value_.at(this->get_flat_index({i...}));
}
template<std::integral... Dims>
- const data<T, encode::Native<storage::Default>>& at(Dims... i) const {
+ const data<T, encode::Native, storage::Default>& at(Dims... i) const {
return value_.at(this->get_flat_index({i...}));
}
- data<T, encode::Native<storage::Default>>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i){
+ data<T, encode::Native, storage::Default>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i){
return value_.at(this->get_flat_index(i));
}
- const data<T, encode::Native<storage::Default>>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i)const{
+ const data<T, encode::Native, storage::Default>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i)const{
return value_.at(this->get_flat_index(i));
}
@@ -491,7 +490,7 @@ private:
* Data type representing string.
*/
template<>
-class data<schema::String, encode::Native<storage::Default>> {
+class data<schema::String, encode::Native, storage::Default> {
private:
/**
* The native way to represent strings.