diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codec-json/json.tmpl.h | 59 | ||||
-rw-r--r-- | src/codec/data.h | 8 |
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...})); |