From 53ef76b722fe836e1679a9f0cbc3ef7717dce453 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Mon, 15 Jan 2024 15:05:04 +0100 Subject: codec: Adding some convenience access --- modules/codec/c++/data.h | 84 ++++++++++++++++++++++++++++--------------- modules/codec/tests/codec.cpp | 17 +++++---- 2 files changed, 66 insertions(+), 35 deletions(-) (limited to 'modules') diff --git a/modules/codec/c++/data.h b/modules/codec/c++/data.h index eb24841..ba8f424 100644 --- a/modules/codec/c++/data.h +++ b/modules/codec/c++/data.h @@ -181,13 +181,13 @@ public: template class data, encode::Native> { private: - std::array dims_; + std::array dims_; std::vector> value_; - std::size_t get_full_size() const { - std::size_t s = 1; + uint64_t get_full_size() const { + uint64_t s = 1; - for(std::size_t iter = 0; iter < Dim; ++iter){ + for(uint64_t iter = 0; iter < Dim; ++iter){ assert(dims_.at(iter) > 0); s *= dims_.at(iter); } @@ -199,7 +199,7 @@ class data, encode::Native> { SAW_DEFAULT_COPY(data); SAW_DEFAULT_MOVE(data); - data(const std::array& i): + data(const std::array& i): dims_{i}, value_{} { @@ -252,12 +252,20 @@ class data, encode::Native> { template data& at(Dims... i){ - return value_.at(this->get_flat_index({static_cast(i)...})); + return value_.at(this->get_flat_index({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({static_cast(i)...})); + } + + data& at(const data>& i){ + return value_.at(this->get_flat_index(i)); + } + + const data& at(const data>& i)const{ + return value_.at(this->get_flat_index(i)); } std::size_t get_dim_size(std::size_t i) const { @@ -266,15 +274,23 @@ class data, encode::Native> { size_t size() const { return value_.size();} -private: - std::size_t get_flat_index(const std::array& i) const { - std::size_t s = 0; + data> get_dims() const { + return {dims_}; + } + +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 { + uint64_t s = 0; - std::size_t stride = 1; + uint64_t stride = 1; - for(std::size_t iter = 0; iter < Dim; ++iter){ - assert(i.at(iter) < dims_.at(iter)); - s += i.at(iter) * stride; + for(uint64_t iter = 0; iter < Dim; ++iter){ + assert(i.at(iter).get() < dims_.at(iter)); + s += i.at(iter).get() * stride; stride *= dims_.at(iter); } @@ -282,23 +298,29 @@ private: } }; -template +template class data, encode::Native> { private: //using inner_type = std::array, multiply_helper::value>; //std::unique_ptr value_; - std::vector> value_; + using ArrayT = std::array, ct_multiply::value>; + ArrayT value_; public: - data(){ - value_.resize(ct_multiply::value); + data() = default; + + data(const std::array::type, ct_multiply::value>& data) requires (is_primitive::value) + { + for(uint64_t i = 0; i < ct_multiply::value; ++i){ + value_.at(i).set(data.at(i)); + } } - - 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)); } @@ -312,19 +334,23 @@ public: return value_.at(this->get_flat_index({i...})); } - template - std::size_t get_dim_size() const { - return parameter_pack_value::value; + template + uint64_t get_dim_size() const { + return parameter_pack_value::value; + } + + data> get_dims() const { + return {std::array{D...}}; } private: - std::size_t get_flat_index(const std::array& i) const { - std::size_t s = 0; + uint64_t get_flat_index(const std::array& i) const { + uint64_t s = 0; - std::size_t stride = 1; + uint64_t stride = 1; - constexpr static std::array dims_{D...}; + constexpr static std::array dims_{D...}; - for(std::size_t iter = 0; iter < sizeof...(D); ++iter){ + 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); diff --git a/modules/codec/tests/codec.cpp b/modules/codec/tests/codec.cpp index e2a9958..652c55d 100644 --- a/modules/codec/tests/codec.cpp +++ b/modules/codec/tests/codec.cpp @@ -81,13 +81,16 @@ SAW_TEST("One dimensional Array Add"){ SAW_TEST("Two Dimensional Array") { using namespace saw; - data arr{10,50u}; + data arr{10,30u}; + + int expected_sum = (300 * 301) / 2; int bar = 0; for(size_t i = 0; i < arr.get_dim_size(0); ++i){ for(size_t j = 0; j < arr.get_dim_size(1); ++j){ - arr.at(i,j).set(bar++); + ++bar; + arr.at(i,j).set(bar); } } int sum = 0; @@ -96,20 +99,22 @@ SAW_TEST("Two Dimensional Array") { sum += arr.at(i,j).get(); } } - SAW_EXPECT(sum == 124750, std::to_string(sum) + " is not 124750. Expected that data stays correct"); + SAW_EXPECT(sum == expected_sum, std::to_string(sum) + " is not "+ std::to_string(expected_sum) + ". Expected that data stays correct"); } SAW_TEST("Three Dimensional Array") { using namespace saw; - data arr{10,10u,5}; + data arr{10,10u,3}; + int expected_sum = (300 * 301) / 2; int bar = 0; for(size_t i = 0; i < arr.get_dim_size(0); ++i){ for(size_t j = 0; j < arr.get_dim_size(1); ++j){ for(size_t k = 0; k < arr.get_dim_size(2); ++k){ - arr.at(i,j,k).set(bar++); + ++bar; + arr.at(i,j,k).set(bar); } } } @@ -121,7 +126,7 @@ SAW_TEST("Three Dimensional Array") { } } } - SAW_EXPECT(sum == 124750, std::to_string(sum) + " is not 124750. Expected that data stays correct"); + SAW_EXPECT(sum == expected_sum, std::to_string(sum) + " is not "+ std::to_string(expected_sum) + ". Expected that data stays correct"); } SAW_TEST("KelSimple UInt16 write"){ -- cgit v1.2.3