14#if __cplusplus >= 202002L
15 constexpr bool kIsBigEndian = std::endian::native == std::endian::big;
17 constexpr bool kIsBigEndian =
static_cast<const std::uint8_t&
>(0x0001) == 0x00;
20 constexpr std::uint16_t SwapBytes(
const std::uint16_t value)
22 if constexpr (kIsBigEndian)
25 return ((value >> 8) & 0x00FF) | ((value << 8) & 0xFF00);
28 constexpr std::uint32_t SwapBytes(
const std::uint32_t value)
30 if constexpr (kIsBigEndian)
33 return ((value >> 24) & 0x000000FF) | ((value >> 8) & 0x0000FF00) | ((value << 8) & 0x00FF0000) |
34 ((value << 24) & 0xFF000000);
37 constexpr std::uint64_t SwapBytes(
const std::uint64_t value)
39 if constexpr (kIsBigEndian)
42 return ((value >> 56) & 0x00000000000000FF) | ((value >> 40) & 0x000000000000FF00) |
43 ((value >> 24) & 0x0000000000FF0000) | ((value >> 8) & 0x00000000FF000000) |
44 ((value << 8) & 0x000000FF00000000) | ((value << 24) & 0x0000FF0000000000) |
45 ((value << 40) & 0x00FF000000000000) | ((value << 56) & 0xFF00000000000000);
53 : be_value_{ SwapBytes(value) }
55 constexpr uint64_t kLen1 = (
static_cast<uint64_t
>(-1) << (64 - 6) >> (64 - 6));
56 constexpr uint64_t kLen2 = (
static_cast<uint64_t
>(-1) << (64 - 14) >> (64 - 14));
57 constexpr uint64_t kLen4 = (
static_cast<uint64_t
>(-1) << (64 - 30) >> (64 - 30));
59 if (
static_cast<uint8_t
>(be_value_) & 0xC0u) {
60 throw std::invalid_argument(
"Value greater than uintvar maximum");
65 }
else if (value > kLen2) {
68 }
else if (value > kLen1) {
79 if (bytes.empty() || bytes.size() <
Size(bytes[0])) {
80 throw std::invalid_argument(
"Invalid bytes for uintvar");
83 std::memcpy(&be_value_, bytes.data(),
Size(bytes[0]));
86 explicit constexpr operator uint64_t() const noexcept
88 return SwapBytes((be_value_ & SwapBytes(uint64_t(~(~0x3Full << 56)))) << (
sizeof(uint64_t) -
Size()) * 8);
91 static constexpr std::size_t
Size(uint8_t msb_bytes)
noexcept
93 if ((msb_bytes & 0xC0) == 0xC0) {
94 return sizeof(uint64_t);
95 }
else if ((msb_bytes & 0x80) == 0x80) {
96 return sizeof(uint32_t);
97 }
else if ((msb_bytes & 0x40) == 0x40) {
98 return sizeof(uint16_t);
101 return sizeof(uint8_t);
104 constexpr std::size_t
Size() const noexcept {
return UintVar::Size(
static_cast<uint8_t
>(be_value_)); }
107 auto data() const noexcept {
return reinterpret_cast<const uint8_t*
>(&be_value_); }
108 constexpr std::size_t
size() const noexcept {
return Size(); }
constexpr std::size_t Size() const noexcept
Definition uintvar.h:104
UintVar(Span< const uint8_t > bytes)
Definition uintvar.h:76
auto begin() const noexcept
Definition uintvar.h:109
static constexpr std::size_t Size(uint8_t msb_bytes) noexcept
Definition uintvar.h:91
constexpr std::size_t size() const noexcept
Definition uintvar.h:108
auto end() const noexcept
Definition uintvar.h:110
constexpr UintVar(uint64_t value)
Definition uintvar.h:52
auto data() const noexcept
Definition uintvar.h:107
Definition transport.h:26