src: Refactor Buffer::write with std::span

This commit is contained in:
Tatsuhiro Tsujikawa
2026-03-18 21:11:26 +09:00
parent 864ba96694
commit 2d2c666df0
4 changed files with 16 additions and 15 deletions

View File

@@ -598,8 +598,7 @@ void Http2Handler::start_settings_timer() {
int Http2Handler::fill_wb() {
if (!data_pending_.empty()) {
auto n = std::min(wb_.wleft(), data_pending_.size());
wb_.write(data_pending_.data(), n);
auto n = wb_.write(data_pending_);
if (n < data_pending_.size()) {
data_pending_ = data_pending_.subspan(n);
return 0;
@@ -620,9 +619,10 @@ int Http2Handler::fill_wb() {
if (datalen == 0) {
break;
}
auto n = wb_.write(data, as_unsigned(datalen));
if (n < static_cast<decltype(n)>(datalen)) {
data_pending_ = {data + n, as_unsigned(datalen) - n};
auto chunk = std::span{data, as_unsigned(datalen)};
auto n = wb_.write(chunk);
if (n < chunk.size()) {
data_pending_ = chunk.subspan(n);
break;
}
}

View File

@@ -41,13 +41,12 @@ template <size_t N> struct Buffer {
constexpr size_t wleft() const noexcept {
return as_unsigned(&buf[N] - last);
}
// Writes up to min(wleft(), |count|) bytes from buffer pointed by
// |src|. Returns number of bytes written.
constexpr size_t write(const void *src, size_t count) {
count = std::min(count, wleft());
auto p = static_cast<const uint8_t *>(src);
last = std::ranges::copy_n(p, as_signed(count), last).out;
return count;
// Writes up to min(wleft(), |src|.size()) bytes from |src|.
// Returns number of bytes written.
constexpr size_t write(std::span<const uint8_t> src) {
src = src.first(std::min(src.size(), wleft()));
last = std::ranges::copy(src, last).out;
return src.size();
}
constexpr size_t write(size_t count) {
count = std::min(count, wleft());

View File

@@ -34,6 +34,8 @@
#include "buffer.h"
using namespace std::literals;
namespace nghttp2 {
namespace {
@@ -52,7 +54,7 @@ void test_buffer_write(void) {
assert_size(0, ==, b.rleft());
assert_size(16, ==, b.wleft());
b.write("012", 3);
b.write(as_uint8_span(std::span{"012"sv}));
assert_size(3, ==, b.rleft());
assert_size(13, ==, b.wleft());
@@ -64,7 +66,7 @@ void test_buffer_write(void) {
assert_size(13, ==, b.wleft());
assert_ptrdiff(3, ==, b.pos - std::ranges::begin(b.buf));
auto n = b.write("0123456789ABCDEF", 16);
auto n = b.write(as_uint8_span(std::span{"0123456789ABCDEF"sv}));
assert_size(13, ==, n);

View File

@@ -703,7 +703,7 @@ void MemcachedConnection::make_request(MemcachedSendbuf *sendbuf,
break;
}
headbuf.write(req->key.c_str(), req->key.size());
headbuf.write(as_uint8_span(std::span{req->key}));
sendbuf->send_value_left = req->value.size();
}