summaryrefslogtreecommitdiff
path: root/c++/codec/data.h
diff options
context:
space:
mode:
Diffstat (limited to 'c++/codec/data.h')
-rw-r--r--c++/codec/data.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/c++/codec/data.h b/c++/codec/data.h
index 8ff06dc..129e704 100644
--- a/c++/codec/data.h
+++ b/c++/codec/data.h
@@ -243,6 +243,7 @@ private:
std::size_t stride = 1;
for(std::size_t iter = 0; iter < Dim; ++iter){
+ assert(i.at(iter) < dims_.at(iter));
s += i.at(iter) * stride;
stride *= dims_.at(iter);
}
@@ -251,6 +252,57 @@ private:
}
};
+template<typename T, std::size_t... D>
+class data<schema::FixedArray<T,D...>, encode::Native> {
+private:
+ std::vector<data<T, encode::Native>> value_;
+
+public:
+ data(){
+ data_.resize(ct_multiply<std::size_t, D...>::value);
+ std::fill(data_.begin(), data_.end(), 0ul);
+ }
+
+ data<T, encode::Native>& at(const std::array<std::size_t, sizeof...(D)>& ind){
+ return value_.at(this->get_flat_index(ind));
+ }
+
+ const data<T, encode::Native>& at(const std::array<std::size_t, sizeof...(D)>& 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({i...}));
+ }
+
+ template<std::integral... Dims>
+ const data<T, encode::Native>& at(Dims... i) const {
+ return value_.at(this->get_flat_index({i...}));
+ }
+
+ template<std::size_t i>
+ std::size_t get_dim_size() const {
+ return parameter_pack_value<i, std::size_t, D...>::value;
+ }
+private:
+ std::size_t get_flat_index(const std::array<std::size_t, sizeof...(D)>& i) const {
+ std::size_t s = 0;
+
+ std::size_t stride = 1;
+
+ constexpr static std::array<std::size_t, sizeof...(D)> dims_{D...};
+
+ for(std::size_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<>
class data<schema::String, encode::Native> {
private: