6#include "roo_backport.h"
7#include "roo_backport/byte.h"
8#include "roo_backport/string_view.h"
9#include "roo_io/data/read.h"
10#include "roo_io/data/write.h"
11#include "roo_io/memory/load.h"
12#include "roo_io/memory/store.h"
27 const roo::byte*
data()
const {
return nullptr; }
28 size_t size()
const {
return 0; }
38 const roo::byte*
data()
const {
return data_; }
39 size_t size()
const {
return N; }
41 roo::byte*
data() {
return data_; }
59 const roo::byte*
data()
const {
return data_.get(); }
60 size_t size()
const {
return size_; }
64 std::unique_ptr<roo::byte[]> data_;
87 const roo::byte*
data()
const {
88 return data_.empty() ?
nullptr : &*data_.begin();
91 size_t pos()
const {
return pos_; }
92 size_t size()
const {
return data_.size(); }
94 bool eos()
const {
return pos_ >= data_.size(); }
99 if (pos_ > data_.size()) {
100 data_.insert(data_.end(), pos_ - data_.size(), roo::byte{0});
110 if (pos_ > data_.size()) {
111 data_.insert(data_.end(), pos_ - data_.size(), roo::byte{0});
133 std::vector<roo::byte> data_;
138template <
typename T,
typename Itr,
typename S = Serializer<T>,
typename =
void>
148template <
typename T,
typename Itr>
151 std::declval<const T&>(),
152 std::declval<Itr&>()),
160template <
typename T,
typename Itr>
228 result = roo_io::LoadS8(data);
251 result = roo_io::LoadU8(data);
274 result = roo_io::LoadBeS16(data);
297 result = roo_io::LoadBeU16(data);
320 result = roo_io::LoadBeS32(data);
343 result = roo_io::LoadBeU32(data);
366 result = roo_io::LoadBeS64(data);
389 result = roo_io::LoadBeU64(data);
402 const roo::byte*
data()
const {
return data_; }
403 size_t size()
const {
return size_; }
406 const roo::byte* data_;
414 reinterpret_cast<const roo::byte*
>(
val.data()),
val.size());
421 roo::string_view&
result)
const {
422 result = roo::string_view(
reinterpret_cast<const char*
>(data),
len);
428template <
typename T,
typename RandomItr>
430 size_t begin =
result.pos();
434 size_t end =
result.pos();
435 size_t len = end - (begin + 2);
469template <
typename T1,
typename T2>
471 template <
typename RandomItr>
485template <
typename T1,
typename T2>
488 std::pair<T1, T2>&
result)
const {
507template <
size_t index,
typename RandomItr,
typename... Types>
512 if constexpr (index <
sizeof...(Types) - 1) {
517template <
typename... Types>
519 template <
typename RandomItr>
532template <
size_t index,
typename... Types>
534 const roo::byte* data,
540 if constexpr (index <
sizeof...(Types) - 1) {
549template <
typename... Types>
552 std::tuple<Types...>&
result)
const {
Mutable serialized buffer supporting append and random-position writes.
void write(roo::byte b)
Iterator contract: writes one byte at current position and advances.
const roo::byte * data() const
void fail(RpcStatus status)
void seek(size_t position)
size_t write(const roo::byte *buf, size_t count)
SerializedByteArrayAdapter(const roo::byte *data, size_t size)
const roo::byte * data() const
Serialized holder for variable-sized payloads stored on heap.
const roo::byte * data() const
SimpleSerialized(std::unique_ptr< roo::byte[]> data, size_t size)
SimpleSerialized(RpcStatus error)
Serialized holder for small fixed-size payloads.
const roo::byte * data() const
StaticSerialized()=default
constexpr void SerializeTupleRecursive(const std::tuple< Types... > &t, RandomItr &result)
std::tuple<Types...>.
constexpr RpcStatus DeserializeTupleRecursive(std::tuple< Types... > &t, const roo::byte *data, size_t len)
constexpr RpcStatus DeserializeMember(const roo::byte *&data, size_t &len, T &result)
void SerializeInto(const T &val, Itr &output)
void SerializeMemberInto(const T &val, RandomItr &result)
Serializes nested member with 16-bit big-endian length prefix.
RpcStatus deserialize(const roo::byte *data, size_t len, Void &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, bool &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, int16_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, int32_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, int64_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, int8_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, roo::string_view &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, std::pair< T1, T2 > &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, std::tuple< Types... > &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, uint16_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, uint32_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, uint64_t &result) const
RpcStatus deserialize(const roo::byte *data, size_t len, uint8_t &result) const
void operator()(const T &val, Itr &output) const
Default bridge implementing SerializeInto() via serialize().
void operator()(const T &val, Itr &output) const
const roo::byte * data() const
NullSerialized serialize(const Void &) const
StaticSerialized< 1 > serialize(bool val) const
StaticSerialized< 2 > serialize(int16_t val) const
StaticSerialized< 4 > serialize(int32_t val) const
StaticSerialized< 8 > serialize(int64_t val) const
StaticSerialized< 1 > serialize(int8_t val) const
SerializedByteArrayAdapter serialize(roo::string_view val) const
void serializeInto(const std::pair< T1, T2 > &val, RandomItr &result) const
DynamicSerialized serialize(const std::pair< T1, T2 > &val) const
DynamicSerialized serialize(const std::tuple< Types... > &val) const
constexpr void serializeInto(const std::tuple< Types... > &val, RandomItr &result) const
StaticSerialized< 2 > serialize(uint16_t val) const
StaticSerialized< 4 > serialize(uint32_t val) const
StaticSerialized< 8 > serialize(uint64_t val) const
StaticSerialized< 1 > serialize(uint8_t val) const