ESPHome 2026.5.0
Loading...
Searching...
No Matches
bytebuffer.h
Go to the documentation of this file.
1#pragma once
2
3#include <utility>
4#include <vector>
5#include <cinttypes>
6#include <cstddef>
8
10
11enum Endian { LITTLE, BIG };
12
38 public:
39 // Default constructor (compatibility with TEMPLATABLE_VALUE)
40 // Creates a zero-length ByteBuffer which is little use to anybody.
41 ByteBuffer() : ByteBuffer(std::vector<uint8_t>()) {}
42
46 ByteBuffer(size_t capacity, Endian endianness = LITTLE)
47 : data_(std::vector<uint8_t>(capacity)), endianness_(endianness), limit_(capacity){};
48
49 // templated functions to implement putting and getting data of various types. There are two flavours of all
50 // functions - one that uses the position as the offset, and updates the position accordingly, and one that
51 // takes an explicit offset and does not update the position.
52 // Separate temnplates are provided for types that fit into 32 bits and those that are bigger. These delegate
53 // the actual put/get to common code based around those sizes.
54 // This reduces the code size and execution time for smaller types. A similar structure for e.g. 16 bits is unlikely
55 // to provide any further benefit given that all target platforms are native 32 bit.
56
57 template<typename T>
58 T get(typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
59 typename std::enable_if<(sizeof(T) <= sizeof(uint32_t)), T>::type * = 0) {
60 // integral types that fit into 32 bit
61 return static_cast<T>(this->get_uint32_(sizeof(T)));
62 }
63
64 template<typename T>
65 T get(size_t offset, typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
66 typename std::enable_if<(sizeof(T) <= sizeof(uint32_t)), T>::type * = 0) {
67 return static_cast<T>(this->get_uint32_(offset, sizeof(T)));
68 }
69
70 template<typename T>
71 void put(const T &value, typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
72 typename std::enable_if<(sizeof(T) <= sizeof(uint32_t)), T>::type * = 0) {
73 this->put_uint32_(static_cast<uint32_t>(value), sizeof(T));
74 }
75
76 template<typename T>
77 void put(const T &value, size_t offset, typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
78 typename std::enable_if<(sizeof(T) <= sizeof(uint32_t)), T>::type * = 0) {
79 this->put_uint32_(static_cast<uint32_t>(value), offset, sizeof(T));
80 }
81
82 // integral types that do not fit into 32 bit (basically only 64 bit types)
83 template<typename T>
84 T get(typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
85 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
86 return static_cast<T>(this->get_uint64_(sizeof(T)));
87 }
88
89 template<typename T>
90 T get(size_t offset, typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
91 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
92 return static_cast<T>(this->get_uint64_(offset, sizeof(T)));
93 }
94
95 template<typename T>
96 void put(const T &value, typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
97 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
98 this->put_uint64_(value, sizeof(T));
99 }
100
101 template<typename T>
102 void put(const T &value, size_t offset, typename std::enable_if<std::is_integral<T>::value, T>::type * = 0,
103 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
104 this->put_uint64_(static_cast<uint64_t>(value), offset, sizeof(T));
105 }
106
107 // floating point types. Caters for 32 and 64 bit floating point.
108 template<typename T>
109 T get(typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
110 typename std::enable_if<(sizeof(T) == sizeof(uint32_t)), T>::type * = 0) {
111 return bit_cast<T>(this->get_uint32_(sizeof(T)));
112 }
113
114 template<typename T>
115 T get(typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
116 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
117 return bit_cast<T>(this->get_uint64_(sizeof(T)));
118 }
119
120 template<typename T>
121 T get(size_t offset, typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
122 typename std::enable_if<(sizeof(T) == sizeof(uint32_t)), T>::type * = 0) {
123 return bit_cast<T>(this->get_uint32_(offset, sizeof(T)));
124 }
125
126 template<typename T>
127 T get(size_t offset, typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
128 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
129 return bit_cast<T>(this->get_uint64_(offset, sizeof(T)));
130 }
131 template<typename T>
132 void put(const T &value, typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
133 typename std::enable_if<(sizeof(T) <= sizeof(uint32_t)), T>::type * = 0) {
134 this->put_uint32_(bit_cast<uint32_t>(value), sizeof(T));
135 }
136
137 template<typename T>
138 void put(const T &value, typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
139 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
140 this->put_uint64_(bit_cast<uint64_t>(value), sizeof(T));
141 }
142
143 template<typename T>
144 void put(const T &value, size_t offset, typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
145 typename std::enable_if<(sizeof(T) <= sizeof(uint32_t)), T>::type * = 0) {
146 this->put_uint32_(bit_cast<uint32_t>(value), offset, sizeof(T));
147 }
148
149 template<typename T>
150 void put(const T &value, size_t offset, typename std::enable_if<std::is_floating_point<T>::value, T>::type * = 0,
151 typename std::enable_if<(sizeof(T) == sizeof(uint64_t)), T>::type * = 0) {
152 this->put_uint64_(bit_cast<uint64_t>(value), offset, sizeof(T));
153 }
154
155 template<typename T> static ByteBuffer wrap(T value, Endian endianness = LITTLE) {
156 ByteBuffer buffer = ByteBuffer(sizeof(T), endianness);
157 buffer.put(value);
158 buffer.flip();
159 return buffer;
160 }
161
162 static ByteBuffer wrap(std::vector<uint8_t> const &data, Endian endianness = LITTLE) {
163 ByteBuffer buffer = {data};
164 buffer.endianness_ = endianness;
165 return buffer;
166 }
167
168 static ByteBuffer wrap(const uint8_t *ptr, size_t len, Endian endianness = LITTLE) {
169 return wrap(std::vector<uint8_t>(ptr, ptr + len), endianness);
170 }
171
172 // convenience functions with explicit types named..
173 void put_float(float value) { this->put(value); }
174 void put_double(double value) { this->put(value); }
175
176 uint8_t get_uint8() { return this->data_[this->position_++]; }
177 // Get a 16 bit unsigned value, increment by 2
178 uint16_t get_uint16() { return this->get<uint16_t>(); }
179 // Get a 24 bit unsigned value, increment by 3
180 uint32_t get_uint24() { return this->get_uint32_(3); };
181 // Get a 32 bit unsigned value, increment by 4
182 uint32_t get_uint32() { return this->get<uint32_t>(); };
183 // Get a 64 bit unsigned value, increment by 8
184 uint64_t get_uint64() { return this->get<uint64_t>(); };
185 // Signed versions of the get functions
186 uint8_t get_int8() { return static_cast<int8_t>(this->get_uint8()); };
187 int16_t get_int16() { return this->get<uint16_t>(); }
188 int32_t get_int32() { return this->get<int32_t>(); }
189 int64_t get_int64() { return this->get<int64_t>(); }
190 // Get a float value, increment by 4
191 float get_float() { return this->get<float>(); }
192 // Get a double value, increment by 8
193 double get_double() { return this->get<double>(); }
194
195 // Get a bool value, increment by 1
196 bool get_bool() { return static_cast<bool>(this->get_uint8()); }
197
198 uint32_t get_int24(size_t offset) {
199 auto value = this->get_uint24(offset);
200 uint32_t mask = (~static_cast<uint32_t>(0)) << 23;
201 if ((value & mask) != 0)
202 value |= mask;
203 return value;
204 }
205
207 auto value = this->get_uint24();
208 uint32_t mask = (~static_cast<uint32_t>(0)) << 23;
209 if ((value & mask) != 0)
210 value |= mask;
211 return value;
212 }
213 std::vector<uint8_t> get_vector(size_t length, size_t offset) {
214 auto start = this->data_.begin() + offset;
215 return {start, start + length};
216 }
217
218 std::vector<uint8_t> get_vector(size_t length) {
219 auto result = this->get_vector(length, this->position_);
220 this->position_ += length;
221 return result;
222 }
223
224 // Convenience named functions
225 void put_uint8(uint8_t value) { this->data_[this->position_++] = value; }
226 void put_uint16(uint16_t value) { this->put(value); }
227 void put_uint24(uint32_t value) { this->put_uint32_(value, 3); }
228 void put_uint32(uint32_t value) { this->put(value); }
229 void put_uint64(uint64_t value) { this->put(value); }
230 // Signed versions of the put functions
231 void put_int8(int8_t value) { this->put_uint8(static_cast<uint8_t>(value)); }
232 void put_int16(int16_t value) { this->put(value); }
233 void put_int24(int32_t value) { this->put_uint32_(value, 3); }
234 void put_int32(int32_t value) { this->put(value); }
235 void put_int64(int64_t value) { this->put(value); }
236 // Extra put functions
237 void put_bool(bool value) { this->put_uint8(value); }
238
239 // versions of the above with an offset, these do not update the position
240
241 uint64_t get_uint64(size_t offset) { return this->get<uint64_t>(offset); }
242 uint32_t get_uint24(size_t offset) { return this->get_uint32_(offset, 3); };
243 double get_double(size_t offset) { return get<double>(offset); }
244
245 // Get one byte from the buffer, increment position by 1
246 uint8_t get_uint8(size_t offset) { return this->data_[offset]; }
247 // Get a 16 bit unsigned value, increment by 2
248 uint16_t get_uint16(size_t offset) { return get<uint16_t>(offset); }
249 // Get a 24 bit unsigned value, increment by 3
250 uint32_t get_uint32(size_t offset) { return this->get<uint32_t>(offset); };
251 // Get a 64 bit unsigned value, increment by 8
252 uint8_t get_int8(size_t offset) { return get<int8_t>(offset); }
253 int16_t get_int16(size_t offset) { return get<int16_t>(offset); }
254 int32_t get_int32(size_t offset) { return get<int32_t>(offset); }
255 int64_t get_int64(size_t offset) { return get<int64_t>(offset); }
256 // Get a float value, increment by 4
257 float get_float(size_t offset) { return get<float>(offset); }
258 // Get a double value, increment by 8
259
260 // Get a bool value, increment by 1
261 bool get_bool(size_t offset) { return this->get_uint8(offset); }
262
263 void put_uint8(uint8_t value, size_t offset) { this->data_[offset] = value; }
264 void put_uint16(uint16_t value, size_t offset) { this->put(value, offset); }
265 void put_uint24(uint32_t value, size_t offset) { this->put_uint32_(value, offset, 3); }
266 void put_uint32(uint32_t value, size_t offset) { this->put(value, offset); }
267 void put_uint64(uint64_t value, size_t offset) { this->put(value, offset); }
268 // Signed versions of the put functions
269 void put_int8(int8_t value, size_t offset) { this->put_uint8(static_cast<uint8_t>(value), offset); }
270 void put_int16(int16_t value, size_t offset) { this->put(value, offset); }
271 void put_int24(int32_t value, size_t offset) { this->put_uint32_(value, offset, 3); }
272 void put_int32(int32_t value, size_t offset) { this->put(value, offset); }
273 void put_int64(int64_t value, size_t offset) { this->put(value, offset); }
274 // Extra put functions
275 void put_float(float value, size_t offset) { this->put(value, offset); }
276 void put_double(double value, size_t offset) { this->put(value, offset); }
277 void put_bool(bool value, size_t offset) { this->put_uint8(value, offset); }
278 void put(const std::vector<uint8_t> &value, size_t offset) {
279 std::copy(value.begin(), value.end(), this->data_.begin() + offset);
280 }
281 void put_vector(const std::vector<uint8_t> &value, size_t offset) { this->put(value, offset); }
282 void put(const std::vector<uint8_t> &value) {
283 this->put_vector(value, this->position_);
284 this->position_ += value.size();
285 }
286 void put_vector(const std::vector<uint8_t> &value) { this->put(value); }
287
288 // Getters
289
290 inline size_t get_capacity() const { return this->data_.size(); }
291 inline size_t get_position() const { return this->position_; }
292 inline size_t get_limit() const { return this->limit_; }
293 inline size_t get_remaining() const { return this->get_limit() - this->get_position(); }
294 inline Endian get_endianness() const { return this->endianness_; }
295 inline void mark() { this->mark_ = this->position_; }
296 inline void big_endian() { this->endianness_ = BIG; }
297 inline void little_endian() { this->endianness_ = LITTLE; }
298 // retrieve a pointer to the underlying data.
299 std::vector<uint8_t> get_data() { return this->data_; };
300
301 void get_bytes(void *dest, size_t length) {
302 std::copy(this->data_.begin() + this->position_, this->data_.begin() + this->position_ + length, (uint8_t *) dest);
303 this->position_ += length;
304 }
305
306 void get_bytes(void *dest, size_t length, size_t offset) {
307 std::copy(this->data_.begin() + offset, this->data_.begin() + offset + length, (uint8_t *) dest);
308 }
309
310 void rewind() { this->position_ = 0; }
311 void reset() { this->position_ = this->mark_; }
312
313 void set_limit(size_t limit) { this->limit_ = limit; }
314 void set_position(size_t position) { this->position_ = position; }
315 void clear() {
316 this->limit_ = this->get_capacity();
317 this->position_ = 0;
318 }
319 void flip() {
320 this->limit_ = this->position_;
321 this->position_ = 0;
322 }
323
324 protected:
325 uint64_t get_uint64_(size_t offset, size_t length) const {
326 uint64_t value = 0;
327 if (this->endianness_ == LITTLE) {
328 offset += length;
329 while (length-- != 0) {
330 value <<= 8;
331 value |= this->data_[--offset];
332 }
333 } else {
334 while (length-- != 0) {
335 value <<= 8;
336 value |= this->data_[offset++];
337 }
338 }
339 return value;
340 }
341
342 uint64_t get_uint64_(size_t length) {
343 auto result = this->get_uint64_(this->position_, length);
344 this->position_ += length;
345 return result;
346 }
347 uint32_t get_uint32_(size_t offset, size_t length) const {
348 uint32_t value = 0;
349 if (this->endianness_ == LITTLE) {
350 offset += length;
351 while (length-- != 0) {
352 value <<= 8;
353 value |= this->data_[--offset];
354 }
355 } else {
356 while (length-- != 0) {
357 value <<= 8;
358 value |= this->data_[offset++];
359 }
360 }
361 return value;
362 }
363
365 auto result = this->get_uint32_(this->position_, length);
366 this->position_ += length;
367 return result;
368 }
369
371
372 void put_uint64_(uint64_t value, size_t length) {
373 this->put_uint64_(value, this->position_, length);
374 this->position_ += length;
375 }
376 void put_uint32_(uint32_t value, size_t length) {
377 this->put_uint32_(value, this->position_, length);
378 this->position_ += length;
379 }
380
381 void put_uint64_(uint64_t value, size_t offset, size_t length) {
382 if (this->endianness_ == LITTLE) {
383 while (length-- != 0) {
384 this->data_[offset++] = static_cast<uint8_t>(value);
385 value >>= 8;
386 }
387 } else {
388 offset += length;
389 while (length-- != 0) {
390 this->data_[--offset] = static_cast<uint8_t>(value);
391 value >>= 8;
392 }
393 }
394 }
395
396 void put_uint32_(uint32_t value, size_t offset, size_t length) {
397 if (this->endianness_ == LITTLE) {
398 while (length-- != 0) {
399 this->data_[offset++] = static_cast<uint8_t>(value);
400 value >>= 8;
401 }
402 } else {
403 offset += length;
404 while (length-- != 0) {
405 this->data_[--offset] = static_cast<uint8_t>(value);
406 value >>= 8;
407 }
408 }
409 }
410 ByteBuffer(std::vector<uint8_t> const &data) : data_(data), limit_(data.size()) {}
411
412 std::vector<uint8_t> data_;
414 size_t position_{0};
415 size_t mark_{0};
416 size_t limit_{0};
417};
418
419} // namespace esphome::bytebuffer
A class modelled on the Java ByteBuffer class.
Definition bytebuffer.h:37
void put_double(double value, size_t offset)
Definition bytebuffer.h:276
void put_uint16(uint16_t value)
Definition bytebuffer.h:226
std::vector< uint8_t > data_
Definition bytebuffer.h:412
void put(const std::vector< uint8_t > &value)
Definition bytebuffer.h:282
void put_int64(int64_t value)
Definition bytebuffer.h:235
void put(const T &value, typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:96
std::vector< uint8_t > get_vector(size_t length)
Definition bytebuffer.h:218
T get(typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:115
void put_int64(int64_t value, size_t offset)
Definition bytebuffer.h:273
void set_limit(size_t limit)
Definition bytebuffer.h:313
void put_int32(int32_t value)
Definition bytebuffer.h:234
void put_vector(const std::vector< uint8_t > &value)
Definition bytebuffer.h:286
void put(const std::vector< uint8_t > &value, size_t offset)
Definition bytebuffer.h:278
static ByteBuffer wrap(const uint8_t *ptr, size_t len, Endian endianness=LITTLE)
Definition bytebuffer.h:168
uint16_t get_uint16(size_t offset)
Definition bytebuffer.h:248
uint32_t get_uint32_(size_t length)
Definition bytebuffer.h:364
void put(const T &value, size_t offset, typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)<=sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:77
void put(const T &value, typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:138
void put_uint64_(uint64_t value, size_t length)
Putters.
Definition bytebuffer.h:372
void put_uint64(uint64_t value, size_t offset)
Definition bytebuffer.h:267
void put_int16(int16_t value)
Definition bytebuffer.h:232
void put(const T &value, size_t offset, typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:150
float get_float(size_t offset)
Definition bytebuffer.h:257
void put(const T &value, typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)<=sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:71
T get(typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:109
void put_vector(const std::vector< uint8_t > &value, size_t offset)
Definition bytebuffer.h:281
T get(size_t offset, typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:127
void put_int8(int8_t value, size_t offset)
Definition bytebuffer.h:269
T get(typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)<=sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:58
void put(const T &value, size_t offset, typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:102
void put_uint32(uint32_t value)
Definition bytebuffer.h:228
uint8_t get_uint8(size_t offset)
Definition bytebuffer.h:246
ByteBuffer(size_t capacity, Endian endianness=LITTLE)
Create a new Bytebuffer with the given capacity.
Definition bytebuffer.h:46
uint8_t get_int8(size_t offset)
Definition bytebuffer.h:252
T get(size_t offset, typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)<=sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:65
void put_uint24(uint32_t value, size_t offset)
Definition bytebuffer.h:265
uint64_t get_uint64_(size_t offset, size_t length) const
Definition bytebuffer.h:325
void put_float(float value, size_t offset)
Definition bytebuffer.h:275
void put_int16(int16_t value, size_t offset)
Definition bytebuffer.h:270
std::vector< uint8_t > get_vector(size_t length, size_t offset)
Definition bytebuffer.h:213
double get_double(size_t offset)
Definition bytebuffer.h:243
int32_t get_int32(size_t offset)
Definition bytebuffer.h:254
void put_double(double value)
Definition bytebuffer.h:174
void put_uint32(uint32_t value, size_t offset)
Definition bytebuffer.h:266
void put_uint16(uint16_t value, size_t offset)
Definition bytebuffer.h:264
void put_uint8(uint8_t value, size_t offset)
Definition bytebuffer.h:263
uint32_t get_uint32(size_t offset)
Definition bytebuffer.h:250
int16_t get_int16(size_t offset)
Definition bytebuffer.h:253
int64_t get_int64(size_t offset)
Definition bytebuffer.h:255
uint64_t get_uint64(size_t offset)
Definition bytebuffer.h:241
uint64_t get_uint64_(size_t length)
Definition bytebuffer.h:342
void put_uint64_(uint64_t value, size_t offset, size_t length)
Definition bytebuffer.h:381
void get_bytes(void *dest, size_t length)
Definition bytebuffer.h:301
void put_uint32_(uint32_t value, size_t offset, size_t length)
Definition bytebuffer.h:396
T get(size_t offset, typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:90
std::vector< uint8_t > get_data()
Definition bytebuffer.h:299
void put(const T &value, typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)<=sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:132
void put_int32(int32_t value, size_t offset)
Definition bytebuffer.h:272
uint32_t get_uint24(size_t offset)
Definition bytebuffer.h:242
void put_uint32_(uint32_t value, size_t length)
Definition bytebuffer.h:376
void put_uint24(uint32_t value)
Definition bytebuffer.h:227
void put_uint8(uint8_t value)
Definition bytebuffer.h:225
static ByteBuffer wrap(T value, Endian endianness=LITTLE)
Definition bytebuffer.h:155
void put(const T &value, size_t offset, typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)<=sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:144
void put_uint64(uint64_t value)
Definition bytebuffer.h:229
uint32_t get_int24(size_t offset)
Definition bytebuffer.h:198
void put_int24(int32_t value)
Definition bytebuffer.h:233
bool get_bool(size_t offset)
Definition bytebuffer.h:261
ByteBuffer(std::vector< uint8_t > const &data)
Definition bytebuffer.h:410
T get(typename std::enable_if< std::is_integral< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint64_t)), T >::type *=0)
Definition bytebuffer.h:84
uint32_t get_uint32_(size_t offset, size_t length) const
Definition bytebuffer.h:347
void set_position(size_t position)
Definition bytebuffer.h:314
static ByteBuffer wrap(std::vector< uint8_t > const &data, Endian endianness=LITTLE)
Definition bytebuffer.h:162
T get(size_t offset, typename std::enable_if< std::is_floating_point< T >::value, T >::type *=0, typename std::enable_if<(sizeof(T)==sizeof(uint32_t)), T >::type *=0)
Definition bytebuffer.h:121
void put_int8(int8_t value)
Definition bytebuffer.h:231
void put_bool(bool value, size_t offset)
Definition bytebuffer.h:277
void get_bytes(void *dest, size_t length, size_t offset)
Definition bytebuffer.h:306
void put_int24(int32_t value, size_t offset)
Definition bytebuffer.h:271
float position
Definition cover.h:0
uint16_t type
std::string size_t len
uint16_t size
Definition helpers.cpp:25
To bit_cast(const From &src)
Convert data between types, without aliasing issues or undefined behaviour.
Definition helpers.h:84
uint16_t uint16_t & capacity
Definition helpers.cpp:25
static void uint32_t
uint16_t length
Definition tt21100.cpp:0