From 09bb8350e833dfd9447d4d4ecf82d08f23b477de Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 17 May 2025 11:08:19 +0900 Subject: [PATCH] buffer: Adopt std::ranges --- src/buffer.h | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/buffer.h b/src/buffer.h index 1921edf1..bb66e4b4 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -27,49 +27,46 @@ #include "nghttp2_config.h" -#include #include -#include namespace nghttp2 { template struct Buffer { - Buffer() : pos(std::begin(buf)), last(pos) {} + constexpr Buffer() noexcept : pos(buf), last(pos) {} // Returns the number of bytes to read. - size_t rleft() const { return last - pos; } + constexpr size_t rleft() const noexcept { return last - pos; } // Returns the number of bytes this buffer can store. - size_t wleft() const { return std::end(buf) - last; } + constexpr size_t wleft() const noexcept { return &buf[N] - last; } // Writes up to min(wleft(), |count|) bytes from buffer pointed by // |src|. Returns number of bytes written. - size_t write(const void *src, size_t count) { + constexpr size_t write(const void *src, size_t count) { count = std::min(count, wleft()); auto p = static_cast(src); - last = std::copy_n(p, count, last); + last = std::ranges::copy_n(p, count, last).out; return count; } - size_t write(size_t count) { + constexpr size_t write(size_t count) { count = std::min(count, wleft()); last += count; return count; } // Drains min(rleft(), |count|) bytes from start of the buffer. - size_t drain(size_t count) { + constexpr size_t drain(size_t count) { count = std::min(count, rleft()); pos += count; return count; } - size_t drain_reset(size_t count) { + constexpr size_t drain_reset(size_t count) { count = std::min(count, rleft()); - std::copy(pos + count, last, std::begin(buf)); - last = std::begin(buf) + (last - (pos + count)); - pos = std::begin(buf); + last = std::ranges::copy(pos + count, last, buf).out; + pos = buf; return count; } - void reset() { pos = last = std::begin(buf); } - uint8_t *begin() { return std::begin(buf); } - uint8_t &operator[](size_t n) { return buf[n]; } - const uint8_t &operator[](size_t n) const { return buf[n]; } - std::array buf; + constexpr void reset() noexcept { pos = last = buf; } + constexpr uint8_t *begin() noexcept { return buf; } + constexpr uint8_t &operator[](size_t n) { return buf[n]; } + constexpr const uint8_t &operator[](size_t n) const { return buf[n]; } + uint8_t buf[N]; uint8_t *pos, *last; };