diff options
author | Claudius Holeksa <mail@keldu.de> | 2023-06-15 15:16:00 +0200 |
---|---|---|
committer | Claudius Holeksa <mail@keldu.de> | 2023-06-15 15:16:00 +0200 |
commit | 4260ffa31e58129ad6822eccce8a81ab750bd8b7 (patch) | |
tree | 9f454afe7aea9aa710079715d34ad2348baeec57 /src/codec/data.h | |
parent | 63f6f188aef9b24a771b677daa60ee8f1cb2052b (diff) |
c++,codec: Adding missing dependency for tests and minor change to
unsigned arg
Diffstat (limited to 'src/codec/data.h')
-rw-r--r-- | src/codec/data.h | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/src/codec/data.h b/src/codec/data.h index 5e6fd25..7ed672b 100644 --- a/src/codec/data.h +++ b/src/codec/data.h @@ -3,6 +3,11 @@ #include <forstio/core/common.h> #include <forstio/core/templates.h> +#include <cassert> + +#include <array> +#include <concepts> +#include <variant> #include <vector> #include "schema.h" @@ -159,22 +164,61 @@ public: template<typename T, size_t Dim> class data<schema::Array<T,Dim>, encode::Native> { private: + std::array<std::size_t, Dim> dims_; std::vector<data<T, encode::Native>> value_; + + std::size_t get_full_size() const { + std::size_t s = 1; + + for(std::size_t iter = 0; iter < Dim; ++iter){ + assert(dims_.at(iter) > 0); + s *= dims_.at(iter); + } + + return s; + } + + std::size_t get_index(const std::array<std::size_t, Dim>& i) const { + std::size_t s = 0; + + std::size_t stride = 1; + + for(std::size_t iter = 0; iter < Dim; ++iter){ + s += i.at(iter) * stride; + stride *= dims_.at(iter); + } + + return s; + } public: data() = default; SAW_DEFAULT_COPY(data); SAW_DEFAULT_MOVE(data); - data(size_t size_){ - value_.resize(size_); + template<std::integral... Dims> + data(Dims... size_): + dims_{size_...}, + value_{} + { + for(auto& iter : dims_){ + assert(iter > 0); + } + static_assert(sizeof...(Dims)==Dim, "Argument size must be equal to the Dimension"); + value_.resize(get_full_size()); } - data<T, encode::Native>& at(size_t i){ - return value_.at(i); + template<std::integral... Dims> + data<T, encode::Native>& at(Dims... i){ + return value_.at(this->get_index({i...})); + } + + template<std::integral... Dims> + const data<T, encode::Native>& at(Dims... i) const { + return value_.at(this->get_index({i...})); } - const data<T, encode::Native>& at(size_t i) const { - return value_.at(i); + std::size_t get_dim_size(std::size_t i) const { + return dims_.at(i); } size_t size() const { return value_.size();} |