diff options
Diffstat (limited to 'modules/codec-json/c++/json.hpp')
-rw-r--r-- | modules/codec-json/c++/json.hpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/modules/codec-json/c++/json.hpp b/modules/codec-json/c++/json.hpp new file mode 100644 index 0000000..d81a508 --- /dev/null +++ b/modules/codec-json/c++/json.hpp @@ -0,0 +1,120 @@ +#pragma once + +#include <forstio/buffer.h> +#include <forstio/common.h> +#include <forstio/codec/data.h> + +#include <algorithm> + +namespace saw { +namespace encode { +struct Json {}; +} + +template<typename Schema> +class data<Schema, encode::Json> { +private: + ring_buffer buffer_; +public: + data():buffer_{}{} + + data(std::size_t ring_size_):buffer_{ring_size_}{} + + data(ring_buffer buff_): + buffer_{std::move(buff_)} + {} + + 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_; + } + + const buffer& get_buffer() const { + return buffer_; + } + + error push(uint8_t val){ + return buffer_.push(val); + } + + std::size_t get_size() const { + return buffer_.read_composite_length(); + } + + uint8_t& at(std::size_t i){ + return buffer_.read(i); + } + + const uint8_t& at(std::size_t i) const { + return buffer_.read(i); + } +}; +} + +#include "json.tmpl.hpp + +namespace saw { + +/** + * Codec class for json + */ +template<typename Schema> +class codec<Schema, encode::Json> { +public: + struct config { + size_t depth = 16; + size_t length = 1024; + }; +private: + config cfg_; +public: + /** + * Default constructor + */ + codec(){} + + /** + * Constructor + */ + codec(config cfg__):cfg_{std::move(cfg__)}{} + + SAW_FORBID_COPY(codec); + SAW_DEFAULT_MOVE(codec); + + template <typename FromEncoding> + error_or<void> encode(const data<Schema, FromEncoding>& from_encode, data<Schema, encode::Json>& to_encode){ + // To Be encoded + buffer_view buff_v{to_encode.get_buffer()}; + auto eov = impl::json_encode<Schema, Schema, FromEncoding>::encode(from_encode, buff_v); + if(eov.is_error()){ + return std::move(eov.get_error()); + } + to_encode.get_buffer().write_advance(buff_v.write_offset()); + + return void_t{}; + } + + template <typename ToEncoding> + 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 {}; + } +}; +} + |