31#ifndef ETL_BYTE_STREAM_INCLUDED
32#define ETL_BYTE_STREAM_INCLUDED
60 typedef char* iterator;
61 typedef const char* const_iterator;
63 typedef etl::delegate<void(callback_parameter_type)> callback_type;
69 : pdata(span_.
begin())
70 , pcurrent(span_.
begin())
72 , stream_endianness(stream_endianness_)
81 : pdata(reinterpret_cast<char*>(span_.
begin()))
82 , pcurrent(reinterpret_cast<char*>(span_.
begin()))
84 , stream_endianness(stream_endianness_)
93 : pdata(reinterpret_cast<char*>(begin_))
94 , pcurrent(reinterpret_cast<char*>(begin_))
95 , stream_length(static_cast<size_t>(
etl::distance(reinterpret_cast<char*>(begin_), reinterpret_cast<char*>(end_))))
96 , stream_endianness(stream_endianness_)
105 : pdata(reinterpret_cast<char*>(begin_))
106 , pcurrent(reinterpret_cast<char*>(begin_))
107 , stream_length(length_)
108 , stream_endianness(stream_endianness_)
109 , callback(callback_)
116 template <
typename T,
size_t Size>
120 , stream_length(begin_ + (Size * sizeof(T)))
121 , stream_endianness(stream_endianness_)
122 , callback(callback_)
131 *pcurrent++ = value ? 1 : 0;
152 template <
typename T>
153 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
void>
::type write_unchecked(T value)
161 template <
typename T>
162 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
bool>
::type write(T value)
177 template <
typename T>
180 typename etl::span<T>::iterator itr = range.
begin();
182 while (itr != range.
end())
192 template <
typename T>
193 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
bool>
::type write(
const etl::span<T>& range)
208 template <
typename T>
209 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)
211 while (length-- != 0U)
221 template <
typename T>
222 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value,
bool>
::type write(
const T* start,
size_t length)
239 template <
typename T>
257 pcurrent = pdata + n;
287 const_iterator
end()
const
377 return static_cast<size_t>(etl::distance(pdata, pcurrent));
385 return stream_length;
391 template <
typename T>
410 callback = callback_;
426 return stream_endianness;
434 template <
typename T>
435 typename etl::enable_if<
sizeof(T) == 1U,
void>
::type to_bytes(
const T value)
437 *pcurrent =
static_cast<char>(value);
442 template <
typename T>
443 typename etl::enable_if<
sizeof(T) != 1U,
void>
::type to_bytes(
const T value)
445 const char* pv =
reinterpret_cast<const char*
>(&value);
446 copy_value(pv, pcurrent,
sizeof(T));
453 callback.call_if(etl::span<char>(pcurrent, pcurrent + n));
459 void copy_value(
const char* source,
char* destination,
size_t length)
const
461 const etl::endian platform_endianness = etl::endianness::value();
463 if (stream_endianness == platform_endianness)
465 etl::copy(source, source + length, destination);
469 etl::reverse_copy(source, source + length, destination);
475 const size_t stream_length;
476 const etl::endian stream_endianness;
477 callback_type callback;
488 typedef char* iterator;
489 typedef const char* const_iterator;
495 : pdata(span_.
begin())
496 , pcurrent(span_.
begin())
498 , stream_endianness(stream_endianness_)
506 : pdata(span_.
begin())
507 , pcurrent(span_.
begin())
509 , stream_endianness(stream_endianness_)
517 : pdata(reinterpret_cast<const char*>(begin_))
518 , pcurrent(reinterpret_cast<const char*>(begin_))
519 , stream_length(static_cast<size_t>(
etl::distance(reinterpret_cast<const char*>(begin_), reinterpret_cast<const char*>(end_))))
520 , stream_endianness(stream_endianness_)
528 : pdata(reinterpret_cast<const char*>(begin_))
529 , pcurrent(reinterpret_cast<const char*>(begin_))
530 , stream_length(length_)
531 , stream_endianness(stream_endianness_)
538 template <
typename T,
size_t Size>
542 , stream_length(begin_ + (Size * sizeof(T)))
543 , stream_endianness(stream_endianness_)
550 template <
typename T,
size_t Size>
554 , stream_length(begin_ + (Size * sizeof(T)))
555 , stream_endianness(stream_endianness_)
562 template <
typename T>
563 typename etl::enable_if< etl::is_integral<T>::value || etl::is_floating_point<T>::value, T>
::type read_unchecked()
565 return from_bytes<T>();
571 template <
typename T>
588 template <
typename T>
593 const char* pend = pcurrent + (n *
sizeof(T));
595 result =
etl::span<const T>(
reinterpret_cast<const T*
>(pcurrent),
reinterpret_cast<const T*
>(pend));
604 template <
typename T>
621 template <
typename T>
625 typename etl::span<T>::iterator destination = range.
begin();
627 while (destination != range.
end())
629 *destination++ = from_bytes<T>();
638 template <
typename T>
654 template <
typename T>
658 T* destination = start;
660 for (
size_t i = 0; i < length; ++i)
662 *destination++ = from_bytes<T>();
671 template <
typename T>
689 template <
typename T>
694 pcurrent += (n *
sizeof(T));
708 pcurrent = pdata + n;
722 const_iterator
end()
const
780 return stream_length;
786 template <
typename T>
789 size_t used =
static_cast<size_t>(etl::distance(pdata, pcurrent));
791 return (stream_length - used) /
sizeof(T);
807 return stream_endianness;
815 template <
typename T>
816 typename etl::enable_if<
sizeof(T) == 1U, T>
::type from_bytes()
818 return static_cast<T
>(*pcurrent++);
822 template <
typename T>
823 typename etl::enable_if<
sizeof(T) != 1U, T>
::type from_bytes()
827 char* pv =
reinterpret_cast<char*
>(&value);
828 copy_value(pcurrent, pv,
sizeof(T));
829 pcurrent +=
sizeof(T);
835 void copy_value(
const char* source,
char* destination,
size_t length)
const
837 const etl::endian platform_endianness = etl::endianness::value();
839 if (stream_endianness == platform_endianness)
841 etl::copy(source, source + length, destination);
845 etl::reverse_copy(source, source + length, destination);
849 const char*
const pdata;
850 const char* pcurrent;
851 const size_t stream_length;
852 const etl::endian stream_endianness;
860 template <
typename T>
869 template <
typename T>
872 return stream.
write(value);
880 template <
typename T>
889 template <
typename T>
892 return stream.
read<T>();
Definition byte_stream.h:485
const_iterator cbegin() const
Returns start of the stream.
Definition byte_stream.h:730
byte_stream_reader(etl::span< const char > span_, etl::endian stream_endianness_)
Construct from span.
Definition byte_stream.h:505
bool empty() const
Returns true if the byte stream is empty.
Definition byte_stream.h:770
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:605
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:589
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:673
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:623
byte_stream_reader(const T(&begin_)[Size], etl::endian stream_endianness_)
Construct from const array.
Definition byte_stream.h:551
const_iterator begin() const
Returns start of the stream.
Definition byte_stream.h:714
const_iterator cend() const
Returns end of the stream.
Definition byte_stream.h:738
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition byte_stream.h:746
size_t available_bytes() const
The number of bytes left in the stream.
Definition byte_stream.h:797
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:640
size_t available() const
The number of T left in the stream.
Definition byte_stream.h:787
byte_stream_reader(etl::span< char > span_, etl::endian stream_endianness_)
Construct from span.
Definition byte_stream.h:494
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition byte_stream.h:778
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:655
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:563
etl::span< const char > data() const
Returns a span of whole the stream.
Definition byte_stream.h:762
etl::span< const char > free_data() const
Returns a span of the free portion of the stream.
Definition byte_stream.h:754
bool skip(size_t n)
Definition byte_stream.h:690
void restart(size_t n=0U)
Sets the index back to the position in the stream. Default = 0.
Definition byte_stream.h:706
byte_stream_reader(const void *begin_, size_t length_, etl::endian stream_endianness_)
Construct from begin and length.
Definition byte_stream.h:527
byte_stream_reader(T(&begin_)[Size], etl::endian stream_endianness_)
Construct from array.
Definition byte_stream.h:539
etl::endian get_endianness() const
Gets the endianness of the stream.
Definition byte_stream.h:805
const_iterator end() const
Returns end of the stream.
Definition byte_stream.h:722
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:572
byte_stream_reader(const void *begin_, const void *end_, etl::endian stream_endianness_)
Construct from range.
Definition byte_stream.h:516
Encodes a byte stream.
Definition byte_stream.h:57
byte_stream_writer(etl::span< unsigned char > span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition byte_stream.h:80
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:209
const_iterator cbegin() const
Returns start of the stream.
Definition byte_stream.h:295
etl::span< char > data()
Returns a span of whole the stream.
Definition byte_stream.h:343
const_iterator end() const
Returns end of the stream.
Definition byte_stream.h:287
etl::span< char > free_data()
Returns a span of the free portion of the stream.
Definition byte_stream.h:327
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:104
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:193
iterator begin()
Returns start of the stream.
Definition byte_stream.h:263
byte_stream_writer(T(&begin_)[Size], etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from array.
Definition byte_stream.h:117
void restart(size_t n=0U)
Sets the index back to the position in the stream. Default = 0.
Definition byte_stream.h:255
byte_stream_writer(void *begin_, void *end_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from range.
Definition byte_stream.h:92
bool write(bool value)
Writes a boolean to the stream.
Definition byte_stream.h:137
void write_unchecked(bool value)
Writes a boolean to the stream.
Definition byte_stream.h:129
etl::endian get_endianness() const
Gets the endianness of the stream.
Definition byte_stream.h:424
void set_callback(callback_type callback_)
Sets the function to call after every write.
Definition byte_stream.h:408
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:153
etl::span< char > used_data()
Returns a span of the used portion of the stream.
Definition byte_stream.h:311
iterator end()
Returns end of the stream.
Definition byte_stream.h:279
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:222
bool empty() const
Returns true if the byte stream is empty.
Definition byte_stream.h:367
byte_stream_writer(etl::span< char > span_, etl::endian stream_endianness_, callback_type callback_=callback_type())
Construct from span.
Definition byte_stream.h:68
const_iterator cend() const
Returns end of the stream.
Definition byte_stream.h:303
bool skip(size_t n)
Definition byte_stream.h:240
size_t available_bytes() const
The number of bytes left in the stream.
Definition byte_stream.h:400
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:162
size_t available() const
The number of T left in the stream.
Definition byte_stream.h:392
etl::span< const char > data() const
Returns a span of whole the stream.
Definition byte_stream.h:351
etl::span< const char > used_data() const
Returns a span of the used portion of the stream.
Definition byte_stream.h:319
callback_type get_callback() const
Gets the function to call after every write.
Definition byte_stream.h:416
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:178
size_t capacity() const
Returns the maximum number of bytes in the stream.
Definition byte_stream.h:383
etl::span< const char > free_data() const
Returns a span of the free portion of the stream.
Definition byte_stream.h:335
const_iterator begin() const
Returns start of the stream.
Definition byte_stream.h:271
size_t size_bytes() const
Returns the number of bytes used in the stream.
Definition byte_stream.h:375
bool full() const
Returns true if the byte stream index has reached the end.
Definition byte_stream.h:359
Declaration.
Definition delegate_cpp03.h:191
Definition optional.h:1273
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
bitset_ext
Definition absolute.h:40
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
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