25#ifndef MYSQL_ROUTER_CLASSIC_PROTOCOL_CODEC_WIRE_H_
26#define MYSQL_ROUTER_CLASSIC_PROTOCOL_CODEC_WIRE_H_
33#include <system_error>
53 static constexpr size_t int_size{IntSize};
62 static constexpr size_t size() noexcept {
return int_size; }
73 auto int_val = v_.value();
79 std::copy_n(
reinterpret_cast<const std::byte *
>(&int_val), int_size,
88 static constexpr size_t max_size() noexcept {
return int_size; }
107 return std::make_pair(int_size,
value_type(value));
137 template <
class Accumulator>
139 if (v_.value() < 251) {
141 }
else if (v_.value() < 1 << 16) {
145 }
else if (v_.value() < (1 << 24)) {
157 static constexpr uint8_t varint_16{0xfc};
158 static constexpr uint8_t varint_24{0xfd};
159 static constexpr uint8_t varint_64{0xfe};
168 static constexpr size_t max_size() noexcept {
return 9; }
175 auto first_byte_res = accu.template step<borrowable::wire::FixedInt<1>>();
178 auto first_byte = first_byte_res->value();
180 if (first_byte < 251) {
182 }
else if (first_byte == varint_16) {
183 auto value_res = accu.template step<borrowable::wire::FixedInt<2>>();
187 }
else if (first_byte == varint_24) {
188 auto value_res = accu.template step<borrowable::wire::FixedInt<3>>();
192 }
else if (first_byte == varint_64) {
193 auto value_res = accu.template step<borrowable::wire::FixedInt<8>>();
211 :
public Codec<borrowable::wire::FixedInt<1>> {
215 static constexpr uint8_t nul_byte{0xfb};
227 const uint8_t nul_val = *
static_cast<const uint8_t *
>(
buffer.
data());
229 if (nul_val != nul_byte) {
249 size_t size() const noexcept {
return v_; }
252 return std::numeric_limits<size_t>::max();
261 auto *first =
static_cast<std::uint8_t *
>(
buffer.
data());
262 auto *last = first + size();
265 std::fill(first, last, 0);
287template <
bool Borrowed>
293 : v_{
std::move(v)}, caps_{caps} {}
295 constexpr size_t size() const noexcept {
return v_.value().size(); }
300 return std::numeric_limits<size_t>::max();
310 std::copy_n(
reinterpret_cast<const std::byte *
>(v_.value().data()), size(),
322 return std::make_pair(
338template <
bool Borrowed>
341 template <
class Accumulator>
360 return std::numeric_limits<size_t>::max();
367 auto var_string_len_res = accu.template step<borrowable::wire::VarInt>();
371 auto var_string_res =
372 accu.template step<borrowable::wire::String<Borrowed>>(
373 var_string_len_res->value());
388template <
bool Borrowed>
391 Codec<borrowable::wire::NulTermString<Borrowed>>> {
392 template <
class Accumulator>
394 return accu.template step<borrowable::wire::String<Borrowed>>(v_)
411 return std::numeric_limits<size_t>::max();
418 const auto *first =
static_cast<const uint8_t *
>(
buffer.
data());
421 const auto *pos =
std::find(first, last,
'\0');
434 return std::make_pair(len + 1,
constexpr Codec(value_type v, capabilities::value_type)
Definition: classic_protocol_codec_wire.h:57
static constexpr size_t max_size() noexcept
maximum bytes which may scanned by the decoder.
Definition: classic_protocol_codec_wire.h:88
stdx::expected< size_t, std::error_code > encode(net::mutable_buffer buffer) const
encode value_type into buffer.
Definition: classic_protocol_codec_wire.h:67
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type)
Definition: classic_protocol_codec_wire.h:90
const value_type v_
Definition: classic_protocol_codec_wire.h:111
static constexpr size_t size() noexcept
size of the encoded object.
Definition: classic_protocol_codec_wire.h:62
constexpr auto accumulate_fields(Accumulator &&accu) const
Definition: classic_protocol_codec_wire.h:393
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type)
Definition: classic_protocol_codec_wire.h:414
friend base_type
Definition: classic_protocol_codec_wire.h:403
static size_t max_size() noexcept
Definition: classic_protocol_codec_wire.h:408
const value_type v_
Definition: classic_protocol_codec_wire.h:440
constexpr Codec(value_type val, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:405
Codec(value_type, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:217
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type)
Definition: classic_protocol_codec_wire.h:220
const capabilities::value_type caps_
Definition: classic_protocol_codec_wire.h:329
constexpr Codec(value_type v, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:292
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type)
Definition: classic_protocol_codec_wire.h:316
stdx::expected< size_t, std::error_code > encode(const net::mutable_buffer &buffer) const
Definition: classic_protocol_codec_wire.h:303
constexpr size_t size() const noexcept
Definition: classic_protocol_codec_wire.h:295
const value_type v_
Definition: classic_protocol_codec_wire.h:328
static size_t max_size() noexcept
Definition: classic_protocol_codec_wire.h:297
constexpr Codec(value_type v, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:165
constexpr auto accumulate_fields(Accumulator &&accu) const
Definition: classic_protocol_codec_wire.h:138
const value_type v_
Definition: classic_protocol_codec_wire.h:203
friend __base
Definition: classic_protocol_codec_wire.h:163
static constexpr size_t max_size() noexcept
Definition: classic_protocol_codec_wire.h:168
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:170
const value_type v_
Definition: classic_protocol_codec_wire.h:382
constexpr Codec(value_type val, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:354
constexpr auto accumulate_fields(Accumulator &&accu) const
Definition: classic_protocol_codec_wire.h:342
friend base_type
Definition: classic_protocol_codec_wire.h:352
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:363
static size_t max_size() noexcept
Definition: classic_protocol_codec_wire.h:357
Codec(value_type val, capabilities::value_type caps)
Definition: classic_protocol_codec_wire.h:247
size_t size() const noexcept
Definition: classic_protocol_codec_wire.h:249
static stdx::expected< std::pair< size_t, value_type >, std::error_code > decode(const net::const_buffer &buffer, capabilities::value_type)
Definition: classic_protocol_codec_wire.h:270
stdx::expected< size_t, std::error_code > encode(const net::mutable_buffer &buffer) const
Definition: classic_protocol_codec_wire.h:255
const capabilities::value_type caps_
Definition: classic_protocol_codec_wire.h:279
const value_type v_
Definition: classic_protocol_codec_wire.h:278
size_t value_type
Definition: classic_protocol_codec_wire.h:245
static size_t max_size() noexcept
Definition: classic_protocol_codec_wire.h:251
Codec for a type.
Definition: classic_protocol_codec_base.h:71
Definition: classic_protocol_wire.h:105
Definition: classic_protocol_wire.h:111
Definition: classic_protocol_wire.h:117
Definition: classic_protocol_wire.h:129
Definition: classic_protocol_wire.h:102
Definition: classic_protocol_wire.h:58
Definition: classic_protocol_wire.h:134
Definition: classic_protocol_wire.h:37
Definition: classic_protocol_wire.h:96
Definition: classic_protocol_wire.h:64
Generator of decoded Types of a buffer.
Definition: classic_protocol_codec_base.h:152
result_type result() const
get result of the step().
Definition: classic_protocol_codec_base.h:218
CRTP base for the Codec's encode part.
Definition: classic_protocol_codec_base.h:374
void * data() const noexcept
Definition: buffer.h:118
size_t size() const noexcept
Definition: buffer.h:119
constexpr const value_type & value() const &
Definition: expected.h:687
constexpr const error_type & error() const &
Definition: expected.h:736
constexpr DWORD buf_size
Definition: create_def.cc:228
unsigned char byte
Blob class.
Definition: common.h:150
uint16_t value_type
Definition: vt100.h:183
borrowable::binary::Null Null
Definition: classic_protocol_binary.h:336
borrowable::wire::FixedInt< Size > FixedInt
Definition: classic_protocol_wire.h:146
borrowable::wire::VarInt VarInt
Definition: classic_protocol_wire.h:147
std::bitset< 32 > value_type
Definition: classic_protocol_constants.h:72
Definition: classic_protocol_binary.h:38
std::error_code make_error_code(codec_errc e) noexcept
Definition: classic_protocol_codec_error.h:85
const byte * find(const Pages *pages, const page_id_t &page_id) noexcept
Find a doublewrite copy of a page.
Definition: buf0dblwr.cc:3578
bool distance(const dd::Spatial_reference_system *srs, const Geometry *g1, const Geometry *g2, double *distance, bool *is_null) noexcept
Computes the distance between two geometries.
Definition: distance.cc:39
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:417
size_t buffer_size(const ConstBufferSequence &buffers) noexcept
Definition: buffer.h:312
Definition: varlen_sort.h:174
constexpr auto make_unexpected(E &&e) -> unexpected< std::decay_t< E > >
Definition: expected.h:124
constexpr std::enable_if_t< std::is_integral< IntegerType >::value, IntegerType > byteswap(IntegerType t) noexcept
Definition: bit.h:141