diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-06-12 15:04:42 +0200 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-06-12 15:04:42 +0200 |
commit | e4e49a117702945066e3e279fa0f005200400cb7 (patch) | |
tree | 3e9bab0804083461c9ef0732a47abba1fb8a9fdf /modules/codec/c++/data.hpp | |
parent | 6831edddd22d2d8dbb73c88fb612c0bdd5b8ba19 (diff) |
Separated Encoding and Storage approaches
Diffstat (limited to 'modules/codec/c++/data.hpp')
-rw-r--r-- | modules/codec/c++/data.hpp | 91 |
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. |