diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-03 16:20:39 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-03 16:20:39 +0200 |
commit | 738bc442f680bda95667e4fd1ae743c6f6afeab0 (patch) | |
tree | c518bb64f401501f11e45e1ec9536e1dee2d5187 | |
parent | 95145a733d15bef84aa294f31d5cf8cefc66a1e0 (diff) |
Made transport slicing possible
-rw-r--r-- | modules/codec/c++/transport.hpp | 16 | ||||
-rw-r--r-- | modules/codec/tests/transport.cpp | 114 | ||||
-rw-r--r-- | modules/core/c++/buffer.cpp | 13 | ||||
-rw-r--r-- | modules/core/c++/buffer.hpp | 4 | ||||
-rw-r--r-- | modules/core/tests/ring_buffer.cpp | 34 |
5 files changed, 163 insertions, 18 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp index 86079a2..6116497 100644 --- a/modules/codec/c++/transport.hpp +++ b/modules/codec/c++/transport.hpp @@ -4,7 +4,7 @@ #include "data.hpp" namespace saw { -namespace transport { +namespace trans { template<uint64_t Len = 8u> struct FixedLength {}; @@ -15,13 +15,14 @@ struct NewLine {}; struct CarriageReturnNewLine {}; } -template<typename Schema, uint64_t Len> -struct codec<Schema, transport::FixedLength<Len>> { +template<typename T> +class transport; + +template<uint64_t Len> +class transport<trans::FixedLength<Len>> { private: public: error_or<buffer_view> view_slice(buffer& buff) const { - (void) buff; - typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type val{}; buffer_view view{buff}; @@ -33,10 +34,9 @@ public: if(view.read_composite_length() < val){ return make_error<err::buffer_exhausted>(); } + buff.read_advance(Len); - buffer_view data_view{buff, val + Len, 0u}; - data_view.read_advance(Len); - + buffer_view data_view{buff, val, 0u}; return data_view; } diff --git a/modules/codec/tests/transport.cpp b/modules/codec/tests/transport.cpp index e24fae6..f5943dd 100644 --- a/modules/codec/tests/transport.cpp +++ b/modules/codec/tests/transport.cpp @@ -1,6 +1,7 @@ #include <forstio/test/suite.hpp> #include "../c++/data.hpp" #include "../c++/simple.hpp" +#include "../c++/transport.hpp" #include <iostream> @@ -23,12 +24,10 @@ using TestStruct = Struct< SAW_TEST("Transport FixedLen Struct write and slice"){ using namespace saw; - return; ring_buffer buff{2048u}; data<schema::TestStruct,encode::Native> native; - - data<schema::TestStruct,encode::KelSimple> simple{heap<buffer_view>(buff)}; + data<schema::TestStruct,encode::KelSimple> simple; { auto& tda = native.template get<"two_dim_array">(); @@ -40,12 +39,30 @@ SAW_TEST("Transport FixedLen Struct write and slice"){ } codec<schema::TestStruct, encode::KelSimple> codec; - auto eov = codec.encode(native, simple); - SAW_EXPECT(eov.is_value(), "Encoding error"); + { + auto eov = codec.encode(native, simple); + SAW_EXPECT(eov.is_value(), "Encoding error."); + } + + { + auto& rd_buff = simple.get_buffer(); + + { + auto eov = stream_value<schema::UInt64>::encode(rd_buff.read_composite_length(), buff); + SAW_EXPECT(eov.is_value(), "Buffer write length error."); + } + { + auto eov = buff.write_from(rd_buff); + SAW_EXPECT(eov.is_value(), "Buffer copy error."); + auto& val = eov.get_value(); + rd_buff.read_advance(val); + buff.write_advance(val); + } + } // Reset values native = {}; - simple = {heap<buffer_view>(buff)}; + simple = {}; { auto& tda = native.template get<"two_dim_array">(); tda = {1,2}; @@ -54,10 +71,87 @@ SAW_TEST("Transport FixedLen Struct write and slice"){ tda.at(0,1).set(4); native.template get<"number">().set(709); } + { + auto eov = codec.encode(native, simple); + SAW_EXPECT(eov.is_value(), "Encoding error on second try."); + } + + { + auto& rd_buff = simple.get_buffer(); + + { + auto eov = stream_value<schema::UInt64>::encode(rd_buff.read_composite_length(), buff); + SAW_EXPECT(eov.is_value(), "Buffer write length error."); + } + { + auto eov = buff.write_from(rd_buff); + SAW_EXPECT(eov.is_value(), "Buffer copy error."); + auto& val = eov.get_value(); + rd_buff.read_advance(val); + buff.write_advance(val); + } + } - auto eov = codec.encode(native, simple); - SAW_EXPECT(eov.is_value(), "Encoding error"); - + transport<trans::FixedLength<8>> trans; + { + auto eo_slice = trans.view_slice(buff); + + SAW_EXPECT(eo_slice.is_value(), "Buffer write length error."); + auto& slice = eo_slice.get_value(); + + auto arr_buff = heap<array_buffer>(1024u); + { + auto eov = arr_buff->write_from(slice); + SAW_EXPECT(eov.is_value(), "Failed to copy buffer."); + auto& len_val = eov.get_value(); + + slice.read_advance(len_val); + buff.read_advance(len_val); + arr_buff->write_advance(len_val); + } + + data<schema::TestStruct, encode::KelSimple> simple_slice{std::move(arr_buff)}; + native = {}; + auto eov = codec.decode(simple_slice, native); + SAW_EXPECT(eov.is_value(), "Decoding error on first try."); + + { + auto& tda = native.template get<"two_dim_array">(); + + SAW_EXPECT(tda.at(0,0).get() == 5, "Decoded value (0,0) wrong."); + SAW_EXPECT(tda.at(0,1).get() == 3, "Decoded value (0,1) wrong."); + SAW_EXPECT(native.template get<"number">().get() == 410, "Decoded value number wrong."); + } + } + { + auto eo_slice = trans.view_slice(buff); + + SAW_EXPECT(eo_slice.is_value(), "Buffer write length error."); + auto& slice = eo_slice.get_value(); + + auto arr_buff = heap<array_buffer>(1024u); + { + auto eov = arr_buff->write_from(slice); + SAW_EXPECT(eov.is_value(), "Failed to copy buffer."); + auto& len_val = eov.get_value(); + + slice.read_advance(len_val); + buff.read_advance(len_val); + arr_buff->write_advance(len_val); + } + + data<schema::TestStruct, encode::KelSimple> simple_slice{std::move(arr_buff)}; + native = {}; + auto eov = codec.decode(simple_slice, native); + SAW_EXPECT(eov.is_value(), "Decoding error on second try."); + + { + auto& tda = native.template get<"two_dim_array">(); + + SAW_EXPECT(tda.at(0,0).get() == 2, "Decoded value (0,0) wrong."); + SAW_EXPECT(tda.at(0,1).get() == 4, "Decoded value (0,1) wrong."); + SAW_EXPECT(native.template get<"number">().get() == 709, "Decoded value number wrong."); + } + } } - } diff --git a/modules/core/c++/buffer.cpp b/modules/core/c++/buffer.cpp index 0e28524..5312e86 100644 --- a/modules/core/c++/buffer.cpp +++ b/modules/core/c++/buffer.cpp @@ -60,6 +60,19 @@ error buffer::pop(uint8_t &buffer, size_t size) { return no_error(); } +error_or<uint64_t> buffer::write_from(const buffer& read_buff){ + uint64_t read_len = read_buff.read_composite_length(); + + error err = write_require_length(read_len); + if(err.failed()){ + return err; + } + for(uint64_t i = 0u; i < read_len; ++i){ + write(i) = read_buff.read(i); + } + return read_len; +} + /* std::string buffer::to_hex() const { std::ostringstream oss; diff --git a/modules/core/c++/buffer.hpp b/modules/core/c++/buffer.hpp index e871459..8b62131 100644 --- a/modules/core/c++/buffer.hpp +++ b/modules/core/c++/buffer.hpp @@ -46,6 +46,10 @@ public: error pop(uint8_t &value); error pop(uint8_t &buffer, size_t size); + /** + * Read from other buffer and write into this buffer + */ + error_or<uint64_t> write_from(const buffer& buff); }; /** diff --git a/modules/core/tests/ring_buffer.cpp b/modules/core/tests/ring_buffer.cpp new file mode 100644 index 0000000..0217b4f --- /dev/null +++ b/modules/core/tests/ring_buffer.cpp @@ -0,0 +1,34 @@ +#include "../c++/test/suite.hpp" +#include "../c++/buffer.hpp" + +namespace { +SAW_TEST("Ring Buffer Write Advance") { + using namespace saw; + + uint64_t size = 1024u; + ring_buffer buff{}; + + uint64_t advance = 32u; + buff.write_advance(advance); + + SAW_EXPECT(buff.read_position() == 0u, "Unexpected read position"); + SAW_EXPECT(buff.write_position() == 32u, "Unexpected write position"); + SAW_EXPECT(buff.read_composite_length() == 32u, "Unexpected write position"); +} + +SAW_TEST("Ring Buffer on Heap Write Advance") { + using namespace saw; + + uint64_t size = 1024u; + own<buffer> r_buff = heap<ring_buffer>(); + buffer& buff = *r_buff; + + uint64_t advance = 32u; + buff.write_advance(advance); + + SAW_EXPECT(buff.read_position() == 0u, "Unexpected read position"); + SAW_EXPECT(buff.write_position() == 32u, "Unexpected write position"); + SAW_EXPECT(buff.read_composite_length() == 32u, "Unexpected write position"); +} + +} |