diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-02 15:09:25 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-02 15:09:25 +0200 |
commit | d927a38ed9a9ee6b510576a8f898083186db3400 (patch) | |
tree | f2f2136d76df312aa8815f84aaabbd795c771c07 /modules/core | |
parent | 710d1d11d471d3b3f7e5a4d126487665752bbfaa (diff) |
wip
Diffstat (limited to 'modules/core')
-rw-r--r-- | modules/core/c++/buffer.cpp | 61 | ||||
-rw-r--r-- | modules/core/c++/buffer.hpp | 3 |
2 files changed, 42 insertions, 22 deletions
diff --git a/modules/core/c++/buffer.cpp b/modules/core/c++/buffer.cpp index 12df1ab..0e28524 100644 --- a/modules/core/c++/buffer.cpp +++ b/modules/core/c++/buffer.cpp @@ -82,26 +82,40 @@ std::string convert_to_string(const buffer& buff){ return oss.str(); } -buffer_view::buffer_view(buffer &buffer) - : buffer_{&buffer}, read_offset_{0}, write_offset_{0} {} +buffer_view::buffer_view(buffer &buffer__): + buffer_{&buffer__}, + read_offset_{0}, + write_offset_{0}, + read_limit_{buffer__.read_composite_length()}, + write_limit_{buffer__.write_composite_length()} +{} + +buffer_view::buffer_view(buffer &buffer__, uint64_t read_limit__, uint64_t write_limit__): + buffer_{&buffer__}, + read_offset_{0}, + write_offset_{0}, + read_limit_{read_limit__ < buffer__.read_composite_length() ? read_limit__ : buffer__.read_composite_length()}, + write_limit_{write_limit__ < buffer__.write_composite_length() ? write_limit__ : buffer__.write_composite_length()} +{} size_t buffer_view::read_position() const { return read_offset_ + buffer_->read_position(); } size_t buffer_view::read_composite_length() const { - assert(read_offset_ <= buffer_->read_composite_length()); - if (read_offset_ > buffer_->read_composite_length()) { + assert(read_offset_ <= read_limit_); + + if (read_offset_ > read_limit_) { return 0; } - return buffer_->read_composite_length() - read_offset_; + return read_limit_ - read_offset_; } size_t buffer_view::read_segment_length(size_t offset) const { size_t off = offset + read_offset_; - assert(off <= buffer_->read_composite_length()); - if (off > buffer_->read_composite_length()) { + assert(off <= read_limit_); + if (off > read_limit_) { return 0; } @@ -110,9 +124,9 @@ size_t buffer_view::read_segment_length(size_t offset) const { void buffer_view::read_advance(size_t bytes) { size_t offset = bytes + read_offset_; - assert(offset <= buffer_->read_composite_length()); - if (offset > buffer_->read_composite_length()) { - read_offset_ += buffer_->read_composite_length(); + assert(offset <= read_limit_); + if (offset > read_limit_) { + read_offset_ = read_limit_; return; } @@ -122,7 +136,7 @@ void buffer_view::read_advance(size_t bytes) { uint8_t &buffer_view::read(size_t i) { size_t pos = i + read_offset_; - assert(pos < buffer_->read_composite_length()); + assert(pos < read_limit_); return buffer_->read(pos); } @@ -130,7 +144,7 @@ uint8_t &buffer_view::read(size_t i) { const uint8_t &buffer_view::read(size_t i) const { size_t pos = i + read_offset_; - assert(pos < buffer_->read_composite_length()); + assert(pos < read_limit_); return buffer_->read(pos); } @@ -140,18 +154,18 @@ size_t buffer_view::write_position() const { } size_t buffer_view::write_composite_length() const { - assert(write_offset_ <= buffer_->write_composite_length()); - if (write_offset_ > buffer_->write_composite_length()) { + assert(write_offset_ <= write_limit_); + if (write_offset_ > write_limit_) { return 0; } - return buffer_->write_composite_length() - write_offset_; + return write_limit_ - write_offset_; } size_t buffer_view::write_segment_length(size_t offset) const { size_t off = offset + write_offset_; - assert(off <= buffer_->write_composite_length()); - if (off > buffer_->write_composite_length()) { + assert(off <= write_limit_); + if (off > write_limit_) { return 0; } @@ -160,9 +174,9 @@ size_t buffer_view::write_segment_length(size_t offset) const { void buffer_view::write_advance(size_t bytes) { size_t offset = bytes + write_offset_; - assert(offset <= buffer_->write_composite_length()); - if (offset > buffer_->write_composite_length()) { - write_offset_ += buffer_->write_composite_length(); + assert(offset <= write_limit_); + if (offset > write_limit_) { + write_offset_ = write_limit_; return; } @@ -172,7 +186,7 @@ void buffer_view::write_advance(size_t bytes) { uint8_t &buffer_view::write(size_t i) { size_t pos = i + write_offset_; - assert(pos < buffer_->write_composite_length()); + assert(pos < write_limit_); return buffer_->write(pos); } @@ -180,12 +194,15 @@ uint8_t &buffer_view::write(size_t i) { const uint8_t &buffer_view::write(size_t i) const { size_t pos = i + write_offset_; - assert(pos < buffer_->write_composite_length()); + assert(pos < write_limit_); return buffer_->write(pos); } error buffer_view::write_require_length(size_t bytes) { + if(write_offset_ + bytes > write_limit_){ + return make_error<err::buffer_exhausted>("BufferView limit reached."); + } return buffer_->write_require_length(bytes + write_offset_); } diff --git a/modules/core/c++/buffer.hpp b/modules/core/c++/buffer.hpp index 2c8fcde..c1fc25c 100644 --- a/modules/core/c++/buffer.hpp +++ b/modules/core/c++/buffer.hpp @@ -66,9 +66,12 @@ private: buffer *buffer_; size_t read_offset_; size_t write_offset_; + uint64_t limit_read_; + uint64_t limit_write_; public: buffer_view(buffer &); + buffer_view(buffer &, uint64_t limit_read_len, uint64_t limit_write_len); size_t read_position() const override; size_t read_composite_length() const override; |