diff options
Diffstat (limited to 'c++/codec')
-rw-r--r-- | c++/codec/data.h | 52 | ||||
-rw-r--r-- | c++/codec/schema.h | 7 |
2 files changed, 59 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: diff --git a/c++/codec/schema.h b/c++/codec/schema.h index 2f63fe9..ba6dd4c 100644 --- a/c++/codec/schema.h +++ b/c++/codec/schema.h @@ -42,6 +42,13 @@ template <typename... T> struct Tuple {}; /** * This acts as a separator of different encodings being mashed together + * For example we can transport any base64 encodings in JSON + * + * using WrappedExample = schema::Tuple< + * schema::Wrapper<schema::String, encode::Base64> + * >; + * + * data<WrappedExample, encode::Json> ex_data; */ template <typename T, typename Enc> class Wrapper {}; |