31#ifndef ETL_BYTE_STREAM_INCLUDED
32#define ETL_BYTE_STREAM_INCLUDED
58 typedef char* iterator;
59 typedef const char* const_iterator;
61 typedef etl::delegate<void(callback_parameter_type)> callback_type;
67 : pdata(span_.
begin())
68 , pcurrent(span_.
begin())
70 , stream_endianness(stream_endianness_)
79 : pdata(reinterpret_cast<char*>(span_.
begin()))
80 , pcurrent(reinterpret_cast<char*>(span_.
begin()))
82 , stream_endianness(stream_endianness_)
91 : pdata(reinterpret_cast<char*>(begin_))
92 , pcurrent(reinterpret_cast<char*>(begin_))
93 , stream_length(static_cast<size_t>(
etl::distance(reinterpret_cast<char*>(begin_), reinterpret_cast<char*>(end_))))
94 , stream_endianness(stream_endianness_)
103 : pdata(reinterpret_cast<char*>(begin_))
104 , pcurrent(reinterpret_cast<char*>(begin_))
105 , stream_length(length_)
106 , stream_endianness(stream_endianness_)
107 , callback(callback_)
114 template <
typename T,
size_t Size>
118 , stream_length(begin_ + (Size * sizeof(T)))
119 , stream_endianness(stream_endianness_)
120 , callback(callback_)
129 *pcurrent++ = value ? 1 : 0;
150 template <
typename T>
151 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
void>
::type write_unchecked(T value)
159 template <
typename T>
160 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
bool>
::type write(T value)
175 template <
typename T>
178 typename etl::span<T>::iterator itr = range.
begin();
180 while (itr != range.
end())
190 template <
typename T>
191 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
bool>
::type write(
const etl::span<T>& range)
206 template <
typename T>
207 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
void>
::type write_unchecked(
const T* start,
size_t length)
209 while (length-- != 0U)
219 template <
typename T>
220 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
bool>
::type write(
const T* start,
size_t length)
237 template <
typename T>
255 pcurrent = pdata + n;
285 const_iterator
end()
const
375 return static_cast<size_t>(etl::distance(pdata, pcurrent));
383 return stream_length;
389 template <
typename T>
408 callback = callback_;
424 return stream_endianness;
432 template <
typename T>
433 typename etl::enable_if<
sizeof(T) == 1U,
void>
::type to_bytes(
const T value)
435 *pcurrent =
static_cast<char>(value);
440 template <
typename T>
441 typename etl::enable_if<
sizeof(T) != 1U,
void>
::type to_bytes(
const T value)
443 const char* pv =
reinterpret_cast<const char*
>(&value);
444 copy_value(pv, pcurrent,
sizeof(T));
451 callback.call_if(etl::span<char>(pcurrent, pcurrent + n));
457 void copy_value(
const char* source,
char* destination,
size_t length)
const
459 const etl::endian platform_endianness = etl::endianness::value();
461 if (stream_endianness == platform_endianness)
463 etl::copy(source, source + length, destination);
467 etl::reverse_copy(source, source + length, destination);
473 const size_t stream_length;
474 const etl::endian stream_endianness;
475 callback_type callback;
486 typedef char* iterator;
487 typedef const char* const_iterator;
493 : pdata(span_.
begin())
494 , pcurrent(span_.
begin())
496 , stream_endianness(stream_endianness_)
504 : pdata(span_.
begin())
505 , pcurrent(span_.
begin())
507 , stream_endianness(stream_endianness_)
515 : pdata(reinterpret_cast<const char*>(begin_))
516 , pcurrent(reinterpret_cast<const char*>(begin_))
517 , stream_length(static_cast<size_t>(
etl::distance(reinterpret_cast<const char*>(begin_), reinterpret_cast<const char*>(end_))))
518 , stream_endianness(stream_endianness_)
526 : pdata(reinterpret_cast<const char*>(begin_))
527 , pcurrent(reinterpret_cast<const char*>(begin_))
528 , stream_length(length_)
529 , stream_endianness(stream_endianness_)
536 template <
typename T,
size_t Size>
540 , stream_length(begin_ + (Size * sizeof(T)))
541 , stream_endianness(stream_endianness_)
548 template <
typename T,
size_t Size>
552 , stream_length(begin_ + (Size * sizeof(T)))
553 , stream_endianness(stream_endianness_)
560 template <
typename T>
561 typename etl::enable_if< etl::is_integral<T>::value || etl::is_floating_point<T>::value, T>
::type read_unchecked()
563 return from_bytes<T>();
569 template <
typename T>
586 template <
typename T>
591 const char* pend = pcurrent + (n *
sizeof(T));
593 result =
etl::span<const T>(
reinterpret_cast<const T*
>(pcurrent),
reinterpret_cast<const T*
>(pend));
602 template <
typename T>
619 template <
typename T>
623 typename etl::span<T>::iterator destination = range.
begin();
625 while (destination != range.
end())
627 *destination++ = from_bytes<T>();
636 template <
typename T>
652 template <
typename T>
656 T* destination = start;
658 for (
size_t i = 0; i < length; ++i)
660 *destination++ = from_bytes<T>();
669 template <
typename T>
687 template <
typename T>
692 pcurrent += (n *
sizeof(T));
706 pcurrent = pdata + n;
720 const_iterator
end()
const
778 return stream_length;
784 template <
typename T>
787 size_t used =
static_cast<size_t>(etl::distance(pdata, pcurrent));
789 return (stream_length - used) /
sizeof(T);
805 return stream_endianness;
813 template <
typename T>
814 typename etl::enable_if<
sizeof(T) == 1U, T>
::type from_bytes()
816 return static_cast<T
>(*pcurrent++);
820 template <
typename T>
821 typename etl::enable_if<
sizeof(T) != 1U, T>
::type from_bytes()
825 char* pv =
reinterpret_cast<char*
>(&value);
826 copy_value(pcurrent, pv,
sizeof(T));
827 pcurrent +=
sizeof(T);
833 void copy_value(
const char* source,
char* destination,
size_t length)
const
835 const etl::endian platform_endianness = etl::endianness::value();
837 if (stream_endianness == platform_endianness)
839 etl::copy(source, source + length, destination);
843 etl::reverse_copy(source, source + length, destination);
847 const char*
const pdata;
848 const char* pcurrent;
849 const size_t stream_length;
850 const etl::endian stream_endianness;
858 template <
typename T>
867 template <
typename T>
870 return stream.
write(value);
878 template <
typename T>
887 template <
typename T>
890 return stream.
read<T>();
Definition byte_stream.h:483
const_iterator cbegin() const
Returns start of the stream.
Definition byte_stream.h:728
byte_stream_reader(etl::span< const char > span_, etl::endian stream_endianness_)
Construct from span.
Definition byte_stream.h:503
bool empty() const
Returns true if the byte stream is empty.
Definition byte_stream.h:768
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:603
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:587
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:671
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:621
byte_stream_reader(const T(&begin_)[Size], etl::endian stream_endianness_)
Construct from const array.
Definition byte_stream.h:549
const_iterator begin() const
Returns start of the stream.
Definition byte_stream.h:712
const_iterator cend() const
Returns end of the stream.
Definition byte_stream.h:736
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition byte_stream.h:744
size_t available_bytes() const
The number of bytes left in the stream.
Definition byte_stream.h:795
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:638
size_t available() const
The number of T left in the stream.
Definition byte_stream.h:785
byte_stream_reader(etl::span< char > span_, etl::endian stream_endianness_)
Construct from span.
Definition byte_stream.h:492
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition byte_stream.h:776
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:653
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:561
etl::span< const char > data() const
Returns a span of whole the stream.
Definition byte_stream.h:760
etl::span< const char > free_data() const
Returns a span of the free portion of the stream.
Definition byte_stream.h:752
bool skip(size_t n)
Definition byte_stream.h:688
void restart(size_t n=0U)
Sets the index back to the position in the stream. Default = 0.
Definition byte_stream.h:704
byte_stream_reader(const void *begin_, size_t length_, etl::endian stream_endianness_)
Construct from begin and length.
Definition byte_stream.h:525
byte_stream_reader(T(&begin_)[Size], etl::endian stream_endianness_)
Construct from array.
Definition byte_stream.h:537
etl::endian get_endianness() const
Gets the endianness of the stream.
Definition byte_stream.h:803
const_iterator end() const
Returns end of the stream.
Definition byte_stream.h:720
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:570
byte_stream_reader(const void *begin_, const void *end_, etl::endian stream_endianness_)
Construct from range.
Definition byte_stream.h:514
Encodes a byte stream.
Definition byte_stream.h:55
byte_stream_writer(etl::span< unsigned char > span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition byte_stream.h:78
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:207
const_iterator cbegin() const
Returns start of the stream.
Definition byte_stream.h:293
etl::span< char > data()
Returns a span of whole the stream.
Definition byte_stream.h:341
const_iterator end() const
Returns end of the stream.
Definition byte_stream.h:285
etl::span< char > free_data()
Returns a span of the free portion of the stream.
Definition byte_stream.h:325
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:102
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:191
iterator begin()
Returns start of the stream.
Definition byte_stream.h:261
byte_stream_writer(T(&begin_)[Size], etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from array.
Definition byte_stream.h:115
void restart(size_t n=0U)
Sets the index back to the position in the stream. Default = 0.
Definition byte_stream.h:253
byte_stream_writer(void *begin_, void *end_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from range.
Definition byte_stream.h:90
bool write(bool value)
Writes a boolean to the stream.
Definition byte_stream.h:135
void write_unchecked(bool value)
Writes a boolean to the stream.
Definition byte_stream.h:127
etl::endian get_endianness() const
Gets the endianness of the stream.
Definition byte_stream.h:422
void set_callback(callback_type callback_)
Sets the function to call after every write.
Definition byte_stream.h:406
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:151
etl::span< char > used_data()
Returns a span of the used portion of the stream.
Definition byte_stream.h:309
iterator end()
Returns end of the stream.
Definition byte_stream.h:277
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:220
bool empty() const
Returns true if the byte stream is empty.
Definition byte_stream.h:365
byte_stream_writer(etl::span< char > span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition byte_stream.h:66
const_iterator cend() const
Returns end of the stream.
Definition byte_stream.h:301
bool skip(size_t n)
Definition byte_stream.h:238
size_t available_bytes() const
The number of bytes left in the stream.
Definition byte_stream.h:398
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:160
size_t available() const
The number of T left in the stream.
Definition byte_stream.h:390
etl::span< const char > data() const
Returns a span of whole the stream.
Definition byte_stream.h:349
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition byte_stream.h:317
callback_type get_callback() const
Gets the function to call after every write.
Definition byte_stream.h:414
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:176
size_t capacity() const
Returns the maximum number of bytes in the stream.
Definition byte_stream.h:381
etl::span< const char > free_data() const
Returns a span of the free portion of the stream.
Definition byte_stream.h:333
const_iterator begin() const
Returns start of the stream.
Definition byte_stream.h:269
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition byte_stream.h:373
bool full() const
Returns true if the byte stream index has reached the end.
Definition byte_stream.h:357
Declaration.
Definition delegate_cpp03.h:191
Span - Fixed Extent.
Definition span.h:208
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:484
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:564
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:508
Definition endianness.h:100
Definition optional.h:1238
etl::optional< T > read(etl::bit_stream_reader &stream)
Read a checked type from a stream.
Definition bit_stream.h:1430
void write_unchecked(etl::bit_stream_writer &stream, bool value)
Definition bit_stream.h:1026
T read_unchecked(etl::bit_stream_reader &stream)
Read an unchecked type from a stream.
Definition bit_stream.h:1415
bool write(etl::bit_stream_writer &stream, bool value)
Definition bit_stream.h:1035