summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/codec/c++/transport.hpp16
-rw-r--r--modules/codec/tests/transport.cpp114
-rw-r--r--modules/core/c++/buffer.cpp13
-rw-r--r--modules/core/c++/buffer.hpp4
-rw-r--r--modules/core/tests/ring_buffer.cpp34
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");
+}
+
+}