24#ifndef MYSQL_RANGES_BUFFER_INTERFACE_H
25#define MYSQL_RANGES_BUFFER_INTERFACE_H
98template <
class Self_tp,
112 [[nodiscard]]
explicit operator bool()
const {
return !
self().
empty(); }
118 [[nodiscard]]
bool empty()
const {
return self().
size() == 0; }
121 [[nodiscard]] std::ptrdiff_t
ssize()
const {
122 return std::ptrdiff_t(
self().
size());
150 return {
self().data(),
self().
size()};
156 [[nodiscard]]
auto *
begin() {
return self().data(); }
160 [[nodiscard]]
auto *
begin()
const {
return self().data(); }
164 [[nodiscard]]
auto *
cbegin()
const {
return self().data(); }
191 [[nodiscard]]
auto *
end() {
return self().data() +
self().
size(); }
195 [[nodiscard]]
auto *
end()
const {
return self().data() +
self().
size(); }
199 [[nodiscard]]
auto *
cend()
const {
return self().data() +
self().
size(); }
228 assert(
n <
self().
size());
229 return self().data()[
n];
235 assert(
n <
self().
size());
236 return self().data()[
n];
240 [[nodiscard]] Self_tp &
self() {
return static_cast<Self_tp &
>(*this); }
241 [[nodiscard]]
const Self_tp &
self()
const {
242 return static_cast<const Self_tp &
>(*this);
247template <std::derived_from<detail::Buffer_base> Buffer_t>
250 auto size_cmp =
left.size() <=>
right.size();
251 if (size_cmp != 0)
return size_cmp;
252 return std::memcmp(
left.data(),
right.data(),
left.size()) <=> 0;
256template <std::derived_from<detail::Buffer_base> Buffer_t>
259 return left.string_view() <=>
right.string_view();
263template <std::derived_from<detail::Buffer_base> Buffer_t>
264 requires Buffer_t::equality_enabled
266 if (
left.size() !=
right.size())
return false;
267 return std::memcmp(
left.data(),
right.data(),
left.size()) == 0;
271template <std::derived_from<detail::Buffer_base> Buffer_t>
272 requires Buffer_t::equality_enabled
295template <std::derived_from<mysql::ranges::detail::Buffer_base> Buffer_t>
296 requires Buffer_t::hash_enabled
297struct hash<Buffer_t> {
299 return std::hash<std::string_view>{}(
object.string_view());
CRTP base class that provides a rich API for classes that behave like byte buffers.
Definition: buffer_interface.h:102
bool empty() const
Return true if size() == 0.
Definition: buffer_interface.h:118
auto * cbegin() const
Return the begin as const char * or char *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:164
auto * ubegin() const
Return the begin as const unsigned char * or unsigned char *, const-ness inherited from Self_t::data(...
Definition: buffer_interface.h:171
bool operator!() const
Return true if size() == 0.
Definition: buffer_interface.h:115
auto * end() const
Return the end as const char * or char *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:195
static constexpr auto equality_algorithm
Definition: buffer_interface.h:104
auto * end()
Return the end as char *.
Definition: buffer_interface.h:191
auto * cbend() const
Return the end as const std::byte * or or std::byte *, const-ness inherited from Self_t::data() const...
Definition: buffer_interface.h:221
static constexpr bool hash_enabled
Definition: buffer_interface.h:107
auto * ubegin()
Return the begin as unsigned char *.
Definition: buffer_interface.h:167
auto * bend() const
Return the end as const std::byte * or std::byte *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:217
std::ptrdiff_t ssize() const
Return the size as std::ptrdiff_t.
Definition: buffer_interface.h:121
auto * bdata() const
Return the data buffer as const std::byte * or std::byte *, const-ness inherited from Self_t::data() ...
Definition: buffer_interface.h:143
static constexpr bool equality_enabled
Definition: buffer_interface.h:105
char & operator[](std::ptrdiff_t n)
Return reference the n'th element.
Definition: buffer_interface.h:226
auto * uend()
Return the end as unsigned char *.
Definition: buffer_interface.h:202
std::string_view string_view() const
Definition: buffer_interface.h:149
auto * bend()
Return the end as std::byte *.
Definition: buffer_interface.h:213
auto * bbegin() const
Return the begin as const std::byte * or std::byte *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:182
auto * udata()
Return the data buffer as unsigned char *.
Definition: buffer_interface.h:128
auto * begin() const
Return the begin as const char * or char *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:160
auto * uend() const
Return the end as const unsigned char * or unsigned char *, const-ness inherited from Self_t::data() ...
Definition: buffer_interface.h:206
auto * bbegin()
Return the begin as std::byte *.
Definition: buffer_interface.h:178
auto * cend() const
Return the end as const char * or char *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:199
auto * cuend() const
Return the end as const unsigned char * or unsigned char *, const-ness inherited from Self_t::data() ...
Definition: buffer_interface.h:210
auto * bdata()
Return the data buffer as std::byte *.
Definition: buffer_interface.h:139
auto * cubegin() const
Return the begin as const unsigned char * or unsigned char *, const-ness inherited from Self_t::data(...
Definition: buffer_interface.h:175
auto * cbbegin() const
Return the begin as const std::byte * or std::byte *, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:186
char operator[](std::ptrdiff_t n) const
Return the n'th element, const-ness inherited from Self_t::data() const.
Definition: buffer_interface.h:233
auto * udata() const
Return the data buffer as const unsigned char * or unsigned char *, const-ness inherited from Self_t:...
Definition: buffer_interface.h:134
auto * begin()
Return the begin as char *.
Definition: buffer_interface.h:156
Top of the hierarchy.
Definition: buffer_interface.h:42
void right(std::string *to_trim)
Definition: trim.h:41
void left(std::string *to_trim)
Definition: trim.h:35
Definition: buffer_interface.h:40
Definition: buffer_interface.h:40
::equality_enabled bool operator==(const Buffer_t &left, const Buffer_t &right)
Enable operator== for Buffer_interface subclasses.
Definition: buffer_interface.h:265
::equality_enabled bool operator!=(const Buffer_t &left, const Buffer_t &right)
Enable operator!= for Buffer_interface subclasses.
Definition: buffer_interface.h:273
Equality_algorithm
Definition: buffer_interface.h:48
Enable_hash
Definition: buffer_interface.h:50
auto operator<=>(const Buffer_t &left, const Buffer_t &right)
Enable fast comparison operators for Buffer_interface subclasses.
Definition: buffer_interface.h:249
decltype(auto) uchar_cast(Type_t &&value)
Shorthand for char_cast<unsigned char>.
Definition: char_cast.h:65
decltype(auto) byte_cast(Type_t &&value)
Shorthand for char_cast<std::byte>.
Definition: char_cast.h:71
size_t size(const char *const c)
Definition: base64.h:46
Define std::hash<Gtid>.
Definition: gtid.h:355
std::size_t operator()(const Buffer_t &object) const
Definition: buffer_interface.h:298
int n
Definition: xcom_base.cc:509