17#ifndef TOOLBOX_IO_BUFFER_HPP
18#define TOOLBOX_IO_BUFFER_HPP
22#include <boost/asio/buffer.hpp>
23#include <boost/container/vector.hpp>
31using boost::asio::buffer_size;
35 explicit Buffer(std::size_t capacity) { buf_.reserve(capacity); }
54 std::string_view
str() const noexcept {
return {rptr(),
size()}; }
57 std::string_view
front(std::size_t size)
const noexcept
59 const auto limit = this->
size();
60 return {rptr(), std::min(
size, limit)};
63 std::string_view
back(std::size_t size)
const noexcept
65 const auto limit = this->
size();
67 return {rptr() + limit -
size,
size};
71 bool empty() const noexcept {
return size() == 0U; };
74 std::size_t
size() const noexcept {
return wpos_ - rpos_; }
77 void clear() noexcept { rpos_ = wpos_ = 0; }
80 void commit(std::size_t count)
noexcept { wpos_ += count; }
83 void consume(std::size_t count)
noexcept;
88 if (
const auto avail = available();
size > avail) {
90 const auto diff =
size - avail;
91 buf_.resize(buf_.size() + diff);
93 return {wptr(),
size};
97 void reserve(std::size_t capacity) { buf_.reserve(capacity); }
100 const char* rptr() const noexcept {
return buf_.data() + rpos_; }
101 char* wptr() noexcept {
return buf_.data() + wpos_; }
102 std::size_t available() const noexcept {
return buf_.size() - wpos_; }
104 std::size_t rpos_{}, wpos_{};
105 boost::container::vector<char> buf_;