From b2d802af5cb449f11664a21e5f6b6dc02584e295 Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Thu, 1 Aug 2024 17:11:15 +0200 Subject: wip --- modules/core/c++/buffer.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++ modules/core/c++/buffer.hpp | 3 ++ 2 files changed, 83 insertions(+) (limited to 'modules/core/c++') 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 buffer_; size_t read_position_; + size_t read_index_; + size_t write_position_; + size_t write_index_; public: chain_array_buffer(); -- cgit v1.2.3