diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-01 17:11:15 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-01 17:11:15 +0200 |
commit | b2d802af5cb449f11664a21e5f6b6dc02584e295 (patch) | |
tree | 4dd4b98bcd6a540b477ad2738b45b31deccf17a9 /modules/core | |
parent | 8ecfef96af8b4eb80f4620293e8c39af231399ac (diff) |
wip
Diffstat (limited to 'modules/core')
-rw-r--r-- | modules/core/c++/buffer.cpp | 80 | ||||
-rw-r--r-- | modules/core/c++/buffer.hpp | 3 |
2 files changed, 83 insertions, 0 deletions
diff --git a/modules/core/c++/buffer.cpp b/modules/core/c++/buffer.cpp index f94f82f..d48297c 100644 --- a/modules/core/c++/buffer.cpp +++ b/modules/core/c++/buffer.cpp @@ -433,4 +433,84 @@ error array_buffer::write_require_length(size_t bytes) { return no_error(); } +chain_array_buffer::chain_array_buffer(): + read_position_{0u}, + write_position_{0u} +{} + +size_t chain_array_buffer::read_position() const { + return read_position_; +} + +size_t chain_array_buffer::read_composite_length() const { + return write_position_ - read_position_; +} + +size_t chain_array_buffer::read_segment_length(size_t offset) const { + if((read_position_ + offset) >= write_position_){ + return 0u; + } + + uint64_t searched_read_i = read_index_; + uint64_t remainder = buffer_.at(searched_read_i).read_segment_length(); + while(offset > remainder){ + offset -= remainder; + ++searched_read_i; + + if(searched_read_i >= buffer_.size()){ + return 0u; + } + + remainder = buffer_.at(searched_read_i).read_segment_length(); + } + + return buffer_.at(searched_read_i).read_segment_length(offset); +} + +uint8_t& chain_array_buffer::read(uint64_t i) { + uint64_t search_read_i = read_index_; + uint64_t search_read_pos = read_position_; + + return buffer_.at(search_read_i).at(search_read_pos); + + /// @TODO + while( i >= buffer_.at(search_read_i).read_segment_length() ){ + + } + + return buffer_.at(search_read_i).at(search_read_pos); +} + +size_t chain_array_buffer::write_position() const { + return write_position_; +} + +size_t chain_array_buffer::write_composite_length() const { + uint64_t total_size = 0u; + for(uint64_t i = write_index_; i < buffer_.size(); ++i){ + total_size += buffer_.at(i).write_composite_length(); + } + return total_size; +} + +size_t chain_array_buffer::write_segment_length(size_t offset) const { + uint64_t searched_write_i = write_index_; + uint64_t remainder = buffer_.at(searched_write_i).write_segment_length(); + while(offset > remainder){ + offset -= remainder; + ++searched_write_i; + + if(searched_write_i >= buffer_.size()){ + return 0u; + } + + remainder = buffer_.at(searched_write_i).write_segment_length(); + } + + return buffer_.at(searched_write_i).write_segment_length(offset); +} + + + + } // namespace saw diff --git a/modules/core/c++/buffer.hpp b/modules/core/c++/buffer.hpp index 5bbd90b..47f55e3 100644 --- a/modules/core/c++/buffer.hpp +++ b/modules/core/c++/buffer.hpp @@ -172,7 +172,10 @@ private: std::deque<array_buffer> buffer_; size_t read_position_; + size_t read_index_; + size_t write_position_; + size_t write_index_; public: chain_array_buffer(); |