summaryrefslogtreecommitdiff
path: root/modules/core
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/core
parent95145a733d15bef84aa294f31d5cf8cefc66a1e0 (diff)
Made transport slicing possible
Diffstat (limited to 'modules/core')
-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
3 files changed, 51 insertions, 0 deletions
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");
+}
+
+}