26#ifndef MYSQL_ROUTER_CLASSIC_PROTOCOL_CODEC_BASE_H_
27#define MYSQL_ROUTER_CLASSIC_PROTOCOL_CODEC_BASE_H_
32#include <system_error>
83template <
class T,
class DynamicBuffer>
86 DynamicBuffer &&dyn_buffer) {
92 const auto orig_size = dyn_buffer.size();
93 const auto codec_size = codec.size();
96 dyn_buffer.grow(codec_size);
98 const auto res = codec.encode(dyn_buffer.data(orig_size, codec_size));
100 dyn_buffer.shrink(codec_size);
104 dyn_buffer.shrink(codec_size - res.value());
136template <
class T,
class... Args>
183 size_t sz = std::numeric_limits<size_t>::max()) {
186 auto step_res = step_<T>(sz);
203 size_t sz = std::numeric_limits<size_t>::max()) {
228 if (sz != std::numeric_limits<size_t>::max()) {
230 if (
buf.size() < sz) {
239 return decode_res->second;
284 if (!
res_)
return *
this;
375 constexpr size_t size() const noexcept {
376 return static_cast<const T *
>(
this)->accumulate_fields(
382 return static_cast<const T *
>(
this)->accumulate_fields(
Codec for a type.
Definition: classic_protocol_codec_base.h:72
Generator of decoded Types of a buffer.
Definition: classic_protocol_codec_base.h:150
stdx::expected< typename Codec< T >::value_type, std::error_code > step_(size_t sz)
Definition: classic_protocol_codec_base.h:224
net::const_buffer buffer_
Definition: classic_protocol_codec_base.h:242
const capabilities::value_type caps_
Definition: classic_protocol_codec_base.h:243
result_type res_
Definition: classic_protocol_codec_base.h:246
DecodeBufferAccumulator(const net::const_buffer &buffer, capabilities::value_type caps, size_t consumed=0)
construct a DecodeBufferAccumulator.
Definition: classic_protocol_codec_base.h:162
size_t consumed_
Definition: classic_protocol_codec_base.h:244
stdx::expected< typename Codec< T >::value_type, std::error_code > try_step(size_t sz=std::numeric_limits< size_t >::max())
try decoding a Type from the buffer sequence.
Definition: classic_protocol_codec_base.h:202
result_type result() const
get result of the step().
Definition: classic_protocol_codec_base.h:216
stdx::expected< typename Codec< T >::value_type, std::error_code > step(size_t sz=std::numeric_limits< size_t >::max())
decode a Type from the buffer sequence.
Definition: classic_protocol_codec_base.h:182
CRTP base for the Codec's encode part.
Definition: classic_protocol_codec_base.h:371
stdx::expected< size_t, std::error_code > encode(net::mutable_buffer buffer) const
Definition: classic_protocol_codec_base.h:380
constexpr size_t size() const noexcept
Definition: classic_protocol_codec_base.h:375
constexpr capabilities::value_type caps() const noexcept
Definition: classic_protocol_codec_base.h:386
const capabilities::value_type caps_
Definition: classic_protocol_codec_base.h:389
constexpr EncodeBase(capabilities::value_type caps)
Definition: classic_protocol_codec_base.h:373
accumulator of encoded buffers.
Definition: classic_protocol_codec_base.h:262
result_type result() const
get result the steps().
Definition: classic_protocol_codec_base.h:302
EncodeBufferAccumulator & step(const T &v)
encode a T into the buffer and move position forward.
Definition: classic_protocol_codec_base.h:283
EncodeBufferAccumulator(net::mutable_buffer buffer, capabilities::value_type caps, size_t consumed=0)
construct a encode-buffer-accumulator.
Definition: classic_protocol_codec_base.h:273
const net::mutable_buffer buffer_
Definition: classic_protocol_codec_base.h:309
const capabilities::value_type caps_
Definition: classic_protocol_codec_base.h:310
result_type res_
Definition: classic_protocol_codec_base.h:313
size_t consumed_
Definition: classic_protocol_codec_base.h:311
accumulates the sizes of encoded T's.
Definition: classic_protocol_codec_base.h:329
constexpr result_type result() const
Definition: classic_protocol_codec_base.h:354
constexpr EncodeSizeAccumulator(capabilities::value_type caps)
construct a EncodeSizeAccumulator.
Definition: classic_protocol_codec_base.h:336
size_t result_type
Definition: classic_protocol_codec_base.h:331
size_t consumed_
Definition: classic_protocol_codec_base.h:357
const capabilities::value_type caps_
Definition: classic_protocol_codec_base.h:358
constexpr EncodeSizeAccumulator & step(const T &v) noexcept
accumulate the size() of encoded T.
Definition: classic_protocol_codec_base.h:345
constexpr const error_type & error() const &
Definition: expected.h:755
Definition: buf0block_hint.cc:30
std::bitset< 32 > value_type
Definition: classic_protocol_constants.h:73
Definition: classic_protocol_binary.h:39
stdx::expected< size_t, std::error_code > encode(const T &v, capabilities::value_type caps, DynamicBuffer &&dyn_buffer)
encode a message into a dynamic buffer.
Definition: classic_protocol_codec_base.h:84
std::error_code make_error_code(codec_errc e) noexcept
Definition: classic_protocol_codec_error.h:86
stdx::expected< std::pair< size_t, T >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type caps)
decode a message from a buffer.
Definition: classic_protocol_codec_base.h:119
constexpr size_t bytes_per_bits(size_t bits)
Definition: classic_protocol_codec_base.h:55
stdx::expected< std::pair< size_t, T >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type caps, Args &&...args)
decode a message from a buffer.
Definition: classic_protocol_codec_base.h:137
Definition: http_server_component.cc:34
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
unexpected(E) -> unexpected< E >