From f5629bf0da55ebaaddc5cf551c36ed7362dc54b5 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 20 Jun 2023 09:05:08 +0200 Subject: c++: Adding tests and working around some constness problems --- src/codec-json/json.h | 8 ++++++- src/codec-json/json.tmpl.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/codec-json/json.h b/src/codec-json/json.h index f547e54..58b64aa 100644 --- a/src/codec-json/json.h +++ b/src/codec-json/json.h @@ -24,6 +24,10 @@ public: return buffer_; } + const buffer& get_buffer() const { + return buffer_; + } + error push(uint8_t val){ return buffer_.push(val); } @@ -86,7 +90,9 @@ public: } template - error_or decode(const data& from_decode, data& to_decode){ + error_or decode(data& from_decode, data& to_decode){ + buffer_view buff_v{from_decode.get_buffer()}; + return void_t {}; } }; diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index f5788e7..b8cd7aa 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -38,6 +38,58 @@ struct json_encode, RootSchema, FromEncode> { return void_t{}; } + + static error_or decode(buffer_view& buff, data, 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(); + } + if (offset >= buff.read_composite_length()) { + return make_error(); + } + if(buff.read(offset) >= '1' && buff.read(offset) <= '9'){ + ++offset; + + if(offset >= buff.read_composite_length()){ + return make_error(); + } + + while(1){ + if (buff.read(offset) >= '0' && buff.read(offset) <= '9'){ + ++offset; + + if(offset >= buff.read_composite_length()){ + return make_error(); + } + continue; + } + break; + } + }else if (buff.read(offset) == '0' ){ + ++offset; + }else{ + return make_error(); + } + + { + std::string_view num_view{reinterpret_cast(&buff.read()), offset}; + typename native_data_type>::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(); + } + + to.set(result); + } + + return void_t{}; + } }; template -- cgit v1.2.3