26#ifndef ETL_BIT_STREAM_INCLUDED
27#define ETL_BIT_STREAM_INCLUDED
96 pdata =
reinterpret_cast<unsigned char*
>(
begin_);
116 bits_available =
CHAR_BIT * length_chars;
124 return (bits_available == 0
U);
134 if (pdata != ETL_NULLPTR)
136 if (bits_available > 0)
138 unsigned char chunk = value ? 1 : 0;
150 template <
typename T>
157#if ETL_USING_64BIT_TYPES
171 return put_integral(value,
nbits);
178 template <
typename T>
184 unsigned char data[
sizeof(
T)];
185 to_bytes(value, data);
187 for (
size_t i = 0
UL;
i <
sizeof(
T); ++
i)
205 if (pdata != ETL_NULLPTR)
208 if (bits_available > 0
U)
221 template <
typename T>
228 if (pdata != ETL_NULLPTR)
231 if (bits_available >=
nbits)
238 unsigned char mask_width =
static_cast<unsigned char>(etl::min(
nbits, bits_available_in_char));
264 template <
typename T>
270 if (pdata != ETL_NULLPTR)
275 if (bits_available >=
nbits)
280 for (
size_t i = 0
UL;
i <
sizeof(
T); ++
i)
285 from_bytes(
reinterpret_cast<const unsigned char*
>(data.raw), value);
299 size_t s = char_index;
302 if (bits_available_in_char !=
CHAR_BIT)
315 return (length_chars *
CHAR_BIT) - bits_available;
331 return pdata +
size();
343 if (pdata != ETL_NULLPTR)
346 if (bits_available >=
nbits)
351 unsigned char mask_width =
static_cast<unsigned char>(etl::min(
nbits, bits_available_in_char));
370#if ETL_USING_64BIT_TYPES
374 bool put_integral(uint64_t value, uint_least8_t nbits)
376 bool success =
false;
378 if (pdata != ETL_NULLPTR)
381 if (bits_available >= nbits)
386 unsigned char mask_width =
static_cast<unsigned char>(etl::min(nbits, bits_available_in_char));
388 uint64_t mask = ((uint64_t(1U) << mask_width) - 1U) << nbits;
392 uint64_t chunk = ((value & mask) >> nbits) << (bits_available_in_char - mask_width);
394 put_chunk(
static_cast<unsigned char>(chunk), mask_width);
408 void put_chunk(
unsigned char chunk,
unsigned char nbits)
411 if (bits_available_in_char == 8U)
413 pdata[char_index] = 0U;
416 pdata[char_index] |= chunk;
423 unsigned char get_chunk(
unsigned char nbits)
425 unsigned char value = pdata[char_index];
427 value >>= (bits_available_in_char - nbits);
431 if (nbits == CHAR_BIT)
437 mask = (1U << nbits) - 1;
452 bool result = (pdata[char_index] & (1U << (bits_available_in_char - 1U))) != 0U;
462 template <
typename T>
463 void from_bytes(
const unsigned char* data, T& value)
468 if (etl::endianness::value() == etl::endian::little)
470 etl::reverse_copy(data, data +
sizeof(T), temp.raw);
474 etl::copy(data, data +
sizeof(T), temp.raw);
477 value = *
reinterpret_cast<T*
>(temp.raw);
483 template <
typename T>
484 void to_bytes(T value,
unsigned char* data)
486 unsigned char* pf =
reinterpret_cast<unsigned char*
>(&value);
489 if (etl::endianness::value() == etl::endian::little)
491 etl::reverse_copy(pf, pf +
sizeof(T), data);
495 etl::copy(pf, pf +
sizeof(T), data);
503 void step(
unsigned char nbits)
505 bits_available_in_char -= nbits;
507 if (bits_available_in_char == 0)
510 bits_available_in_char = 8;
513 bits_available -= nbits;
516 unsigned char *pdata;
518 unsigned char bits_available_in_char;
520 size_t bits_available;
539 template <
size_t Length>
552 template <
size_t Length>
593 bits_available =
CHAR_BIT * length_chars;
605 size_t capacity_bits()
const
615 return (bits_available == length_chars);
623 return (bits_available == 0
U);
631 unsigned char chunk = value ? 1 : 0;
653 template <
typename T>
665 template <
typename T>
690 while (
nbits > bits_available_in_char)
692 step(bits_available_in_char);
693 nbits -= bits_available_in_char;
698 step(
static_cast<unsigned char>(
nbits));
710 size_t s = char_index;
713 if (bits_available_in_char !=
CHAR_BIT)
733 template <
size_t Nbits>
736 return bits_available /
Nbits;
743 template <
typename T>
755 return bits_available /
nbits;
763 return bits_available;
853 if (bits_available_in_char != 0
U)
885 template <
typename T>
891 if (stream_endianness == etl::endian::little)
900 unsigned char mask_width =
static_cast<unsigned char>(etl::min(nbits, bits_available_in_char));
902 T mask = ((T(1U) << mask_width) - 1U) << nbits;
906 T chunk = ((value & mask) >> nbits) << (bits_available_in_char - mask_width);
908 write_chunk(
static_cast<char>(chunk), mask_width);
911 if (callback.is_valid())
920 void write_chunk(
char chunk,
unsigned char nbits)
923 if (bits_available_in_char == CHAR_BIT)
925 pdata[char_index] = 0U;
928 pdata[char_index] |= chunk;
936 void flush_full_bytes()
941 callback(callback_parameter_type(pdata, pdata + char_index));
943 bits_available = CHAR_BIT * length_chars;
945 if (bits_available_in_char != 0U)
948 pdata[0] = pdata[char_index];
949 bits_available -= (CHAR_BIT - bits_available_in_char);
960 void step(
unsigned char nbits)
962 bits_available_in_char -= nbits;
964 if (bits_available_in_char == 0)
967 bits_available_in_char = CHAR_BIT;
970 bits_available -= nbits;
974 const size_t length_chars;
976 unsigned char bits_available_in_char;
978 size_t bits_available;
979 callback_type callback;
988 stream.write_unchecked(value);
997 return stream.write(value);
1005 template <
typename T>
1017 template <
typename T>
1037 template <
size_t Length>
1049 template <
size_t Length>
1061 template <
size_t Length>
1073 template <
size_t Length>
1111 bits_available =
CHAR_BIT * length_chars;
1117 template <
typename T>
1127 template <
typename T>
1133 if (bits_available > 0
U)
1144 template <
typename T>
1152 return static_cast<T>(value);
1158 template <
typename T>
1165 if (bits_available >=
nbits)
1178 return length_chars;
1240 while (
nbits > bits_available_in_char)
1242 nbits -= bits_available_in_char;
1243 step(bits_available_in_char);
1248 step(
static_cast<unsigned char>(
nbits));
1261 template <
typename T>
1273 unsigned char mask_width =
static_cast<unsigned char>(etl::min(
nbits, bits_available_in_char));
1281 if (stream_endianness == etl::endian::little)
1283 value = value << ((CHAR_BIT *
sizeof(T)) - bits);
1287 if (is_signed && (bits != (CHAR_BIT *
sizeof(T))))
1298 unsigned char get_chunk(
unsigned char nbits)
1300 unsigned char value = pdata[char_index];
1301 value >>= (bits_available_in_char - nbits);
1305 if (nbits == CHAR_BIT)
1311 mask = (1U << nbits) - 1;
1326 bool result = (pdata[char_index] & (1U << (bits_available_in_char - 1U))) != 0U;
1337 void step(
unsigned char nbits)
1339 bits_available_in_char -= nbits;
1341 if (bits_available_in_char == 0)
1344 bits_available_in_char = 8;
1347 bits_available -= nbits;
1351 size_t length_chars;
1353 unsigned char bits_available_in_char;
1355 size_t bits_available;
1361 template <
typename T>
1364 return stream.read_unchecked<
T>();
1367 template <
typename T>
1376 template <
typename T>
1382 template <
typename T>
1385 return stream.
read<T>(nbits);
1394 return stream.read_unchecked<
bool>();
1403 return stream.
read<
bool>();
Reads bit streams.
Definition bit_stream.h:1028
etl::enable_if< etl::is_same< bool, T >::value, etl::optional< bool > >::type read()
For bool types.
Definition bit_stream.h:1129
const_iterator end() const
Returns end of the stream.
Definition bit_stream.h:1208
bit_stream_reader(const etl::span< const unsigned char, Length > &span_, etl::endian stream_endianness_)
Construct from span.
Definition bit_stream.h:1074
const_iterator cend() const
Returns end of the stream.
Definition bit_stream.h:1216
bit_stream_reader(void *begin_, void *end_, etl::endian stream_endianness_)
Construct from range.
Definition bit_stream.h:1085
bit_stream_reader(void *begin_, size_t length_, etl::endian stream_endianness_)
Construct from begin and length.
Definition bit_stream.h:1096
bit_stream_reader(const etl::span< char, Length > &span_, etl::endian stream_endianness_)
Construct from span.
Definition bit_stream.h:1038
size_t size_bits() const
Returns the number of bits in the stream buffer.
Definition bit_stream.h:1184
etl::enable_if< etl::is_integral< T >::value &&!etl::is_same< bool, T >::value, T >::type read_unchecked(uint_least8_t nbits=CHAR_BIT *sizeof(T))
For integral types.
Definition bit_stream.h:1146
bool skip(size_t nbits)
Definition bit_stream.h:1234
bit_stream_reader(const etl::span< const char, Length > &span_, etl::endian stream_endianness_)
Construct from span.
Definition bit_stream.h:1062
bit_stream_reader(const etl::span< unsigned char, Length > &span_, etl::endian stream_endianness_)
Construct from span.
Definition bit_stream.h:1050
etl::enable_if< etl::is_integral< T >::value &&!etl::is_same< bool, T >::value, etl::optional< T > >::type read(uint_least8_t nbits=CHAR_BIT *sizeof(T))
For integral types.
Definition bit_stream.h:1160
void restart()
Sets the indexes back to the beginning of the stream.
Definition bit_stream.h:1107
const_iterator cbegin() const
Returns start of the stream.
Definition bit_stream.h:1200
etl::enable_if< etl::is_same< bool, T >::value, bool >::type read_unchecked()
For bool types.
Definition bit_stream.h:1119
etl::span< const char > data() const
Returns a span of whole the stream.
Definition bit_stream.h:1224
const_iterator begin() const
Returns start of the stream.
Definition bit_stream.h:1192
size_t size_bytes() const
Returns the number of bytes in the stream buffer.
Definition bit_stream.h:1176
Writes bits streams.
Definition bit_stream.h:527
bit_stream_writer(void *begin_, void *end_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from range.
Definition bit_stream.h:565
etl::enable_if< etl::is_integral< T >::value, bool >::type write(T value, uint_least8_t nbits=CHAR_BIT *sizeof(T))
For integral types.
Definition bit_stream.h:667
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition bit_stream.h:708
etl::enable_if< etl::is_integral< T >::value, void >::type write_unchecked(T value, uint_least8_t nbits=CHAR_BIT *sizeof(T))
For integral types.
Definition bit_stream.h:655
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition bit_stream.h:825
bool write(bool value)
Writes a boolean to the stream.
Definition bit_stream.h:638
size_t size_bits() const
Returns the number of bits used in the stream.
Definition bit_stream.h:724
size_t available_bits() const
The number of bits left in the stream.
Definition bit_stream.h:761
const_iterator cend() const
Returns end of the stream.
Definition bit_stream.h:809
callback_type get_callback() const
Gets the function to call after every write.
Definition bit_stream.h:874
bool empty() const
Returns true if the bitsteam indexes have been reset.
Definition bit_stream.h:613
bit_stream_writer(void *begin_, size_t length_chars_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from begin and length.
Definition bit_stream.h:577
bit_stream_writer(const etl::span< unsigned char, Length > &span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition bit_stream.h:553
bit_stream_writer(const etl::span< char, Length > &span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition bit_stream.h:540
iterator end()
Returns end of the stream.
Definition bit_stream.h:793
void set_callback(callback_type callback_)
Sets the function to call after every write.
Definition bit_stream.h:866
size_t available() const
Definition bit_stream.h:734
etl::span< char > data()
Returns a span of whole the stream.
Definition bit_stream.h:833
bool full() const
Returns true if the bitsteam indexes have reached the end.
Definition bit_stream.h:621
bool skip(size_t nbits)
Definition bit_stream.h:684
etl::span< char > used_data()
Returns a span of the used portion of the stream.
Definition bit_stream.h:817
size_t capacity_bytes() const
Returns the maximum capacity in bits.
Definition bit_stream.h:599
etl::span< const char > data() const
Returns a span of whole the stream.
Definition bit_stream.h:841
void restart()
Sets the indexes back to the beginning of the stream.
Definition bit_stream.h:589
void write_unchecked(bool value)
Writes a boolean to the stream.
Definition bit_stream.h:629
void flush()
Flush the last byte, if partially filled, to the callback, if valid.
Definition bit_stream.h:849
const_iterator cbegin() const
Returns start of the stream.
Definition bit_stream.h:785
size_t available(size_t nbits) const
Definition bit_stream.h:753
const_iterator end() const
Returns end of the stream.
Definition bit_stream.h:801
const_iterator begin() const
Returns start of the stream.
Definition bit_stream.h:777
iterator begin()
Returns start of the stream.
Definition bit_stream.h:769
Definition bit_stream.h:56
etl::enable_if< etl::is_integral< T >::value, bool >::type get(T &value, uint_least8_t nbits=CHAR_BIT *sizeof(T))
For integral types.
Definition bit_stream.h:223
etl::enable_if< etl::is_integral< T >::value, bool >::type put(T value, uint_least8_t nbits=CHAR_BIT *sizeof(T))
For integral types.
Definition bit_stream.h:152
bool put(int64_t value, uint_least8_t nbits=CHAR_BIT *sizeof(int64_t))
For 64bit integral types.
Definition bit_stream.h:161
etl::enable_if< etl::is_floating_point< T >::value, bool >::type put(T value)
For floating point types.
Definition bit_stream.h:180
void restart()
Sets the indexes back to the beginning of the stream.
Definition bit_stream.h:112
size_t size() const
Returns the number of bytes used in the stream.
Definition bit_stream.h:297
size_t bits() const
Returns the number of bits used in the stream.
Definition bit_stream.h:313
bit_stream(void *begin_, void *end_)
Construct from range.
Definition bit_stream.h:74
bool put(uint64_t value, uint_least8_t nbits=CHAR_BIT *sizeof(uint64_t))
For 64bit integral types.
Definition bit_stream.h:169
bit_stream(void *begin_, size_t length_)
Construct from begin and length.
Definition bit_stream.h:84
etl::enable_if< etl::is_floating_point< T >::value, bool >::type get(T &value)
For floating point types.
Definition bit_stream.h:266
bool at_end() const
Returns true if the bitsteam indexes have reached the end.
Definition bit_stream.h:122
bool put(bool value)
Writes a boolean to the stream.
Definition bit_stream.h:130
bit_stream()
Default constructor.
Definition bit_stream.h:64
bool get(bool &value)
For bool types.
Definition bit_stream.h:201
void set_stream(void *begin_, size_t length_)
Construct from begin and length.
Definition bit_stream.h:94
void set_stream(void *begin_, void *end_)
Construct from range.
Definition bit_stream.h:104
const_iterator end() const
Returns end of the stream.
Definition bit_stream.h:329
const_iterator begin() const
Returns start of the stream.
Definition bit_stream.h:321
Declaration.
Definition delegate_cpp03.h:175
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type reverse_bits(T value)
Definition binary.h:541
Definition endianness.h:100
Definition integral_limits.h:516
is_same
Definition type_traits_generator.h:1041
is_signed
Definition type_traits_generator.h:1011
make_signed
Definition type_traits_generator.h:1171
make_unsigned
Definition type_traits_generator.h:1181
bitset_ext
Definition absolute.h:38
bool read_unchecked< bool >(etl::bit_stream_reader &stream)
Read an unchecked bool from a stream.
Definition bit_stream.h:1392
etl::optional< T > read(etl::bit_stream_reader &stream)
Read a checked type from a stream.
Definition bit_stream.h:1377
void write_unchecked(etl::bit_stream_writer &stream, bool value)
Definition bit_stream.h:986
etl::optional< bool > read< bool >(etl::bit_stream_reader &stream)
Read a bool from a stream.
Definition bit_stream.h:1401
T read_unchecked(etl::bit_stream_reader &stream)
Read an unchecked type from a stream.
Definition bit_stream.h:1362
bool write(etl::bit_stream_writer &stream, bool value)
Definition bit_stream.h:995
pair holds two objects of arbitrary type
Definition utility.h:164