summaryrefslogtreecommitdiff
path: root/modules/core
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-01 17:11:15 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-01 17:11:15 +0200
commitb2d802af5cb449f11664a21e5f6b6dc02584e295 (patch)
tree4dd4b98bcd6a540b477ad2738b45b31deccf17a9 /modules/core
parent8ecfef96af8b4eb80f4620293e8c39af231399ac (diff)
wip
Diffstat (limited to 'modules/core')
-rw-r--r--modules/core/c++/buffer.cpp80
-rw-r--r--modules/core/c++/buffer.hpp3
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();