26#ifndef MYSQL_HARNESS_NET_TS_BUFFER_H_
27#define MYSQL_HARNESS_NET_TS_BUFFER_H_
36#include <system_error>
62 class stream_category_impl :
public std::error_category {
64 const char *
name()
const noexcept override {
return "stream"; }
65 std::string message(
int ev)
const override {
77 const std::error_condition &other)
const noexcept override {
78 if (*
this == other.category() ||
79 std::string_view(
name()) ==
80 std::string_view(other.category().name())) {
81 return mycode == other.value();
88 int mycode)
const noexcept override {
89 if (*
this == other.category() ||
90 std::string_view(
name()) ==
91 std::string_view(other.category().name())) {
92 return mycode == other.value();
99 static stream_category_impl instance;
146 const size_t inc_size = std::min(
n,
size_);
147 data_ =
static_cast<const char *
>(
data_) + inc_size;
182 return std::addressof(b);
186 return std::addressof(b) + 1;
211 return std::addressof(b);
216 return std::addressof(b) + 1;
223template <
class T,
class BufferType,
231 std::is_same<Begin, End>,
237template <
class T,
class BufferType,
class =
void>
240template <
class T,
class BufferType>
242 T, BufferType, std::void_t<buffer_sequence_requirements<T, BufferType>>>
262template <
class T,
class =
void>
273template <
class T,
class U = std::remove_const_t<T>>
276 -> std::enable_if_t<std::conjunction<
278 std::is_copy_constructible<U>,
284 std::is_same<
decltype(__const_x->size()),
size_t>,
286 std::is_same<
decltype(__const_x->max_size()),
size_t>,
288 std::is_same<
decltype(__const_x->capacity()),
size_t>,
290 std::is_same<
decltype(__const_x->data(__n, __n)),
291 typename T::const_buffers_type>,
293 std::is_same<
decltype(__x->data(__n, __n)),
294 typename T::mutable_buffers_type>,
296 std::is_void<
decltype(__x->grow(__n))>,
298 std::is_void<
decltype(__x->shrink(__n))>,
300 std::is_void<
decltype(__x->consume(__n))>>::value>;
312template <
class ConstBufferSequence>
313inline size_t buffer_size(
const ConstBufferSequence &buffers)
noexcept {
314 size_t total_size{0};
320 total_size += b.
size();
348template <
class MutableBufferSequence,
class ConstBufferSequence>
350 const ConstBufferSequence &src,
351 const size_t max_size)
noexcept {
352 size_t transfered{0};
361 while (transfered < max_size) {
363 if (src_buf.
size() == 0) {
364 if (src_cur == src_end)
break;
367 if (dest_buf.
size() == 0) {
368 if (dest_cur == dest_end)
break;
372 size_t to_copy = std::min(dest_buf.
size(), src_buf.
size());
373 to_copy = std::min(to_copy, max_size - transfered);
378 std::next(
static_cast<const char *
>(src_buf.
data()), to_copy),
379 static_cast<char *
>(dest_buf.
data()));
384 transfered += to_copy;
390template <
class MutableBufferSequence,
class ConstBufferSequence>
392 const ConstBufferSequence &src)
noexcept {
393 return buffer_copy(dest, src, std::numeric_limits<size_t>::max());
399 const size_t inc_size = std::min(
n, b.size());
401 return {
static_cast<char *
>(b.data()) + inc_size, b.size() - inc_size};
408 const size_t inc_size = std::min(
n, b.size());
409 return {
static_cast<const char *
>(b.data()) + inc_size, b.size() - inc_size};
423 return {b.
data(), std::min(b.size(),
n)};
428 return {b.
data(), std::min(b.size(),
n)};
434 return {
n ? data :
nullptr,
sizeof(*data) *
n};
439 return {
n ? data :
nullptr,
sizeof(*data) *
n};
443template <
class T,
size_t N>
448template <
class T,
size_t N>
453template <
class T,
size_t N>
458template <
class T,
size_t N>
463template <
class T,
size_t N>
464inline const_buffer
buffer(
const std::array<T, N> &data)
noexcept {
468template <
class T,
class Allocator>
473template <
class T,
class Allocator>
478template <
class CharT,
class Traits,
class Allocator>
480 std::basic_string<CharT, Traits, Allocator> &data)
noexcept {
485template <
class CharT,
class Traits,
class Allocator>
487 const std::basic_string<CharT, Traits, Allocator> &data)
noexcept {
492template <
class CharT,
class Traits>
494 const std::basic_string_view<CharT, Traits> &data)
noexcept {
499template <
class T, std::
size_t E>
505template <
class T,
size_t N>
510template <
class T,
size_t N>
515template <
class T,
size_t N>
520template <
class T,
size_t N>
525template <
class T,
size_t N>
526inline const_buffer
buffer(
const std::array<T, N> &data,
size_t n)
noexcept {
530template <
class T,
class Allocator>
536template <
class T,
class Allocator>
542template <
class CharT,
class Traits,
class Allocator>
548template <
class CharT,
class Traits,
class Allocator>
550 const std::basic_string<CharT, Traits, Allocator> &data,
555template <
class T, std::
size_t E>
604 throw std::length_error(
"overflow");
606 v_.resize(
v_.size() +
n);
623 size_t m = std::min(
n,
size());
627 v_.erase(
v_.begin(), std::next(
v_.begin(), m));
640template <
class T,
class Allocator>
650template <
class CharT,
class Traits,
class Allocator>
652 std::basic_string<CharT, Traits, Allocator>> {
660template <
class T,
class Allocator>
662 std::vector<T, Allocator> &vec)
noexcept {
666template <
class T,
class Allocator>
668 std::vector<T, Allocator> &vec,
size_t n)
noexcept {
672template <
class CharT,
class Traits,
class Allocator>
674 std::basic_string<CharT, Traits, Allocator> &
str)
noexcept {
678template <
class CharT,
class Traits,
class Allocator>
680 std::basic_string<CharT, Traits, Allocator> &
str,
size_t n)
noexcept {
688 size_t operator()(
const std::error_code &ec,
size_t )
const {
689 if (!ec)
return std::numeric_limits<size_t>::max();
701 if (!ec &&
n <
minimum_)
return std::numeric_limits<size_t>::max();
721 constexpr size_t N = std::numeric_limits<size_t>::max();
733template <
class BufferType>
752 throw std::length_error(
"size() MUST be less than max_size().");
775template <
class BufferSequence,
class BufferType>
797 for (; (from_cur != from_end) && to_bufs.
size() < to_bufs.
max_size() &&
802 if (cur_buf.size() > to_skip) {
803 const size_t avail = cur_buf.size() - to_skip;
804 const size_t to_use = std::min(avail, max_size);
809 to_skip -= cur_buf.size();
834template <
class SyncReadStream,
class MutableBufferSequence>
836 SyncReadStream &stream,
const MutableBufferSequence &buffers)
837 requires(is_mutable_buffer_sequence_v<MutableBufferSequence>)
844template <
class SyncReadStream,
class MutableBufferSequence,
845 class CompletionCondition>
847 SyncReadStream &stream,
const MutableBufferSequence &buffers,
848 CompletionCondition cond)
849 requires(is_mutable_buffer_sequence_v<MutableBufferSequence>)
854 std::error_code ec{};
861 while (0 != (to_transfer = cond(ec, consumable.
total_consumed())) &&
863 auto res = stream.read_some(consumable.
prepare(to_transfer));
864 if (!res)
return res;
872template <
class SyncReadStream,
class DynamicBuffer>
875 requires(is_dynamic_buffer_v<DynamicBuffer>)
880template <
class SyncReadStream,
class DynamicBuffer,
class CompletionCondition>
883 CompletionCondition cond)
884 requires(is_dynamic_buffer_v<DynamicBuffer>)
886 std::error_code ec{};
888 size_t transferred{};
891 while (0 != (to_transfer = cond(ec, transferred)) &&
892 b.size() != b.max_size()) {
893 auto orig_size = b.size();
895 auto avail = b.capacity() - orig_size;
896 size_t grow_size = avail ? avail : 4 * 1024;
897 size_t space_left = b.max_size() - b.size();
899 grow_size = std::min(grow_size, space_left);
901 grow_size = std::min(grow_size, to_transfer);
904 auto res = stream.read_some(b.data(orig_size, grow_size));
910 const auto error_code = res.error();
912 std::errc::resource_unavailable_try_again) ||
924 b.shrink(grow_size - *res);
927 return {transferred};
931template <
class AsyncReadStream,
class DynamicBuffer,
class CompletionCondition,
932 class CompletionToken>
934 CompletionCondition completion_condition,
935 CompletionToken &&token)
936 requires(is_dynamic_buffer_v<DynamicBuffer>)
940 using compl_handler_type =
typename decltype(
init)::completion_handler_type;
942 [&stream, b_ = std::forward<DynamicBuffer>(b),
943 compl_cond_ = completion_condition,
944 compl_handler_ = std::forward<compl_handler_type>(
945 init.completion_handler)](std::error_code ec)
mutable {
947 compl_handler_(ec, 0);
951 const auto res =
net::read(stream, b_, compl_cond_);
954 compl_handler_(res.error(), 0);
956 compl_handler_({}, res.value());
962 return init.result.get();
965template <
class AsyncReadStream,
class DynamicBuffer,
class CompletionToken>
967 CompletionToken &&token)
968 requires(is_dynamic_buffer_v<DynamicBuffer>)
971 std::forward<CompletionToken>(token));
976template <
class SyncWriteStream,
class ConstBufferSequence>
978 SyncWriteStream &stream,
const ConstBufferSequence &buffers)
979 requires(is_const_buffer_sequence_v<ConstBufferSequence>)
984template <
class SyncWriteStream,
class ConstBufferSequence,
985 class CompletionCondition>
987 SyncWriteStream &stream,
const ConstBufferSequence &buffers,
988 CompletionCondition cond)
989 requires(is_const_buffer_sequence_v<ConstBufferSequence>)
991 std::error_code ec{};
998 while (0 != (to_transfer = cond(ec, consumable.
total_consumed())) &&
1000 auto res = stream.write_some(consumable.
prepare(to_transfer));
1020template <
class SyncWriteStream,
class DynamicBuffer>
1023 requires(is_dynamic_buffer_v<DynamicBuffer>)
1028template <
class SyncWriteStream,
class DynamicBuffer,
class CompletionCondition>
1031 CompletionCondition cond)
1032 requires(is_dynamic_buffer_v<DynamicBuffer>)
1034 std::error_code ec{};
1037 size_t transferred{};
1039 while (0 != (to_transfer = cond(ec, transferred)) && (b.size() != 0)) {
1040 auto res = stream.write_some(b.data(0, std::min(b.size(), to_transfer)));
1044 transferred += *res;
1055 transferred == 0)) {
1064template <
class AsyncWriteStream,
class ConstBufferSequence,
1065 class CompletionCondition,
class CompletionToken>
1066void async_write(AsyncWriteStream &stream,
const ConstBufferSequence &buffers,
1067 CompletionCondition cond, CompletionToken &&token)
1068 requires(is_const_buffer_sequence_v<ConstBufferSequence>)
1074 [&stream, &buffers, cond,
1075 compl_handler = std::move(
init.completion_handler)](std::error_code ec) {
1077 compl_handler(ec, 0);
1081 const auto res =
net::write(stream, buffers, cond);
1084 compl_handler(res.error(), 0);
1086 compl_handler({}, res.value());
1092 return init.result.get();
1095template <
class AsyncWriteStream,
class ConstBufferSequence,
1096 class CompletionToken>
1097void async_write(AsyncWriteStream &stream,
const ConstBufferSequence &buffers,
1098 CompletionToken &&token)
1099 requires(is_const_buffer_sequence_v<ConstBufferSequence>)
1102 std::forward<CompletionToken>(token));
1105template <
class AsyncWriteStream,
class DynamicBuffer,
1106 class CompletionCondition,
class CompletionToken>
1108 CompletionCondition cond, CompletionToken &&token)
1109 requires(is_dynamic_buffer_v<DynamicBuffer>)
1113 using compl_handler_type =
typename decltype(
init)::completion_handler_type;
1116 [&stream,
buf = std::forward<DynamicBuffer>(b), cond,
1117 compl_handler = std::forward<compl_handler_type>(
1118 init.completion_handler)](std::error_code ec)
mutable {
1120 compl_handler(ec, 0);
1125 stream, std::forward<DynamicBuffer>(
buf), cond);
1128 compl_handler(res.error(), 0);
1130 compl_handler({}, res.value());
1136 return init.result.get();
1139template <
class AsyncWriteStream,
class DynamicBuffer,
class CompletionToken>
1141 CompletionToken &&token)
1142 requires(is_dynamic_buffer_v<DynamicBuffer>)
1144 return async_write(stream, std::forward<DynamicBuffer>(b),
static mysql_service_status_t init()
Component initialization.
Definition: audit_api_message_emit.cc:571
Definition: executor.h:72
const_buffer(const mutable_buffer &b) noexcept
Definition: buffer.h:139
const void * data() const noexcept
Definition: buffer.h:142
const void * data_
Definition: buffer.h:153
size_t size() const noexcept
Definition: buffer.h:143
size_t size_
Definition: buffer.h:154
const_buffer() noexcept
Definition: buffer.h:137
const_buffer(const void *p, size_t n) noexcept
Definition: buffer.h:138
const_buffer & operator+=(size_t n) noexcept
Definition: buffer.h:145
size_t total_consumed() const
Definition: buffer.h:825
void consume(size_t n)
mark bytes as consumed from the beginning of the unconsumed sequence.
Definition: buffer.h:822
const BufferSequence & buffers_
Definition: buffer.h:828
consuming_buffers(const BufferSequence &buffers)
Definition: buffer.h:780
prepared_buffer_type prepare(size_t max_size)
prepare a buffer sequence, skipping the already consumed bytes.
Definition: buffer.h:789
size_t total_consumed_
Definition: buffer.h:829
T & v_
Definition: buffer.h:632
const_buffers_type data(size_t pos, size_t n) const noexcept
Definition: buffer.h:591
size_t max_size() const noexcept
max number of bytes.
Definition: buffer.h:582
void grow(size_t n)
append bytes at the end.
Definition: buffer.h:602
dynamic_buffer_base(T &v) noexcept
Definition: buffer.h:569
void consume(size_t n)
remove bytes at the start.
Definition: buffer.h:622
dynamic_buffer_base(T &v, size_t max_size) noexcept
Definition: buffer.h:571
void shrink(size_t n)
remove bytes at the end.
Definition: buffer.h:612
mutable_buffers_type data(size_t pos, size_t n)
Definition: buffer.h:595
const size_t max_size_
Definition: buffer.h:633
size_t size() const noexcept
number of bytes.
Definition: buffer.h:577
size_t capacity() const noexcept
max number of bytes without requiring reallocation.
Definition: buffer.h:587
mutable_buffer(void *p, size_t n) noexcept
Definition: buffer.h:117
mutable_buffer & operator+=(size_t n) noexcept
Definition: buffer.h:122
size_t size_
Definition: buffer.h:130
void * data() const noexcept
Definition: buffer.h:119
mutable_buffer() noexcept
Definition: buffer.h:115
void * data_
Definition: buffer.h:129
size_t size() const noexcept
Definition: buffer.h:120
const_iterator begin() const
Definition: buffer.h:747
typename storage_type::iterator iterator
Definition: buffer.h:745
BufferType value_type
Definition: buffer.h:736
constexpr size_t max_size() const noexcept
Definition: buffer.h:760
size_t used_
Definition: buffer.h:764
typename storage_type::const_iterator const_iterator
Definition: buffer.h:744
void push_back(value_type &&v)
Definition: buffer.h:750
size_t size() const noexcept
Definition: buffer.h:758
std::array< BufferType, 16 > storage_type
Definition: buffer.h:743
const_iterator end() const
Definition: buffer.h:748
storage_type bufs_
Definition: buffer.h:763
size_t operator()(const std::error_code &ec, size_t) const
Definition: buffer.h:688
size_t minimum_
Definition: buffer.h:707
size_t operator()(const std::error_code &ec, size_t n) const
Definition: buffer.h:700
transfer_at_least(size_t m)
Definition: buffer.h:698
transfer_exactly(size_t m)
Definition: buffer.h:714
size_t exact_
Definition: buffer.h:729
size_t operator()(const std::error_code &ec, size_t n) const
Definition: buffer.h:719
constexpr const error_type & error() const &
Definition: expected.h:755
const char * p
Definition: ctype-mb.cc:1225
if(!(yy_init))
Definition: lexyy.cc:1144
bool equivalent(const MDL_ticket *a, const MDL_ticket *b, enum_mdl_duration target_duration)
Definition: mdl.cc:2617
void copy(Shards< COUNT > &dst, const Shards< COUNT > &src) noexcept
Copy the counters, overwrite destination.
Definition: ut0counter.h:354
std::atomic< Type > N
Definition: ut0counter.h:225
uint16_t value_type
Definition: vt100.h:184
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1117
Definition: buf0block_hint.cc:30
Definition: http_server_component.cc:34
mutable_buffer to_mutable_buffer(T *data, size_t n)
Definition: buffer.h:433
const_buffer to_const_buffer(const T *data, size_t n)
Definition: buffer.h:438
auto dynamic_buffer_requirements(U *__x=nullptr, const U *__const_x=nullptr, size_t __n=0) -> std::enable_if_t< std::conjunction< std::is_copy_constructible< U >, is_const_buffer_sequence< typename T::const_buffers_type >, is_mutable_buffer_sequence< typename T::mutable_buffers_type >, std::is_same< decltype(__const_x->size()), size_t >, std::is_same< decltype(__const_x->max_size()), size_t >, std::is_same< decltype(__const_x->capacity()), size_t >, std::is_same< decltype(__const_x->data(__n, __n)), typename T::const_buffers_type >, std::is_same< decltype(__x->data(__n, __n)), typename T::mutable_buffers_type >, std::is_void< decltype(__x->grow(__n))>, std::is_void< decltype(__x->shrink(__n))>, std::is_void< decltype(__x->consume(__n))> >::value >
std::bool_constant< std::conjunction_v< std::is_same< Begin, End >, std::is_convertible< typename std::iterator_traits< Begin >::value_type, BufferType > > > buffer_sequence_requirements
Definition: buffer.h:235
const std::error_category & stream_category() noexcept
Definition: buffer.h:61
size_t buffer_size< mutable_buffer >(const mutable_buffer &b) noexcept
Definition: buffer.h:332
constexpr bool is_const_buffer_sequence_v
Definition: buffer.h:163
constexpr bool is_dynamic_buffer_v
Definition: buffer.h:176
void async_read(AsyncReadStream &stream, DynamicBuffer &&b, CompletionCondition completion_condition, CompletionToken &&token)
Definition: buffer.h:933
stdx::expected< size_t, std::error_code > write(SyncWriteStream &stream, const ConstBufferSequence &buffers)
Definition: buffer.h:977
const const_buffer * buffer_sequence_end(const const_buffer &b) noexcept
Definition: buffer.h:185
stream_errc
Definition: buffer.h:49
dynamic_vector_buffer< T, Allocator > dynamic_buffer(std::vector< T, Allocator > &vec) noexcept
Definition: buffer.h:661
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
const const_buffer * buffer_sequence_begin(const const_buffer &b) noexcept
Definition: buffer.h:180
constexpr bool is_mutable_buffer_sequence_v
Definition: buffer.h:169
size_t buffer_copy(const MutableBufferSequence &dest, const ConstBufferSequence &src, const size_t max_size) noexcept
copy bytes from a ConstBufferSequence to a MutableBufferSequence.
Definition: buffer.h:349
size_t buffer_size(const ConstBufferSequence &buffers) noexcept
Definition: buffer.h:313
stdx::expected< size_t, std::error_code > read(SyncReadStream &stream, const MutableBufferSequence &buffers)
Definition: buffer.h:835
void async_write(AsyncWriteStream &stream, const ConstBufferSequence &buffers, CompletionCondition cond, CompletionToken &&token)
Definition: buffer.h:1066
size_t buffer_size< const_buffer >(const const_buffer &b) noexcept
Definition: buffer.h:327
mutable_buffer operator+(const mutable_buffer &b, size_t n) noexcept
Definition: buffer.h:398
void async_write(AsyncWriteStream &stream, DynamicBuffer &&b, CompletionToken &&token)
Definition: buffer.h:1140
std::error_condition make_error_condition(net::stream_errc e) noexcept
Definition: buffer.h:107
std::error_code make_error_code(net::stream_errc e) noexcept
Definition: buffer.h:103
Definition: gcs_xcom_synode.h:64
unexpected(E) -> unexpected< E >
required string type
Definition: replication_group_member_actions.proto:34
case opt name
Definition: sslopt-case.h:29
int n
Definition: xcom_base.cc:509