1 #ifndef PROTOZERO_VARINT_HPP 2 #define PROTOZERO_VARINT_HPP 33 inline uint64_t decode_varint_impl(
const char** data,
const char* end) {
34 const auto begin =
reinterpret_cast<const int8_t*
>(*data);
35 const auto iend =
reinterpret_cast<const int8_t*
>(end);
36 const int8_t* p = begin;
42 b = *p++; val = uint64_t((b & 0x7f) );
if (b >= 0) {
break; }
43 b = *p++; val |= uint64_t((b & 0x7f) << 7);
if (b >= 0) {
break; }
44 b = *p++; val |= uint64_t((b & 0x7f) << 14);
if (b >= 0) {
break; }
45 b = *p++; val |= uint64_t((b & 0x7f) << 21);
if (b >= 0) {
break; }
46 b = *p++; val |= uint64_t((b & 0x7f) << 28);
if (b >= 0) {
break; }
47 b = *p++; val |= uint64_t((b & 0x7f) << 35);
if (b >= 0) {
break; }
48 b = *p++; val |= uint64_t((b & 0x7f) << 42);
if (b >= 0) {
break; }
49 b = *p++; val |= uint64_t((b & 0x7f) << 49);
if (b >= 0) {
break; }
50 b = *p++; val |= uint64_t((b & 0x7f) << 56);
if (b >= 0) {
break; }
51 b = *p++; val |= uint64_t((b & 0x01) << 63);
if (b >= 0) {
break; }
56 while (p != iend && *p < 0) {
57 val |= uint64_t(*p++ & 0x7f) << shift;
63 val |= uint64_t(*p++) << shift;
66 *data =
reinterpret_cast<const char*
>(p);
91 if (end != *data && ((**data & 0x80) == 0)) {
92 const auto val =
static_cast<uint64_t
>(**data);
97 return detail::decode_varint_impl(data, end);
113 const auto begin =
reinterpret_cast<const int8_t*
>(*data);
114 const auto iend =
reinterpret_cast<const int8_t*
>(end);
115 const int8_t* p = begin;
117 while (p != iend && *p < 0) {
131 *data =
reinterpret_cast<const char*
>(p);
144 template <
typename T>
148 while (value >= 0x80) {
149 *data++ = char((value & 0x7f) | 0x80);
153 *data++ = char(value);
162 return (static_cast<uint32_t>(value) << 1) ^ (
static_cast<uint32_t
>(value >> 31));
169 return (static_cast<uint64_t>(value) << 1) ^ (
static_cast<uint64_t
>(value >> 63));
176 return static_cast<int32_t
>(value >> 1) ^ -static_cast<int32_t>(value & 1);
183 return static_cast<int64_t
>(value >> 1) ^ -static_cast<int64_t>(value & 1);
188 #endif // PROTOZERO_VARINT_HPP constexpr uint64_t encode_zigzag64(int64_t value) noexcept
Definition: varint.hpp:168
constexpr int64_t decode_zigzag64(uint64_t value) noexcept
Definition: varint.hpp:182
constexpr const int8_t max_varint_length
Definition: varint.hpp:28
constexpr uint32_t encode_zigzag32(int32_t value) noexcept
Definition: varint.hpp:161
int write_varint(T data, uint64_t value)
Definition: varint.hpp:145
void skip_varint(const char **data, const char *end)
Definition: varint.hpp:112
constexpr int32_t decode_zigzag32(uint32_t value) noexcept
Definition: varint.hpp:175
Contains the exceptions used in the protozero library.
Definition: exception.hpp:39
Definition: exception.hpp:61
uint64_t decode_varint(const char **data, const char *end)
Definition: varint.hpp:89
All parts of the protozero header-only library are in this namespace.
Definition: byteswap.hpp:24