diff options
author | Claudius Holeksa <mail@keldu.de> | 2023-06-10 17:21:29 +0200 |
---|---|---|
committer | Claudius Holeksa <mail@keldu.de> | 2023-06-10 17:21:29 +0200 |
commit | 6c8e3d1786a5de4ae562c03693b8dad9dd0ab26e (patch) | |
tree | 18275240cfb8ff30e1d383ea351a277e894e988f /src/codec-json | |
parent | b670001ca80dbc0e1a51b4a08776eb41dabc2a9e (diff) |
tests,c++: Intermediate commit preparing testing and json
Diffstat (limited to 'src/codec-json')
-rw-r--r-- | src/codec-json/json.h | 10 | ||||
-rw-r--r-- | src/codec-json/json.tmpl.h | 26 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/codec-json/json.h b/src/codec-json/json.h index 2a0bea9..f23aff9 100644 --- a/src/codec-json/json.h +++ b/src/codec-json/json.h @@ -18,7 +18,15 @@ class data<Schema, encode::Json> { private: own<buffer> buffer_; public: - data() = default; + + data(): + buffer_{heap<ring_buffer>()} + {} + + buffer& get_buffer(){ + assert(buffer_); + return *buffer_; + } std::size_t get_size() const { return buffer_.size(); diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index d29f29c..3699e10 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -9,11 +9,31 @@ class json_encode_impl { static_assert(always_false<Schema, RootSchema, FromEncode>, "This schema type is not being handle by the json encoding."); }; -template<size_t N, typename RootSchema, typename FromEncode> -class json_encode_impl<saw::schema::Primitive<schema::FloatingPoint,N>, RootSchema, FromEncode> { +template<typename T, size_t N, typename RootSchema, typename FromEncode> +class json_encode_impl<saw::schema::Primitive<T,N>, RootSchema, FromEncode> { static ErrorOr<void> encode(const data<Schema, FromEncode>& from, data<Schema, encode::Json>& to, size_t ptr) { auto val = from.get(); - auto tc_result = std::to_chars(); + std::array<uint8_t, 256> data; + auto tc_result = std::to_chars(reinterpret_cast<int8_t>(data.data()), reinrepret_cast<int8_t>(data.data())+data.size(), val); + + if(tc_result.ec != std::errc{}){ + return make_error<err::critical>(); + } + + size_t bytes_written = 0; + for(auto ptr = data.data(); ptr != tc_result.ptr; ++ptr){ + ++bytes_written; + } + + auto& buff = to.get_buffer(); + error err = buff.write_require_length(bytes_written); + if(!err.template is_type<err::no_error>()){ + return std::move(err); + } + + for(auto ptr = data.data(); ptr != tc_result.ptr; ++ptr){ + buff.push(ptr[0]); + } return Void{}; } |