summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClaudius Holeksa <mail@keldu.de>2023-06-20 17:00:38 +0200
committerClaudius Holeksa <mail@keldu.de>2023-06-20 17:00:38 +0200
commit056ab6893ca18c33c7fb01d24498f9149fba4e8a (patch)
tree8ab44a999552beb3cd72f80c1166ec94e849e4fc /src
parentf5629bf0da55ebaaddc5cf551c36ed7362dc54b5 (diff)
c++, codec-json: Minor progress on arrays for json decoding
Diffstat (limited to 'src')
-rw-r--r--src/codec-json/json.h16
-rw-r--r--src/codec-json/json.tmpl.h134
2 files changed, 97 insertions, 53 deletions
diff --git a/src/codec-json/json.h b/src/codec-json/json.h
index 58b64aa..1fe6bb5 100644
--- a/src/codec-json/json.h
+++ b/src/codec-json/json.h
@@ -20,6 +20,16 @@ public:
data(std::size_t ring_size_):buffer_{ring_size_}{}
+ data(const std::string_view& view__):
+ buffer_{view__.size()}
+ {
+ auto ptr = reinterpret_cast<const uint8_t*>(view__.data());
+ if(!ptr){
+ return;
+ }
+ buffer_.push(*ptr, view__.size());
+ }
+
buffer& get_buffer(){
return buffer_;
}
@@ -93,6 +103,12 @@ public:
error_or<void> decode(data<Schema, encode::Json>& from_decode, data<Schema, ToEncoding>& to_decode){
buffer_view buff_v{from_decode.get_buffer()};
+ auto eov = impl::json_decode<Schema, Schema, ToEncoding>::decode(buff_v, to_decode);
+ if(eov.is_error()){
+ return std::move(eov.get_error());
+ }
+ from_decode.get_buffer().read_advance(buff_v.read_offset());
+
return void_t {};
}
};
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h
index b8cd7aa..0f6c59f 100644
--- a/src/codec-json/json.tmpl.h
+++ b/src/codec-json/json.tmpl.h
@@ -10,7 +10,7 @@ class json_encode {
};
template<typename T, size_t N, typename RootSchema, typename FromEncode>
-struct json_encode<schema::Primitive<T,N>, RootSchema, FromEncode> {
+struct json_encode<schema::Primitive<T,N>, RootSchema, FromEncode> {
static error_or<void> encode(const data<schema::Primitive<T,N>, FromEncode>& from, buffer& to) {
auto val = from.get();
std::array<uint8_t, 256> data;
@@ -38,58 +38,6 @@ struct json_encode<schema::Primitive<T,N>, RootSchema, FromEncode> {
return void_t{};
}
-
- static error_or<void> decode(buffer_view& buff, data<schema::Primitive<T,N>, FromEncode>& to){
- assert((buff.read() >= '0' && buff.read() <= '9') ||
- buff.read() == '+' || buff.read() == '-');
-
- std::size_t offset = 0;
-
- if(buff.read() == '-'){
- ++offset;
- }else if(buff.read() == '+'){
- return make_error<err::not_supported>();
- }
- if (offset >= buff.read_composite_length()) {
- return make_error<err::buffer_exhausted>();
- }
- if(buff.read(offset) >= '1' && buff.read(offset) <= '9'){
- ++offset;
-
- if(offset >= buff.read_composite_length()){
- return make_error<err::buffer_exhausted>();
- }
-
- while(1){
- if (buff.read(offset) >= '0' && buff.read(offset) <= '9'){
- ++offset;
-
- if(offset >= buff.read_composite_length()){
- return make_error<err::buffer_exhausted>();
- }
- continue;
- }
- break;
- }
- }else if (buff.read(offset) == '0' ){
- ++offset;
- }else{
- return make_error<err::buffer_exhausted>();
- }
-
- {
- std::string_view num_view{reinterpret_cast<char*>(&buff.read()), offset};
- typename native_data_type<schema::Primitive<T,N>>::type result;
- auto fc_result = std::from_chars(num_view.data(), num_view.data() + num_view.size(), result);
- if(fc_result.ec != std::errc{}){
- return make_error<err::invalid_state>();
- }
-
- to.set(result);
- }
-
- return void_t{};
- }
};
template<typename RootSchema, typename FromEncode>
@@ -369,6 +317,86 @@ struct json_encode<schema::Union<schema::Member<T,Key>...>, RootSchema, FromEnco
template<typename Schema, typename RootSchema, typename ToDecode>
struct json_decode;
+template<typename T, size_t N, typename RootSchema, typename ToDecode>
+struct json_decode<schema::Primitive<T,N>, RootSchema, ToDecode> {
+ static error_or<void> decode(buffer_view& buff, data<schema::Primitive<T,N>, ToDecode>& to){
+ assert((buff.read() >= '0' && buff.read() <= '9') ||
+ buff.read() == '+' || buff.read() == '-');
+
+ std::size_t offset = 0;
+
+ if(buff.read() == '-'){
+ ++offset;
+ }else if(buff.read() == '+'){
+ return make_error<err::not_supported>();
+ }
+ if (offset >= buff.read_composite_length()) {
+ return make_error<err::buffer_exhausted>();
+ }
+ if(buff.read(offset) >= '1' && buff.read(offset) <= '9'){
+ ++offset;
+
+ if(offset >= buff.read_composite_length()){
+ return make_error<err::buffer_exhausted>();
+ }
+ while(1){
+ if (buff.read(offset) >= '0' && buff.read(offset) <= '9'){
+ ++offset;
+
+ if(offset >= buff.read_composite_length()){
+ break;
+ }
+ continue;
+ }
+ break;
+ }
+ }else if (buff.read(offset) == '0' ){
+ ++offset;
+ }else{
+ return make_error<err::buffer_exhausted>();
+ }
+
+ {
+ std::string_view num_view{reinterpret_cast<char*>(&buff.read()), offset};
+ typename native_data_type<schema::Primitive<T,N>>::type result;
+ auto fc_result = std::from_chars(num_view.data(), num_view.data() + num_view.size(), result);
+ if(fc_result.ec != std::errc{}){
+ return make_error<err::invalid_state>();
+ }
+
+ to.set(result);
+ }
+ buff.read_advance(offset);
+
+ return void_t{};
+ }
+};
+
+template<typename T, size_t D, typename RootSchema, typename ToDecode>
+struct json_decode<schema::Array<T,D>, RootSchema, ToDecode> {
+ template<size_t Level>
+ static error_or<void> decode_level(buffer_view& buff, data<schema::Array<T,D>, ToDecode>& to, std::array<std::size_t, D>& index){
+ if constexpr (Level == D) {
+ auto eov = json_decode<T, RootSchema, ToDecode>::decode(buff, to.at(index));
+ if(eov.is_error()){
+ return eov;
+ }
+ } else {
+ assert(buff.read() == '[');
+ buff.read_advance(1);
+ if( buff.read_composite_length() == 0 ){
+ return make_error<err::buffer_exhausted>();
+ }
+
+ }
+ return void_t{};
+ }
+
+ static error_or<void> decode(buffer_view& buff, data<schema::Array<T,D>, ToDecode>& to){
+ std::array<std::size_t, D> index;
+ return decode_level<0>(buff, to, index);
+ }
+};
}
}