summaryrefslogtreecommitdiff
path: root/c++
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2023-08-06 00:25:51 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2023-08-06 00:25:51 +0200
commitb23d4bf1d3a58b4a8304ca9cf050914e073de958 (patch)
tree23ab9381b3803692197d6deae2659da21d0a9614 /c++
parent3c1b311bbcd54b3e6798d619e51b55536b316cdc (diff)
c++,codec: Adding fixed array type to native encoding
Diffstat (limited to 'c++')
-rw-r--r--c++/codec/data.h52
-rw-r--r--c++/codec/schema.h7
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 {};