summaryrefslogtreecommitdiff
path: root/src/codec/data.h
diff options
context:
space:
mode:
authorClaudius Holeksa <mail@keldu.de>2023-06-15 15:16:00 +0200
committerClaudius Holeksa <mail@keldu.de>2023-06-15 15:16:00 +0200
commit4260ffa31e58129ad6822eccce8a81ab750bd8b7 (patch)
tree9f454afe7aea9aa710079715d34ad2348baeec57 /src/codec/data.h
parent63f6f188aef9b24a771b677daa60ee8f1cb2052b (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.h56
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();}