read_buffer.ipp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* Copyright (c) 2018-2025 Marcelo Zimbres Silva (mzimbres@gmail.com)
  2. *
  3. * Distributed under the Boost Software License, Version 1.0. (See
  4. * accompanying file LICENSE.txt)
  5. */
  6. #include <boost/redis/detail/read_buffer.hpp>
  7. #include <boost/assert.hpp>
  8. #include <boost/core/make_span.hpp>
  9. #include <utility>
  10. namespace boost::redis::detail {
  11. system::error_code read_buffer::prepare()
  12. {
  13. BOOST_ASSERT(append_buf_begin_ == buffer_.size());
  14. auto const new_size = append_buf_begin_ + cfg_.read_buffer_append_size;
  15. if (new_size > cfg_.max_read_size) {
  16. return error::exceeds_maximum_read_buffer_size;
  17. }
  18. buffer_.resize(new_size);
  19. return {};
  20. }
  21. void read_buffer::commit(std::size_t read_size)
  22. {
  23. BOOST_ASSERT(buffer_.size() >= (append_buf_begin_ + read_size));
  24. buffer_.resize(append_buf_begin_ + read_size);
  25. append_buf_begin_ = buffer_.size();
  26. }
  27. auto read_buffer::get_prepared() noexcept -> span_type
  28. {
  29. auto const size = buffer_.size();
  30. return make_span(buffer_.data() + append_buf_begin_, size - append_buf_begin_);
  31. }
  32. auto read_buffer::get_commited() const noexcept -> std::string_view
  33. {
  34. return {buffer_.data(), append_buf_begin_};
  35. }
  36. void read_buffer::clear()
  37. {
  38. buffer_.clear();
  39. append_buf_begin_ = 0;
  40. }
  41. read_buffer::consume_result
  42. read_buffer::consume(std::size_t size)
  43. {
  44. // For convenience, if the requested size is larger than the
  45. // committed buffer we cap it to the maximum.
  46. if (size > append_buf_begin_)
  47. size = append_buf_begin_;
  48. buffer_.erase(buffer_.begin(), buffer_.begin() + size);
  49. auto const rotated = size == 0u ? 0u : buffer_.size();
  50. BOOST_ASSERT(append_buf_begin_ >= size);
  51. append_buf_begin_ -= size;
  52. return {size, rotated};
  53. }
  54. void read_buffer::reserve(std::size_t n) { buffer_.reserve(n); }
  55. bool operator==(read_buffer const& lhs, read_buffer const& rhs)
  56. {
  57. return lhs.buffer_ == rhs.buffer_ && lhs.append_buf_begin_ == rhs.append_buf_begin_;
  58. }
  59. bool operator!=(read_buffer const& lhs, read_buffer const& rhs) { return !(lhs == rhs); }
  60. } // namespace boost::redis::detail