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) {
61 return static_cast<T
>(this->
get_uint32_(
sizeof(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)));
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) {
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) {
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)));
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)));
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) {
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));
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) {
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) {
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) {
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) {
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));
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));
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));
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));
169 return wrap(std::vector<uint8_t>(ptr, ptr +
len), endianness);
200 uint32_t mask = (~static_cast<uint32_t>(0)) << 23;
201 if ((value & mask) != 0)
208 uint32_t mask = (~static_cast<uint32_t>(0)) << 23;
209 if ((value & mask) != 0)
214 auto start = this->
data_.begin() + offset;
215 return {start, start +
length};
264 void put_uint16(uint16_t value,
size_t offset) { this->
put(value, offset); }
267 void put_uint64(uint64_t value,
size_t offset) { this->
put(value, offset); }
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); }
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); }
275 void put_float(
float value,
size_t offset) { this->
put(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);
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) {
302 std::copy(this->
data_.begin() + this->position_, this->data_.begin() + this->position_ +
length, (uint8_t *) dest);
307 std::copy(this->
data_.begin() + offset, this->data_.begin() + offset +
length, (uint8_t *) dest);
331 value |= this->
data_[--offset];
336 value |= this->
data_[offset++];
353 value |= this->
data_[--offset];
358 value |= this->
data_[offset++];
383 while (length-- != 0) {
384 this->
data_[offset++] =
static_cast<uint8_t
>(value);
390 this->
data_[--offset] =
static_cast<uint8_t
>(value);
398 while (length-- != 0) {
399 this->
data_[offset++] =
static_cast<uint8_t
>(value);
405 this->
data_[--offset] =
static_cast<uint8_t
>(value);
A class modelled on the Java ByteBuffer class.
void put_double(double value, size_t offset)
void put_uint16(uint16_t value)
std::vector< uint8_t > data_
void put(const std::vector< uint8_t > &value)
void put_int64(int64_t value)
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)
size_t get_capacity() const
std::vector< uint8_t > get_vector(size_t length)
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)
void put_int64(int64_t value, size_t offset)
void set_limit(size_t limit)
void put_int32(int32_t value)
void put_vector(const std::vector< uint8_t > &value)
Endian get_endianness() const
void put(const std::vector< uint8_t > &value, size_t offset)
static ByteBuffer wrap(const uint8_t *ptr, size_t len, Endian endianness=LITTLE)
uint16_t get_uint16(size_t offset)
uint32_t get_uint32_(size_t length)
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)
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)
void put_uint64_(uint64_t value, size_t length)
Putters.
void put_uint64(uint64_t value, size_t offset)
void put_int16(int16_t value)
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)
float get_float(size_t offset)
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)
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)
void put_vector(const std::vector< uint8_t > &value, size_t offset)
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)
void put_int8(int8_t value, size_t offset)
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)
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)
void put_uint32(uint32_t value)
uint8_t get_uint8(size_t offset)
void put_bool(bool value)
ByteBuffer(size_t capacity, Endian endianness=LITTLE)
Create a new Bytebuffer with the given capacity.
uint8_t get_int8(size_t offset)
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)
void put_uint24(uint32_t value, size_t offset)
uint64_t get_uint64_(size_t offset, size_t length) const
void put_float(float value, size_t offset)
void put_int16(int16_t value, size_t offset)
std::vector< uint8_t > get_vector(size_t length, size_t offset)
double get_double(size_t offset)
int32_t get_int32(size_t offset)
void put_double(double value)
void put_float(float value)
void put_uint32(uint32_t value, size_t offset)
void put_uint16(uint16_t value, size_t offset)
void put_uint8(uint8_t value, size_t offset)
uint32_t get_uint32(size_t offset)
int16_t get_int16(size_t offset)
int64_t get_int64(size_t offset)
uint64_t get_uint64(size_t offset)
uint64_t get_uint64_(size_t length)
void put_uint64_(uint64_t value, size_t offset, size_t length)
void get_bytes(void *dest, size_t length)
void put_uint32_(uint32_t value, size_t offset, size_t length)
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)
std::vector< uint8_t > get_data()
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)
void put_int32(int32_t value, size_t offset)
uint32_t get_uint24(size_t offset)
void put_uint32_(uint32_t value, size_t length)
size_t get_remaining() const
void put_uint24(uint32_t value)
void put_uint8(uint8_t value)
static ByteBuffer wrap(T value, Endian endianness=LITTLE)
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)
void put_uint64(uint64_t value)
uint32_t get_int24(size_t offset)
void put_int24(int32_t value)
bool get_bool(size_t offset)
ByteBuffer(std::vector< uint8_t > const &data)
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)
uint32_t get_uint32_(size_t offset, size_t length) const
void set_position(size_t position)
static ByteBuffer wrap(std::vector< uint8_t > const &data, Endian endianness=LITTLE)
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)
void put_int8(int8_t value)
void put_bool(bool value, size_t offset)
void get_bytes(void *dest, size_t length, size_t offset)
void put_int24(int32_t value, size_t offset)
size_t get_position() const
To bit_cast(const From &src)
Convert data between types, without aliasing issues or undefined behaviour.
uint16_t uint16_t & capacity