diff --git a/include/ircd/buffer.h b/include/ircd/buffer.h index 79138e641..ae81bf16e 100644 --- a/include/ircd/buffer.h +++ b/include/ircd/buffer.h @@ -29,6 +29,8 @@ template struct buffer :std::tuple { + using value_type = it; + operator string_view() const; operator std::string_view() const; explicit operator std::string() const; @@ -95,6 +97,9 @@ template size_t size(const buffer &buffer); template size_t size(const buffers &buffers); template it data(const buffer &buffer); +template size_t consume(buffer &buffer, const size_t &bytes); +template size_t consume(buffers &buffers, const size_t &bytes); + } // namespace buffer using buffer::const_buffer; @@ -107,6 +112,32 @@ using buffer::null_buffers; } // namespace ircd +template +size_t +ircd::buffer::consume(buffers &buffers, + const size_t &bytes) +{ + size_t remain(bytes); + for(auto it(begin(buffers)); it != end(buffers) && remain > 0; ++it) + { + using buffer = typename buffers::value_type; + using iterator = typename buffer::value_type; + + buffer &b(const_cast(*it)); + remain -= consume(b, remain); + } + + return bytes - remain; +} + +template +size_t +ircd::buffer::consume(buffer &buffer, + const size_t &bytes) +{ + get<0>(buffer) += std::min(size(buffer), bytes); + return bytes - size(buffer); +} template it