summaryrefslogtreecommitdiff
path: root/modules/codec
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-03 16:20:39 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-03 16:20:39 +0200
commit738bc442f680bda95667e4fd1ae743c6f6afeab0 (patch)
treec518bb64f401501f11e45e1ec9536e1dee2d5187 /modules/codec
parent95145a733d15bef84aa294f31d5cf8cefc66a1e0 (diff)
Made transport slicing possible
Diffstat (limited to 'modules/codec')
-rw-r--r--modules/codec/c++/transport.hpp16
-rw-r--r--modules/codec/tests/transport.cpp114
2 files changed, 112 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.");
+ }
+ }
}
-
}