mirror of
https://github.com/nghttp2/nghttp2.git
synced 2026-03-25 07:26:14 +08:00
src: Refactor Buffer::write with std::span
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
13
src/buffer.h
13
src/buffer.h
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user