diff options
Diffstat (limited to 'modules/codec/c++/data.hpp')
-rw-r--r-- | modules/codec/c++/data.hpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp index a10ee9d..2adb5b7 100644 --- a/modules/codec/c++/data.hpp +++ b/modules/codec/c++/data.hpp @@ -126,8 +126,36 @@ public: bool operator<(const data<schema::Primitive<T,N>, Enc>& rhs) const { return get() < rhs.get(); } + + /** + * Casts + */ + template<typename Target> + data<Target, encode::Native> cast_to(){ + auto raw_to = static_cast<typename saw::native_data_type<Target>::type>(value_); + return {raw_to}; + } }; +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>{ +public: + using Schema = schema::MixedPrecision<schema::Primitive<TA,NA>, schema::Primitive<TB,NB>>; +private: + data<typename Schema::StorageSchema, encode::Native> value_; +public: + data():value_{}{} + + data(typename saw::native_data_type<typename Schema::InterfaceSchema>::type val__):value_{static_cast<typename saw::native_data_type<typename Schema::StorageSchema>::type>(val__)}{} + + typename saw::native_data_type<typename Schema::InterfaceSchema>::type get() const { + return value_.template cast_to<typename Schema::InterfaceSchema>().get(); + } + + void set(typename saw::native_data_type<typename Schema::InterfaceSchema>::type val){ + value_.set(val.template cast_to<typename Schema::StorageSchema>().get()); + } +}; template<typename... T, string_literal... literals> class data<schema::Union<schema::Member<T, literals>...>, encode::Native> { |