33 return (
static_cast<std::uint32_t
>(v) << 1) ^
static_cast<std::uint32_t
>(v >> 31);
36 return static_cast<std::int32_t
>((v >> 1) ^ (~(v & 1) + 1));
39 return (
static_cast<std::uint64_t
>(v) << 1) ^
static_cast<std::uint64_t
>(v >> 63);
42 return static_cast<std::int64_t
>((v >> 1) ^ (~(v & 1) + 1));
61inline std::size_t
tag_size(
const std::uint32_t field_number) {
62 return varint_size(
static_cast<std::uint64_t
>(field_number) << 3);
74 out_.push_back(
static_cast<char>(b));
76 void raw_bytes(
const void* data,
const std::size_t n)
const {
77 out_.append(
static_cast<const char*
>(data), n);
82 raw_byte(
static_cast<std::uint8_t
>(v) | 0x80U);
85 raw_byte(
static_cast<std::uint8_t
>(v));
88 void tag(
const std::uint32_t field_number,
WireType wt)
const {
89 varint((
static_cast<std::uint64_t
>(field_number) << 3) |
static_cast<std::uint64_t
>(wt));
92 void fixed32(
const std::uint32_t v)
const {
93 std::array<std::uint8_t, 4> b{};
94 for (std::size_t i = 0; i < b.size(); ++i)
95 b[i] =
static_cast<std::uint8_t
>(v >> (8 * i));
99 void fixed64(
const std::uint64_t v)
const {
100 std::array<std::uint8_t, 8> b{};
101 for (std::size_t i = 0; i < b.size(); ++i)
102 b[i] =
static_cast<std::uint8_t
>(v >> (8 * i));
124 : ptr_(static_cast<const std::uint8_t*>(data)),
125 end_(static_cast<const std::uint8_t*>(data) + size) {}
127 [[nodiscard]]
bool ok()
const {
130 [[nodiscard]]
bool eof()
const {
139 std::uint64_t key = 0;
142 field_number =
static_cast<std::uint32_t
>(key >> 3);
143 wt =
static_cast<WireType>(key & 0x7U);
148 std::uint64_t result = 0;
153 const std::uint8_t b = *ptr_++;
154 result |=
static_cast<std::uint64_t
>(b & 0x7FU) << shift;
155 if ((b & 0x80U) == 0) {
168 v |=
static_cast<std::uint32_t
>(ptr_[0]);
169 v |=
static_cast<std::uint32_t
>(ptr_[1]) << 8;
170 v |=
static_cast<std::uint32_t
>(ptr_[2]) << 16;
171 v |=
static_cast<std::uint32_t
>(ptr_[3]) << 24;
181 for (
int i = 0; i < 8; ++i)
182 v |=
static_cast<std::uint64_t
>(ptr_[i]) << (8 * i);
190 std::uint64_t len = 0;
193 if (
static_cast<std::uint64_t
>(end_ - ptr_) < len)
195 out.assign(
reinterpret_cast<const char*
>(ptr_),
static_cast<std::size_t
>(len));
203 std::uint64_t len = 0;
206 if (
static_cast<std::uint64_t
>(end_ - ptr_) < len)
208 out =
ProtoReader(ptr_,
static_cast<std::size_t
>(len));
217 std::uint64_t tmp = 0;
221 std::uint64_t tmp = 0;
225 std::uint32_t tmp = 0;
229 std::uint64_t len = 0;
232 if (
static_cast<std::uint64_t
>(end_ - ptr_) < len)
247 const std::uint8_t* ptr_ =
nullptr;
248 const std::uint8_t* end_ =
nullptr;
258 std::memcpy(&bits, &f,
sizeof(bits));
263 std::memcpy(&f, &bits,
sizeof(f));
268 std::memcpy(&bits, &d,
sizeof(bits));
273 std::memcpy(&d, &bits,
sizeof(d));
ProtoReader(const void *data, const std::size_t size)
Definition wire.hpp:123
bool skip_field(const WireType wt)
Skip a field of the given wire type (unknown field forward-compat).
Definition wire.hpp:214
bool varint(std::uint64_t &out)
Definition wire.hpp:147
bool read_tag(std::uint32_t &field_number, WireType &wt)
Read a field tag.
Definition wire.hpp:136
bool eof() const
Definition wire.hpp:130
bool length_delimited(std::string &out)
Read a length-delimited blob into out.
Definition wire.hpp:189
bool sub_reader(ProtoReader &out)
Obtain a sub-reader over the next length-delimited region (for embedded messages and packed repeated ...
Definition wire.hpp:202
bool fixed64(std::uint64_t &out)
Definition wire.hpp:177
bool fixed32(std::uint32_t &out)
Definition wire.hpp:164
bool ok() const
Definition wire.hpp:127
ProtoWriter(std::string &out)
Definition wire.hpp:71
void length_delimited(const std::string &s) const
Definition wire.hpp:106
void raw_byte(const std::uint8_t b) const
Definition wire.hpp:73
void fixed32(const std::uint32_t v) const
Definition wire.hpp:92
void varint(std::uint64_t v) const
Definition wire.hpp:80
void raw_bytes(const void *data, const std::size_t n) const
Definition wire.hpp:76
void fixed64(const std::uint64_t v) const
Definition wire.hpp:99
void tag(const std::uint32_t field_number, WireType wt) const
Definition wire.hpp:88
std::size_t tag_size(const std::uint32_t field_number)
Number of bytes the tag for field_number occupies (wire type does not change the byte count — it only...
Definition wire.hpp:61
std::uint32_t float_to_bits(const float f)
Definition wire.hpp:256
std::uint32_t zigzag_encode32(const std::int32_t v)
Definition wire.hpp:32
std::uint64_t double_to_bits(const double d)
Definition wire.hpp:266
std::uint64_t zigzag_encode64(const std::int64_t v)
Definition wire.hpp:38
std::size_t varint_size(std::uint32_t value) noexcept
Number of bytes the base-128 encoding of value occupies.
std::int32_t zigzag_decode32(const std::uint32_t v)
Definition wire.hpp:35
std::int64_t zigzag_decode64(const std::uint64_t v)
Definition wire.hpp:41
double bits_to_double(const std::uint64_t bits)
Definition wire.hpp:271
float bits_to_float(const std::uint32_t bits)
Definition wire.hpp:261
WireType
Protobuf wire types (the low 3 bits of a field tag).
Definition wire.hpp:21
@ Fixed32
fixed32/sfixed32/float
@ Fixed64
fixed64/sfixed64/double
@ Varint
int32/int64/uint32/uint64/sint32/sint64/bool/enum
@ LengthDelimited
string/bytes/embedded message/packed repeated