diff options
Diffstat (limited to 'modules/codec/c++/data.hpp')
-rw-r--r-- | modules/codec/c++/data.hpp | 194 |
1 files changed, 95 insertions, 99 deletions
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp index 75c611c..01eddb6 100644 --- a/modules/codec/c++/data.hpp +++ b/modules/codec/c++/data.hpp @@ -167,6 +167,11 @@ public: return {get() - rhs.get()}; } + data<Schema, encode::Native>& operator++() { + set(get() + static_cast<typename native_data_type<Schema>::type>(1)); + return *this; + } + template<typename Enc> bool operator==(const data<Schema, Enc>& rhs)const{ return get() == rhs.get(); @@ -271,6 +276,74 @@ public: } }; +template<typename T, uint64_t... D> +class data<schema::FixedArray<T,D...>, encode::Native> { +public: + using Schema = schema::FixedArray<T,D...>; + using MetaSchema = typename meta_schema<Schema>::MetaSchema; +private: + //using inner_type = std::array<data<T, encode::Native>, multiply_helper<Dims...>::value>; + //std::unique_ptr<inner_type> value_; + using ArrayT = std::array<data<T, encode::Native>, ct_multiply<uint64_t, D...>::value>; + ArrayT value_; + +public: + data() = default; + data(data<MetaSchema, encode::Native>){} + data(const std::array<data<T, encode::Native>, ct_multiply<uint64_t,D...>::value>& value__): + value_{value__} + {} + + data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind){ + return value_.at(this->get_flat_index(ind)); + } + + const data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind) const { + return value_.at(this->get_flat_index(ind)); + } + + data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) { + return value_.at(this->get_flat_index({i.get()})); + } + + const data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) const { + return value_.at(this->get_flat_index({i.get()})); + } + + data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i){ + return value_.at(this->get_flat_index(i)); + } + + const data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i)const{ + return value_.at(this->get_flat_index(i)); + } + + template<uint64_t i> + uint64_t get_dim_size() const { + return parameter_pack_value<i, uint64_t, D...>::value; + } + + data<schema::FixedArray<schema::UInt64, sizeof...(D)>> get_dims() const { + return {std::array<uint64_t, sizeof...(D)>{D...}}; + } +private: + uint64_t get_flat_index(const std::array<uint64_t, sizeof...(D)>& i) const { + uint64_t s = 0; + + uint64_t stride = 1; + + constexpr static std::array<uint64_t, sizeof...(D)> dims_{D...}; + + for(uint64_t iter = 0; iter < sizeof...(D); ++iter){ + assert(i.at(iter) < dims_.at(iter)); + s += i.at(iter) * stride; + stride *= dims_.at(iter); + } + + return s; + } +}; + /* template<typename T, typename N> class data<schema::Ref<schema::Primitive<T,N>>, encode::Native { @@ -427,7 +500,7 @@ public: /** * Return the amount of members. */ - constexpr size_t size() const { + constexpr uint64_t size() const { return sizeof...(T); } }; @@ -474,7 +547,7 @@ public: return std::get<i>(value_); } - constexpr size_t size() const { + constexpr uint64_t size() const { return sizeof...(T); } }; @@ -609,15 +682,17 @@ class data<schema::Array<T,Dim>, encode::Native> { const data<T, encode::Native>& 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>& 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>& 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>& at(data<schema::UInt64, encode::Native> i) { + data<schema::FixedArray<schema::UInt64,Dim>, encode::Native> i_arr; + i_arr.at(0u) = i; + return at(i_arr); + } + + const data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) const { + data<schema::FixedArray<schema::UInt64,Dim>, encode::Native> i_arr; + i_arr.at(0u) = i; + return at(i_arr); } data<T,encode::Native>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i){ @@ -632,7 +707,7 @@ class data<schema::Array<T,Dim>, encode::Native> { return dims_.at(i); } - size_t size() const { return value_.size();} + data<schema::UInt64,encode::Native> size() const { return {value_.size()};} data<schema::FixedArray<schema::UInt64, Dim>> get_dims() const { return {dims_}; @@ -662,7 +737,7 @@ private: static_assert(always_false<V>, "Cases exhausted"); } }(i.at(iter)); - assert(ind < dims_.at(iter)); + assert(ind < dims_.at({iter})); s += ind * stride; stride *= dims_.at(iter); } @@ -671,85 +746,6 @@ private: } }; -template<typename T, uint64_t... D> -class data<schema::FixedArray<T,D...>, encode::Native> { -public: - using Schema = schema::FixedArray<T,D...>; - using MetaSchema = typename meta_schema<Schema>::MetaSchema; -private: - //using inner_type = std::array<data<T, encode::Native>, multiply_helper<Dims...>::value>; - //std::unique_ptr<inner_type> value_; - using ArrayT = std::array<data<T, encode::Native>, ct_multiply<uint64_t, D...>::value>; - ArrayT value_; - -public: - data() = default; - data(data<MetaSchema, encode::Native>){} - data(const std::array<data<T, encode::Native>, ct_multiply<uint64_t,D...>::value>& value__): - value_{value__} - {} - - data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind){ - return value_.at(this->get_flat_index(ind)); - } - - const data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind) const { - return value_.at(this->get_flat_index(ind)); - } - - template<typename... Sch> - data<T, encode::Native>& at(data<Sch, encode::Native>... i) { - return value_.at(this->get_flat_index({i...})); - } - - template<typename... Sch> - const data<T, encode::Native>& at(data<Sch, encode::Native>... i) const { - return value_.at(this->get_flat_index({i...})); - } - - template<std::integral... Dims> - data<T, encode::Native>& at(Dims... i) { - return value_.at(this->get_flat_index({i...})); - } - - template<std::integral... Dims> - const data<T, encode::Native>& at(Dims... i) const { - return value_.at(this->get_flat_index({i...})); - } - - data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i){ - return value_.at(this->get_flat_index(i)); - } - - const data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i)const{ - return value_.at(this->get_flat_index(i)); - } - - template<uint64_t i> - uint64_t get_dim_size() const { - return parameter_pack_value<i, uint64_t, D...>::value; - } - - data<schema::FixedArray<schema::UInt64, sizeof...(D)>> get_dims() const { - return {std::array<uint64_t, sizeof...(D)>{D...}}; - } -private: - uint64_t get_flat_index(const std::array<uint64_t, sizeof...(D)>& i) const { - uint64_t s = 0; - - uint64_t stride = 1; - - constexpr static std::array<uint64_t, sizeof...(D)> dims_{D...}; - - for(uint64_t iter = 0; iter < sizeof...(D); ++iter){ - assert(i.at(iter) < dims_.at(iter)); - s += i.at(iter) * stride; - stride *= dims_.at(iter); - } - - return s; - } -}; /** * Data type representing string. @@ -781,8 +777,8 @@ public: /** * Return the length of the string. */ - std::size_t size() const { - return value_.size(); + data<schema::UInt64, encode::Native> size() const { + return {value_.size()}; } /** @@ -795,22 +791,22 @@ public: /** * Get a char reference at position i. */ - char& at(size_t i) { + char& at(uint64_t i) { return value_.at(i); } /** * Get a char reference at position i. */ - const char& at(size_t i) const { + const char& at(uint64_t i) const { return value_.at(i); } - char get_at(size_t i) const{ + char get_at(uint64_t i) const{ return value_.at(i); } - void set_at(size_t i, char val){ + void set_at(uint64_t i, char val){ value_.at(i) = val; } @@ -828,8 +824,8 @@ public: return false; } bool eq = true; - for(uint64_t i = 0; i < size(); ++i){ - eq = eq && (get_at(i) == rhs.get_at(i)); + for(data<schema::UInt64, encode::Native> i = 0; i < size(); ++i){ + eq = eq && (get_at(i.get()) == rhs.get_at(i.get())); } return eq; } |