diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-09 19:03:00 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-09 19:03:00 +0200 |
commit | 8f79cd24c91b5fb5d062a922ae38f14e09e17b1a (patch) | |
tree | fde0bc007852897d1720d6283ea9b970e867951d | |
parent | df2e8e4463c9bc348e672fd894250a9cd6e13cfa (diff) |
wip
-rw-r--r-- | modules/codec/c++/transport.hpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp index 1dbe038..bb5019c 100644 --- a/modules/codec/c++/transport.hpp +++ b/modules/codec/c++/transport.hpp @@ -19,7 +19,7 @@ template<typename T> class transport; template<uint64_t Len> -class transport<trans::FixedLength<Len>> { +class transport<trans::FixedLength<Len>> final { private: public: error_or<buffer_view> view_slice(buffer& buff) const { @@ -59,4 +59,53 @@ public: return make_error<err::not_implemented>(); } }; + +template<uint64_t Len> +class transport<trans::VarLength<Len>> final { +public: + error_or<buffer_view> view_slice(buffer& buff) const { + typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type val{}; + buffer_view view{buff}; + + auto eov = stream_value<schema::Primitive<schema::UnsignedInteger, Len>>::decode(val, view); + if(eov.is_error()){ + return std::move(eov.get_error()); + } + + if(view.read_composite_length() < val){ + return make_error<err::buffer_exhausted>(); + } + buff.read_advance(Len); + + buffer_view data_view{buff, val, 0u}; + return data_view; + } + + error_or<uint64_t> wrap(buffer& out_buff, buffer& in_buff){ + using trans_type = typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type; + trans_type len{}; + len = static_cast<trans_type>(in_buff.read_composite_length()); + + { + auto err = out_buff.write_require_length(len); + if(err.failed()){ + return err; + } + } + + return make_error<err::not_implemented>(); + + for(uint8_t i = 0; i < in_buff.read_composite_length(); ++i){ + uint8_t val = in_buff.read(i); + out_buff.write(i) = val; + } + + return Len; + } + + error_or<array_buffer> chain_slice(chain_array_buffer& buff) const { + (void) buff; + return make_error<err::not_implemented>(); + } +}; } |