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 /modules/core | |
parent | 95145a733d15bef84aa294f31d5cf8cefc66a1e0 (diff) |
Made transport slicing possible
Diffstat (limited to 'modules/core')
-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 |
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"); +} + +} |