From 4a4bfa2ccf179e15a5b8e98f398c16f693ddd3e5 Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Sat, 7 Sep 2024 19:25:12 +0200 Subject: Fixing raw data encoding. Prep for C layer --- modules/codec/c++/data_raw.hpp | 190 +++++++++++++++++++++++++++++++------- modules/codec/c++/schema_meta.hpp | 6 ++ modules/codec/tests/data_raw.cpp | 26 ++++++ 3 files changed, 191 insertions(+), 31 deletions(-) diff --git a/modules/codec/c++/data_raw.hpp b/modules/codec/c++/data_raw.hpp index 88a0ee2..37e56d9 100644 --- a/modules/codec/c++/data_raw.hpp +++ b/modules/codec/c++/data_raw.hpp @@ -123,6 +123,77 @@ public: } }; +template +class data>, encode::NativeRaw> { +public: + using ReferencedSchema = schema::Primitive; + using Schema = schema::Ref; + using MetaSchema = typename meta_schema::MetaSchema; +private: + ref::type > value_; +public: + data(ref::type > value__): + value_{value__} + {} + + SAW_DEFAULT_COPY(data); + SAW_FORBID_MOVE(data); + + void set(typename native_data_type::type val){ + value_() = val; + } + + typename native_data_type::type get() const { + return value_(); + } + + data operator*(const data& rhs)const{ + return {get() * rhs.get()}; + } + + data operator/(const data& rhs)const{ + return {get() / rhs.get()}; + } + + data operator+(const data& rhs)const{ + return {get() + rhs.get()}; + } + + data& operator+=(const data& rhs)const{ + value_ += rhs.get(); + return *this; + } + + data& operator-=(const data& rhs)const{ + value_ -= rhs.get(); + return *this; + } + + data operator-(const data& rhs)const{ + return {get() - rhs.get()}; + } + + template + bool operator==(const data& rhs)const{ + return get() == rhs.get(); + } + + template + bool operator==(const data& rhs)const{ + return get() == rhs.get(); + } + + template + bool operator<(const data& rhs) const { + return get() < rhs.get(); + } + + template + bool operator<(const data& rhs) const { + return get() < rhs.get(); + } +}; + /** * Mixed precision class for native formats */ @@ -223,7 +294,7 @@ private: template struct init_helper { - static void apply(std::tuple...>& val, data&& init){ + static void apply(std::tuple...>& val, data&& init){ auto& val_i = val.template get(); auto& init_i = init.template get(); @@ -294,7 +365,7 @@ private: template struct init_helper { - static void apply(std::tuple...>& val, data&& init){ + static void apply(std::tuple...>& val, data&& init){ auto& val_i = val.template get(); auto& init_i = init.template get(); @@ -337,20 +408,10 @@ class data, encode::NativeRaw> { using Schema = schema::Array; using MetaSchema = typename meta_schema::MetaSchema; - using DataType = std::conditional< - is_primitive::value, - typename native_data_type::type - >; private: // data> dims_; std::array dims_; - std::vector< - std::conditional< - is_primitive::value, - typename native_data_type::type, - data - > - > value_; + std::vector::Type> value_; uint64_t get_full_size() const { uint64_t s = 1; @@ -425,30 +486,32 @@ class data, encode::NativeRaw> { static_assert(sizeof...(Dims)==Dim, "Argument size must be equal to the Dimension"); } - data& at(const std::array& ind){ - return value_.at(this->get_flat_index(ind)); + data, encode::NativeRaw> at(const std::array& ind){ + return {value_.at(this->get_flat_index(ind))}; } - const data& at(const std::array& ind) const { - return value_.at(this->get_flat_index(ind)); + const data, encode::NativeRaw> 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(std::array{static_cast(i)...})); + data, encode::NativeRaw> at(Dims... 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(std::array{static_cast(i)...})); + const data, encode::NativeRaw> at(Dims... i) const { + return {value_.at(this->get_flat_index(std::array{static_cast(i)...}))}; } - data& at(const data>& i){ - return value_.at(this->get_flat_index(i)); + template + data,encode::NativeRaw> at(const data, Encoding>& i){ + return {value_.at(this->get_flat_index(i))}; } - const data& at(const data>& i)const{ - return value_.at(this->get_flat_index(i)); + template + const data,encode::NativeRaw> at(const data, Encoding>& i)const{ + return {value_.at(this->get_flat_index(i))}; } std::size_t get_dim_size(uint64_t i) const { @@ -457,18 +520,13 @@ class data, encode::NativeRaw> { size_t size() const { return value_.size();} - data> get_dims() const { + data, encode::NativeRaw> get_dims() const { return {dims_}; } private: 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; @@ -494,5 +552,75 @@ private: } }; +template +class data, encode::NativeRaw> { +public: + using Schema = schema::FixedArray; + using MetaSchema = typename meta_schema::MetaSchema; +private: + //using inner_type = std::array, multiply_helper::value>; + //std::unique_ptr value_; + using ArrayT = std::array::Type, ct_multiply::value>; + ArrayT value_; + +public: + data() = default; + data(data){} + data(const std::array, ct_multiply::value>& value__): + value_{value__} + {} + + data, encode::NativeRaw> at(const std::array& ind){ + return {value_.at(this->get_flat_index(ind))}; + } + + const data, encode::Native> at(const std::array& ind) const { + return {value_.at(this->get_flat_index(ind))}; + } + + template + data, encode::Native> at(Dims... i) { + return {value_.at(this->get_flat_index({i...}))}; + } + + template + const data, encode::Native> at(Dims... i) const { + return {value_.at(this->get_flat_index({i...}))}; + } + + data, encode::Native> at(const data, encode::NativeRaw>& i){ + return {value_.at(this->get_flat_index(i))}; + } + + const data, encode::Native> at(const data, encode::NativeRaw>& i)const{ + return {value_.at(this->get_flat_index(i))}; + } + + template + uint64_t get_dim_size() const { + return parameter_pack_value::value; + } + + data, encode::NativeRaw> get_dims() const { + return {std::array{D...}}; + } +private: + uint64_t get_flat_index(const std::array& i) const { + uint64_t s = 0; + + uint64_t stride = 1; + + constexpr static std::array 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; + } +}; + } diff --git a/modules/codec/c++/schema_meta.hpp b/modules/codec/c++/schema_meta.hpp index 9b111e3..80b6686 100644 --- a/modules/codec/c++/schema_meta.hpp +++ b/modules/codec/c++/schema_meta.hpp @@ -33,6 +33,12 @@ struct meta_schema, schema::Prim using MetaSchema = schema::Void; }; +template +struct meta_schema> { + using MetaSchema = schema::Void; + using Schema = schema::Ref; +}; + template struct meta_schema> { using MetaSchema = schema::Void; diff --git a/modules/codec/tests/data_raw.cpp b/modules/codec/tests/data_raw.cpp index 99d55a8..11e2c5e 100644 --- a/modules/codec/tests/data_raw.cpp +++ b/modules/codec/tests/data_raw.cpp @@ -4,7 +4,33 @@ namespace { namespace sch { using namespace saw::schema; + +using Int32Array = Array< + Int32 +>; } +SAW_TEST("Data NativeRaw/Array of Primitives"){ + using namespace saw; + + data prim{4u}; + prim.at(1u).set(0); + + auto a = prim.at(1u); + + a.set(5); + + auto b = prim.at(1u); + // Check if it's a reference being manipulated + SAW_EXPECT(a.get() == 5, "'a' has unexpected value."); + SAW_EXPECT(b.get() == 5, "'b' has unexpected value."); + + auto c = prim.at(1u); + c.set(10); + + SAW_EXPECT(a.get() == 10, "'a' has unexpected value."); + SAW_EXPECT(b.get() == 10, "'b' has unexpected value."); + SAW_EXPECT(c.get() == 10, "'c' has unexpected value."); +} } -- cgit v1.2.3