Zserio C++ runtime library  1.0.1
Built for Zserio 2.14.0
BitSizeOfCalculator.cpp
Go to the documentation of this file.
1 #include <array>
2 #include <limits>
3 
6 
7 namespace zserio
8 {
9 
10 static const std::array<uint64_t, 2> VARIN16_MAX_VALUES = {
11  (UINT64_C(1) << (6)) - 1,
12  (UINT64_C(1) << (6 + 8)) - 1,
13 };
14 
15 static const std::array<uint64_t, 4> VARINT32_MAX_VALUES = {
16  (UINT64_C(1) << (6)) - 1,
17  (UINT64_C(1) << (6 + 7)) - 1,
18  (UINT64_C(1) << (6 + 7 + 7)) - 1,
19  (UINT64_C(1) << (6 + 7 + 7 + 8)) - 1,
20 };
21 
22 static const std::array<uint64_t, 8> VARINT64_MAX_VALUES = {
23  (UINT64_C(1) << (6)) - 1,
24  (UINT64_C(1) << (6 + 7)) - 1,
25  (UINT64_C(1) << (6 + 7 + 7)) - 1,
26  (UINT64_C(1) << (6 + 7 + 7 + 7)) - 1,
27  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7)) - 1,
28  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7)) - 1,
29  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1,
30  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1,
31 };
32 
33 static const std::array<uint64_t, 2> VARUINT16_MAX_VALUES = {
34  (UINT64_C(1) << (7)) - 1,
35  (UINT64_C(1) << (7 + 8)) - 1,
36 };
37 
38 static const std::array<uint64_t, 4> VARUINT32_MAX_VALUES = {
39  (UINT64_C(1) << (7)) - 1,
40  (UINT64_C(1) << (7 + 7)) - 1,
41  (UINT64_C(1) << (7 + 7 + 7)) - 1,
42  (UINT64_C(1) << (7 + 7 + 7 + 8)) - 1,
43 };
44 
45 static const std::array<uint64_t, 8> VARUINT64_MAX_VALUES = {
46  (UINT64_C(1) << (7)) - 1,
47  (UINT64_C(1) << (7 + 7)) - 1,
48  (UINT64_C(1) << (7 + 7 + 7)) - 1,
49  (UINT64_C(1) << (7 + 7 + 7 + 7)) - 1,
50  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7)) - 1,
51  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7 + 7)) - 1,
52  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1,
53  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1,
54 };
55 
56 static const std::array<uint64_t, 9> VARINT_MAX_VALUES = {
57  (UINT64_C(1) << (6)) - 1,
58  (UINT64_C(1) << (6 + 7)) - 1,
59  (UINT64_C(1) << (6 + 7 + 7)) - 1,
60  (UINT64_C(1) << (6 + 7 + 7 + 7)) - 1,
61  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7)) - 1,
62  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7)) - 1,
63  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1,
64  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1,
65  (UINT64_C(1) << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1,
66 };
67 
68 static const std::array<uint64_t, 9> VARUINT_MAX_VALUES = {
69  (UINT64_C(1) << (7)) - 1,
70  (UINT64_C(1) << (7 + 7)) - 1,
71  (UINT64_C(1) << (7 + 7 + 7)) - 1,
72  (UINT64_C(1) << (7 + 7 + 7 + 7)) - 1,
73  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7)) - 1,
74  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7 + 7)) - 1,
75  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1,
76  (UINT64_C(1) << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1,
77  UINT64_MAX,
78 };
79 
80 static const std::array<uint64_t, 5> VARSIZE_MAX_VALUES = {
81  (UINT64_C(1) << (7)) - 1,
82  (UINT64_C(1) << (7 + 7)) - 1,
83  (UINT64_C(1) << (7 + 7 + 7)) - 1,
84  (UINT64_C(1) << (7 + 7 + 7 + 7)) - 1,
85  (UINT64_C(1) << (2 + 7 + 7 + 7 + 8)) - 1,
86 };
87 
88 template <std::size_t SIZE>
89 static size_t bitSizeOfVarIntImpl(
90  uint64_t value, const std::array<uint64_t, SIZE>& maxValues, const char* varIntName)
91 {
92  size_t byteSize = 1;
93  for (uint64_t maxValue : maxValues)
94  {
95  if (value <= maxValue)
96  break;
97  byteSize++;
98  }
99 
100  if (byteSize > maxValues.size())
101  {
102  throw CppRuntimeException("BitSizeOfCalculator: Value '")
103  << value << "' is out of range for " << varIntName << "!";
104  }
105 
106  return byteSize * 8;
107 }
108 
109 template <typename T>
110 static uint64_t convertToAbsValue(T value)
111 {
112  return static_cast<uint64_t>((value < 0) ? -value : value);
113 }
114 
115 size_t bitSizeOfVarInt16(int16_t value)
116 {
117  return bitSizeOfVarIntImpl(convertToAbsValue(value), VARIN16_MAX_VALUES, "varint16");
118 }
119 
120 size_t bitSizeOfVarInt32(int32_t value)
121 {
122  return bitSizeOfVarIntImpl(convertToAbsValue(value), VARINT32_MAX_VALUES, "varint32");
123 }
124 
125 size_t bitSizeOfVarInt64(int64_t value)
126 {
127  return bitSizeOfVarIntImpl(convertToAbsValue(value), VARINT64_MAX_VALUES, "varint64");
128 }
129 
130 size_t bitSizeOfVarUInt16(uint16_t value)
131 {
132  return bitSizeOfVarIntImpl(value, VARUINT16_MAX_VALUES, "varuint16");
133 }
134 
135 size_t bitSizeOfVarUInt32(uint32_t value)
136 {
137  return bitSizeOfVarIntImpl(value, VARUINT32_MAX_VALUES, "varuint32");
138 }
139 
140 size_t bitSizeOfVarUInt64(uint64_t value)
141 {
142  return bitSizeOfVarIntImpl(value, VARUINT64_MAX_VALUES, "varuint64");
143 }
144 
145 size_t bitSizeOfVarInt(int64_t value)
146 {
147  if (value == INT64_MIN)
148  return 8; // INT64_MIN is stored as -0
149 
150  return bitSizeOfVarIntImpl(convertToAbsValue(value), VARINT_MAX_VALUES, "varint");
151 }
152 
153 size_t bitSizeOfVarUInt(uint64_t value)
154 {
155  return bitSizeOfVarIntImpl(value, VARUINT_MAX_VALUES, "varuint");
156 }
157 
158 size_t bitSizeOfVarSize(uint32_t value)
159 {
160  return bitSizeOfVarIntImpl(value, VARSIZE_MAX_VALUES, "varsize");
161 }
162 
164 {
165  const size_t bytesSize = bytesValue.size();
166 
167  // the bytes consists of varsize for size followed by the bytes
168  return bitSizeOfVarSize(convertSizeToUInt32(bytesSize)) + bytesSize * 8;
169 }
170 
171 size_t bitSizeOfString(StringView stringValue)
172 {
173  const size_t stringSize = stringValue.size();
174 
175  // the string consists of varsize for size followed by the UTF-8 encoded string
176  return bitSizeOfVarSize(convertSizeToUInt32(stringSize)) + stringSize * 8;
177 }
178 
179 } // namespace zserio
constexpr size_type size() const noexcept
Definition: StringView.h:240
constexpr size_type size() const noexcept
Definition: Span.h:281
size_t bitSizeOfString(StringView stringValue)
size_t bitSizeOfVarInt32(int32_t value)
size_t bitSizeOfVarUInt32(uint32_t value)
size_t bitSizeOfVarInt64(int64_t value)
size_t bitSizeOfVarSize(uint32_t value)
size_t bitSizeOfVarUInt64(uint64_t value)
uint32_t convertSizeToUInt32(size_t value)
size_t bitSizeOfVarInt16(int16_t value)
size_t bitSizeOfVarUInt(uint64_t value)
size_t bitSizeOfVarInt(int64_t value)
size_t bitSizeOfBytes(Span< const uint8_t > bytesValue)
size_t bitSizeOfVarUInt16(uint16_t value)