summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/codec/c++/transport.hpp3
-rw-r--r--modules/core/c++/buffer.cpp80
-rw-r--r--modules/core/c++/buffer.hpp3
-rw-r--r--modules/io_codec/c++/io_peer.hpp2
4 files changed, 87 insertions, 1 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp
index 110ab3d..0bb70eb 100644
--- a/modules/codec/c++/transport.hpp
+++ b/modules/codec/c++/transport.hpp
@@ -29,6 +29,9 @@ public:
error_or<array_buffer> chain_slice(chain_array_buffer& buff) const {
(void) buff;
+
+
+
return make_error<err::not_implemented>();
}
};
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();
diff --git a/modules/io_codec/c++/io_peer.hpp b/modules/io_codec/c++/io_peer.hpp
index 613f60e..9381754 100644
--- a/modules/io_codec/c++/io_peer.hpp
+++ b/modules/io_codec/c++/io_peer.hpp
@@ -9,7 +9,7 @@ namespace saw {
template <typename Incoming, typename Outgoing,
typename TransportEncoding, typename ContentEncoding,
- typename BufferT = ring_buffer>
+ typename BufferT = chain_array_buffer>
class streaming_io_peer {
private:
static_assert(not std::is_same_v<ContentEncoding, encode::Native>, "The native encoding by definition is not fit for transport.");