31#ifndef ETL_BYTE_STREAM_INCLUDED
32#define ETL_BYTE_STREAM_INCLUDED
61 typedef char* iterator;
62 typedef const char* const_iterator;
70 : pdata(span_.
begin())
71 , pcurrent(span_.
begin())
73 , stream_endianness(stream_endianness_)
82 : pdata(reinterpret_cast<char*>(span_.
begin()))
83 , pcurrent(reinterpret_cast<char*>(span_.
begin()))
85 , stream_endianness(stream_endianness_)
94 : pdata(reinterpret_cast<char*>(begin_))
95 , pcurrent(reinterpret_cast<char*>(begin_))
96 , length(
etl::distance(reinterpret_cast<char*>(begin_), reinterpret_cast<char*>(end_)))
97 , stream_endianness(stream_endianness_)
106 : pdata(reinterpret_cast<char*>(begin_))
107 , pcurrent(reinterpret_cast<char*>(begin_))
109 , stream_endianness(stream_endianness_)
117 template <
typename T,
size_t Size>
121 , length(begin_ + (Size * sizeof(T)))
122 , stream_endianness(stream_endianness_)
132 *pcurrent++ = value ? 1 : 0;
140 bool success = (available<bool>() > 0U);
153 template <
typename T>
163 template <
typename T>
167 bool success = (available<T>() > 0U);
180 template <
typename T>
184 typename etl::span<T>::iterator itr = range.
begin();
186 while (itr != range.
end())
196 template <
typename T>
200 bool success = (available<T>() >= range.
size());
213 template <
typename T>
217 while (length-- != 0U)
227 template <
typename T>
229 write(
const T* start,
size_t length)
231 bool success = (available<T>() >= length);
246 template <
typename T>
249 bool success = (available<T>() >= n);
264 pcurrent =
const_cast<char*
>(pdata + n);
294 const_iterator
end()
const
384 return etl::distance(pdata, pcurrent);
398 template <
typename T>
409 return available<char>();
433 return stream_endianness;
441 template <
typename T>
443 to_bytes(
const T value)
445 *pcurrent =
static_cast<char>(value);
450 template <
typename T>
452 to_bytes(
const T value)
454 const char* pv =
reinterpret_cast<const char*
>(&value);
455 copy_value(pv, pcurrent,
sizeof(T));
468 void copy_value(
const char* source,
char* destination,
size_t length)
const
470 const etl::endian platform_endianness = etl::endianness::value();
472 if (stream_endianness == platform_endianness)
474 etl::copy(source, source + length, destination);
478 etl::reverse_copy(source, source + length, destination);
486 callback_type callback;
497 typedef char* iterator;
498 typedef const char* const_iterator;
504 : pdata(span_.
begin())
505 , pcurrent(span_.
begin())
507 , stream_endianness(stream_endianness_)
515 : pdata(span_.
begin())
516 , pcurrent(span_.
begin())
518 , stream_endianness(stream_endianness_)
526 : pdata(reinterpret_cast<const char*>(begin_))
527 , pcurrent(reinterpret_cast<const char*>(begin_))
528 , length(
etl::distance(reinterpret_cast<const char*>(begin_), reinterpret_cast<const char*>(end_)))
529 , stream_endianness(stream_endianness_)
537 : pdata(reinterpret_cast<const char*>(begin_))
538 , pcurrent(reinterpret_cast<const char*>(begin_))
540 , stream_endianness(stream_endianness_)
547 template <
typename T,
size_t Size>
551 , length(begin_ + (Size * sizeof(T)))
552 , stream_endianness(stream_endianness_)
559 template <
typename T,
size_t Size>
563 , length(begin_ + (Size * sizeof(T)))
564 , stream_endianness(stream_endianness_)
571 template <
typename T>
575 return from_bytes<T>();
581 template <
typename T>
588 if (available<T>() > 0U)
590 result = read_unchecked<T>();
599 template <
typename T>
605 const char* pend = pcurrent + (n *
sizeof(T));
607 result =
etl::span<const T>(
reinterpret_cast<const T*
>(pcurrent),
reinterpret_cast<const T*
>(pend));
616 template <
typename T>
623 if (available<T>() >= n)
625 result = read_unchecked<T>(n);
634 template <
typename T>
638 typename etl::span<T>::iterator destination = range.
begin();
640 while (destination != range.
end())
642 *destination++ = from_bytes<T>();
651 template <
typename T>
656 if (available<T>() >= range.
size())
667 template <
typename T>
671 T* destination = start;
673 for (
size_t i = 0; i < length; ++i)
675 *destination++ = from_bytes<T>();
684 template <
typename T>
689 if (available<T>() >= length)
702 template <
typename T>
705 if (n <= available<T>())
707 pcurrent += (n *
sizeof(T));
721 pcurrent = pdata + n;
735 const_iterator
end()
const
785 return available<char>() == 0U;
799 template <
typename T>
802 size_t used = etl::distance(pdata, pcurrent);
804 return (length - used) /
sizeof(T);
812 return available<char>();
820 template <
typename T>
824 return static_cast<T
>(*pcurrent++);
828 template <
typename T>
834 char* pv =
reinterpret_cast<char*
>(&value);
835 copy_value(pcurrent, pv,
sizeof(T));
836 pcurrent +=
sizeof(T);
842 void copy_value(
const char* source,
char* destination,
size_t length)
const
844 const etl::endian platform_endianness = etl::endianness::value();
846 if (stream_endianness == platform_endianness)
848 etl::copy(source, source + length, destination);
852 etl::reverse_copy(source, source + length, destination);
856 const char*
const pdata;
857 const char* pcurrent;
867 template <
typename T>
876 template <
typename T>
879 return stream.
write(value);
887 template <
typename T>
896 template <
typename T>
899 return stream.
read<T>();
Definition: byte_stream.h:494
const_iterator cbegin() const
Returns start of the stream.
Definition: byte_stream.h:743
byte_stream_reader(etl::span< const char > span_, etl::endian stream_endianness_)
Construct from span.
Definition: byte_stream.h:514
bool empty() const
Returns true if the byte stream is empty.
Definition: byte_stream.h:783
etl::enable_if< sizeof(T)==1U, etl::optional< etl::span< constT > > >::type read(size_t n)
Read a byte range from the stream.
Definition: byte_stream.h:618
etl::enable_if< sizeof(T)==1U, etl::span< constT > >::type read_unchecked(size_t n)
Read a byte range from the stream.
Definition: byte_stream.h:601
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, etl::optional< etl::span< constT > > >::type read(T *start, size_t length)
Read a range of T from the stream.
Definition: byte_stream.h:686
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, etl::span< constT > >::type read_unchecked(etl::span< T > range)
Read a range of T from the stream.
Definition: byte_stream.h:636
byte_stream_reader(const T(&begin_)[Size], etl::endian stream_endianness_)
Construct from const array.
Definition: byte_stream.h:560
const_iterator begin() const
Returns start of the stream.
Definition: byte_stream.h:727
const_iterator cend() const
Returns end of the stream.
Definition: byte_stream.h:751
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition: byte_stream.h:759
size_t available_bytes() const
The number of bytes left in the stream.
Definition: byte_stream.h:810
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, etl::optional< etl::span< constT > > >::type read(etl::span< T > range)
Read a range of T from the stream.
Definition: byte_stream.h:653
size_t available() const
The number of T left in the stream.
Definition: byte_stream.h:800
byte_stream_reader(etl::span< char > span_, etl::endian stream_endianness_)
Construct from span.
Definition: byte_stream.h:503
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition: byte_stream.h:791
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, etl::span< constT > >::type read_unchecked(T *start, size_t length)
Read a range of T from the stream.
Definition: byte_stream.h:669
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, T >::type read_unchecked()
Read a value from the stream.
Definition: byte_stream.h:573
etl::span< const char > data() const
Returns a span of whole the stream.
Definition: byte_stream.h:775
etl::span< const char > free_data() const
Returns a span of the free portion of the stream.
Definition: byte_stream.h:767
bool skip(size_t n)
Definition: byte_stream.h:703
void restart(size_t n=0U)
Sets the index back to the position in the stream. Default = 0.
Definition: byte_stream.h:719
byte_stream_reader(const void *begin_, size_t length_, etl::endian stream_endianness_)
Construct from begin and length.
Definition: byte_stream.h:536
byte_stream_reader(T(&begin_)[Size], etl::endian stream_endianness_)
Construct from array.
Definition: byte_stream.h:548
const_iterator end() const
Returns end of the stream.
Definition: byte_stream.h:735
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, etl::optional< T > >::type read()
Read a value from the stream.
Definition: byte_stream.h:583
byte_stream_reader(const void *begin_, const void *end_, etl::endian stream_endianness_)
Construct from range.
Definition: byte_stream.h:525
Encodes a byte stream.
Definition: byte_stream.h:58
byte_stream_writer(etl::span< unsigned char > span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition: byte_stream.h:81
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, void >::type write_unchecked(const T *start, size_t length)
Write a range of T to the stream.
Definition: byte_stream.h:215
const_iterator cbegin() const
Returns start of the stream.
Definition: byte_stream.h:302
etl::span< char > data()
Returns a span of whole the stream.
Definition: byte_stream.h:350
const_iterator end() const
Returns end of the stream.
Definition: byte_stream.h:294
etl::span< char > free_data()
Returns a span of the free portion of the stream.
Definition: byte_stream.h:334
byte_stream_writer(void *begin_, size_t length_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from begin and length.
Definition: byte_stream.h:105
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, bool >::type write(const etl::span< T > &range)
Write a range of T to the stream.
Definition: byte_stream.h:198
iterator begin()
Returns start of the stream.
Definition: byte_stream.h:270
byte_stream_writer(T(&begin_)[Size], etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from array.
Definition: byte_stream.h:118
void restart(size_t n=0U)
Sets the index back to the position in the stream. Default = 0.
Definition: byte_stream.h:262
byte_stream_writer(void *begin_, void *end_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from range.
Definition: byte_stream.h:93
bool write(bool value)
Writes a boolean to the stream.
Definition: byte_stream.h:138
void write_unchecked(bool value)
Writes a boolean to the stream.
Definition: byte_stream.h:130
etl::endian get_endianness() const
Gets the endianness of the stream.
Definition: byte_stream.h:431
void set_callback(callback_type callback_)
Sets the function to call afer every write.
Definition: byte_stream.h:415
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, void >::type write_unchecked(T value)
Write a value to the stream.
Definition: byte_stream.h:155
etl::span< char > used_data()
Returns a span of the used portion of the stream.
Definition: byte_stream.h:318
iterator end()
Returns end of the stream.
Definition: byte_stream.h:286
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, bool >::type write(const T *start, size_t length)
Write a range of T to the stream.
Definition: byte_stream.h:229
bool empty() const
Returns true if the byte stream is empty.
Definition: byte_stream.h:374
byte_stream_writer(etl::span< char > span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition: byte_stream.h:69
const_iterator cend() const
Returns end of the stream.
Definition: byte_stream.h:310
bool skip(size_t n)
Definition: byte_stream.h:247
size_t available_bytes() const
The number of bytes left in the stream.
Definition: byte_stream.h:407
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, bool >::type write(T value)
Write a value to the stream.
Definition: byte_stream.h:165
size_t available() const
The number of T left in the stream.
Definition: byte_stream.h:399
etl::span< const char > data() const
Returns a span of whole the stream.
Definition: byte_stream.h:358
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition: byte_stream.h:326
callback_type get_callback() const
Gets the function to call afer every write.
Definition: byte_stream.h:423
etl::enable_if< etl::is_integral< T >::value||etl::is_floating_point< T >::value, void >::type write_unchecked(const etl::span< T > &range)
Write a range of T to the stream.
Definition: byte_stream.h:182
size_t capacity() const
Returns the maximum number of bytes in the stream.
Definition: byte_stream.h:390
etl::span< const char > free_data() const
Returns a span of the free portion of the stream.
Definition: byte_stream.h:342
const_iterator begin() const
Returns start of the stream.
Definition: byte_stream.h:278
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition: byte_stream.h:382
bool full() const
Returns true if the byte stream index has reached the end.
Definition: byte_stream.h:366
Definition: callback.h:45
Declaration.
Definition: delegate_cpp03.h:175
Definition: optional.h:108
Span - Fixed Extent.
Definition: span.h:62
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition: span.h:256
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition: span.h:312
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition: span.h:272
Definition: endianness.h:100
enable_if
Definition: type_traits_generator.h:1191
is_floating_point
Definition: type_traits_generator.h:1031
bitset_ext
Definition: absolute.h:38
etl::optional< T > read(etl::bit_stream_reader &stream)
Read a checked type from a stream.
Definition: bit_stream.h:1348
void write_unchecked(etl::bit_stream_writer &stream, bool value)
Definition: bit_stream.h:983
T read_unchecked(etl::bit_stream_reader &stream)
Read an unchecked type from a stream.
Definition: bit_stream.h:1333
bool write(etl::bit_stream_writer &stream, bool value)
Definition: bit_stream.h:992