From 6e5178260017e492921090aea95f0120d9f5e66d Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 9 Apr 2024 14:47:40 +0200 Subject: codec: Fixed some fixedArray issues --- modules/codec/c++/data.hpp | 128 +++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 57 deletions(-) (limited to 'modules') diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp index 2cf2a96..5ad4e3f 100644 --- a/modules/codec/c++/data.hpp +++ b/modules/codec/c++/data.hpp @@ -82,6 +82,53 @@ private: static_assert(always_false, "Type not supported"); }; +template +class data, encode::Native> { +private: + typename native_data_type>::type value_; +public: + data():value_{}{} + + SAW_DEFAULT_COPY(data); + SAW_DEFAULT_MOVE(data); + + data(typename native_data_type>::type value__): + value_{std::move(value__)}{} + + void set(typename native_data_type>::type val){ + value_ = val; + } + + typename native_data_type>::type get() const {return value_;} + + data, encode::Native> operator*(const data, encode::Native>& rhs)const{ + return {get() * rhs.get()}; + } + + data, encode::Native> operator/(const data, encode::Native>& rhs)const{ + return {get() / rhs.get()}; + } + + data, encode::Native> operator+(const data, encode::Native>& rhs)const{ + return {get() + rhs.get()}; + } + + data, encode::Native> operator-(const data, encode::Native>& rhs)const{ + return {get() - rhs.get()}; + } + + template + bool operator==(const data, Enc>& rhs)const{ + return get() == rhs.get(); + } + + template + bool operator<(const data, Enc>& rhs) const { + return get() < rhs.get(); + } +}; + + template class data...>, encode::Native> { private: @@ -182,6 +229,7 @@ public: template class data, encode::Native> { private: + // data> dims_; std::array dims_; std::vector> value_; @@ -250,22 +298,22 @@ class data, encode::Native> { static_assert(sizeof...(Dims)==Dim, "Argument size must be equal to the Dimension"); } - data& at(const std::array& ind){ + data& at(const std::array& ind){ return value_.at(this->get_flat_index(ind)); } - const data& at(const std::array& ind) const { + const data& at(const std::array& ind) const { return value_.at(this->get_flat_index(ind)); } template data& at(Dims... i){ - return value_.at(this->get_flat_index({static_cast(i)...})); + return value_.at(this->get_flat_index(std::array{static_cast(i)...})); } template const data& at(Dims... i) const { - return value_.at(this->get_flat_index({static_cast(i)...})); + return value_.at(this->get_flat_index(std::array{static_cast(i)...})); } data& at(const data>& i){ @@ -287,19 +335,31 @@ class data, encode::Native> { } private: - uint64_t get_flat_index(const std::array& i) const { - return get_flat_index(data>{i}); - } - - uint64_t get_flat_index(const data>& i) const { + template + uint64_t get_flat_index(const U& i) const { + static_assert( + std::is_same_v>> or + std::is_same_v>, + "Unsupported type" + ); assert(value_.size() == get_full_size()); uint64_t s = 0; uint64_t stride = 1; for(uint64_t iter = 0; iter < Dim; ++iter){ - assert(i.at(iter).get() < dims_.at(iter)); - s += i.at(iter).get() * stride; + uint64_t ind = [](auto val) -> uint64_t { + using V = std::decay_t; + if constexpr (std::is_same_v>){ + return val.get(); + }else if constexpr (std::is_same_v){ + return val; + }else{ + static_assert(always_false, "Cases exhausted"); + } + }(i.at(iter)); + assert(ind < dims_.at(iter)); + s += ind * stride; stride *= dims_.at(iter); } @@ -413,51 +473,5 @@ public: } }; -template -class data, encode::Native> { -private: - typename native_data_type>::type value_; -public: - data():value_{}{} - - SAW_DEFAULT_COPY(data); - SAW_DEFAULT_MOVE(data); - - data(typename native_data_type>::type value__): - value_{std::move(value__)}{} - - void set(typename native_data_type>::type val){ - value_ = val; - } - - typename native_data_type>::type get() const {return value_;} - - data, encode::Native> operator*(const data, encode::Native>& rhs)const{ - return {get() * rhs.get()}; - } - - data, encode::Native> operator/(const data, encode::Native>& rhs)const{ - return {get() / rhs.get()}; - } - - data, encode::Native> operator+(const data, encode::Native>& rhs)const{ - return {get() + rhs.get()}; - } - - data, encode::Native> operator-(const data, encode::Native>& rhs)const{ - return {get() - rhs.get()}; - } - - template - bool operator==(const data, Enc>& rhs)const{ - return get() == rhs.get(); - } - - template - bool operator<(const data, Enc>& rhs) const { - return get() < rhs.get(); - } -}; - } -- cgit v1.2.3