summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClaudius Holeksa <mail@keldu.de>2023-06-15 20:45:27 +0200
committerClaudius Holeksa <mail@keldu.de>2023-06-15 20:45:27 +0200
commit777b7490470c9f1328abe8d0f83bedda8f02593d (patch)
treecd0704eeca067fa0d3ef7370c308883a98e5014d /src
parent4260ffa31e58129ad6822eccce8a81ab750bd8b7 (diff)
c++, codec-json: Added multi dimensional arrays to json
Diffstat (limited to 'src')
-rw-r--r--src/codec-json/json.tmpl.h59
-rw-r--r--src/codec/data.h8
2 files changed, 45 insertions, 22 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h
index 0d1c7f0..f5788e7 100644
--- a/src/codec-json/json.tmpl.h
+++ b/src/codec-json/json.tmpl.h
@@ -120,36 +120,51 @@ struct json_encode<schema::Tuple<T...>, RootSchema, FromEncode> {
}
};
-template<typename T, typename RootSchema, typename FromEncode>
-struct json_encode<schema::Array<T>, RootSchema, FromEncode> {
- static error_or<void> encode(const data<schema::Array<T>, FromEncode>& from, buffer& to) {
- {
- auto err = to.push('[');
- if(!err.template is_type<err::no_error>()){
- return err;
+template<typename T, size_t D, typename RootSchema, typename FromEncode>
+struct json_encode<schema::Array<T,D>, RootSchema, FromEncode> {
+ template<size_t Level>
+ static error_or<void> encode_level(const data<schema::Array<T,D>, FromEncode>& from, buffer& to, std::array<std::size_t, D>& index){
+ if constexpr (Level == D){
+ auto eov = json_encode<T, RootSchema, FromEncode>::encode(from.at(index), to);
+ if(eov.is_error()){
+ return eov;
}
- }
- for(std::size_t i = 0; i < from.size(); ++i){
- if(i > 0){
- auto eov_ele = to.push(',');
- if(!eov_ele.template is_type<err::no_error>()){
- return eov_ele;
+ } else {
+ {
+ auto err = to.push('[');
+ if(!err.template is_type<err::no_error>()){
+ return err;
}
}
- auto eov = json_encode<T, RootSchema, FromEncode>::encode(from.at(i), to);
- if(eov.is_error()){
- return eov;
+ for(std::size_t i = 0; i < from.get_dim_size(Level); ++i){
+ if( i > 0 ){
+ auto err = to.push(',');
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
+ }
+ {
+ index[Level] = i;
+ auto eov = encode_level<Level+1>(from, to, index);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
}
- }
- {
- auto err = to.push(']');
- if(!err.template is_type<err::no_error>()){
- return err;
+ {
+ auto err = to.push(']');
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
}
}
-
return void_t{};
}
+
+ static error_or<void> encode(const data<schema::Array<T,D>, FromEncode>& from, buffer& to) {
+ std::array<std::size_t, D> index;
+ return encode_level<0>(from, to, index);
+ }
};
template<typename... T, string_literal... Key, typename RootSchema, typename FromEncode>
diff --git a/src/codec/data.h b/src/codec/data.h
index 7ed672b..5cb1267 100644
--- a/src/codec/data.h
+++ b/src/codec/data.h
@@ -207,6 +207,14 @@ class data<schema::Array<T,Dim>, encode::Native> {
value_.resize(get_full_size());
}
+ data<T, encode::Native>& at(const std::array<std::size_t, Dim>& ind){
+ return value_.at(this->get_index(ind));
+ }
+
+ const data<T, encode::Native>& at(const std::array<std::size_t, Dim>& ind) const {
+ return value_.at(this->get_index(ind));
+ }
+
template<std::integral... Dims>
data<T, encode::Native>& at(Dims... i){
return value_.at(this->get_index({i...}));