File indexing completed on 2026-08-17 09:00:18
0001
0002
0003
0004
0005
0006
0007 #include <boost/redis/detail/read_buffer.hpp>
0008
0009 #include <boost/assert.hpp>
0010 #include <boost/core/make_span.hpp>
0011
0012 #include <utility>
0013
0014 namespace boost::redis::detail {
0015
0016 system::error_code read_buffer::prepare()
0017 {
0018 BOOST_ASSERT(append_buf_begin_ == buffer_.size());
0019
0020 auto const new_size = append_buf_begin_ + cfg_.read_buffer_append_size;
0021
0022 if (new_size > cfg_.max_read_size) {
0023 return error::exceeds_maximum_read_buffer_size;
0024 }
0025
0026 buffer_.resize(new_size);
0027 return {};
0028 }
0029
0030 void read_buffer::commit(std::size_t read_size)
0031 {
0032 BOOST_ASSERT(buffer_.size() >= (append_buf_begin_ + read_size));
0033 buffer_.resize(append_buf_begin_ + read_size);
0034 append_buf_begin_ = buffer_.size();
0035 }
0036
0037 auto read_buffer::get_prepared() noexcept -> span_type
0038 {
0039 auto const size = buffer_.size();
0040 return make_span(buffer_.data() + append_buf_begin_, size - append_buf_begin_);
0041 }
0042
0043 auto read_buffer::get_commited() const noexcept -> std::string_view
0044 {
0045 return {buffer_.data(), append_buf_begin_};
0046 }
0047
0048 void read_buffer::clear()
0049 {
0050 buffer_.clear();
0051 append_buf_begin_ = 0;
0052 }
0053
0054 read_buffer::consume_result
0055 read_buffer::consume(std::size_t size)
0056 {
0057
0058
0059 if (size > append_buf_begin_)
0060 size = append_buf_begin_;
0061
0062 buffer_.erase(buffer_.begin(), buffer_.begin() + size);
0063 auto const rotated = size == 0u ? 0u : buffer_.size();
0064
0065 BOOST_ASSERT(append_buf_begin_ >= size);
0066 append_buf_begin_ -= size;
0067
0068 return {size, rotated};
0069 }
0070
0071 void read_buffer::reserve(std::size_t n) { buffer_.reserve(n); }
0072
0073 bool operator==(read_buffer const& lhs, read_buffer const& rhs)
0074 {
0075 return lhs.buffer_ == rhs.buffer_ && lhs.append_buf_begin_ == rhs.append_buf_begin_;
0076 }
0077
0078 bool operator!=(read_buffer const& lhs, read_buffer const& rhs) { return !(lhs == rhs); }
0079
0080 }