summaryrefslogtreecommitdiff
path: root/modules/core
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-02 15:09:25 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-02 15:09:25 +0200
commitd927a38ed9a9ee6b510576a8f898083186db3400 (patch)
treef2f2136d76df312aa8815f84aaabbd795c771c07 /modules/core
parent710d1d11d471d3b3f7e5a4d126487665752bbfaa (diff)
wip
Diffstat (limited to 'modules/core')
-rw-r--r--modules/core/c++/buffer.cpp61
-rw-r--r--modules/core/c++/buffer.hpp3
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;