Embedded Template Library 1.0
Loading...
Searching...
No Matches
byte_stream.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2021 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_BYTE_STREAM_INCLUDED
32#define ETL_BYTE_STREAM_INCLUDED
33
34#include "platform.h"
35#include "algorithm.h"
36#include "delegate.h"
37#include "endianness.h"
38#include "error_handler.h"
39#include "exception.h"
40#include "integral_limits.h"
41#include "iterator.h"
42#include "memory.h"
43#include "nullptr.h"
44#include "optional.h"
45#include "span.h"
46#include "type_traits.h"
47
48#include <limits.h>
49#include <stdint.h>
50
51namespace etl
52{
53 //***************************************************************************
55 //***************************************************************************
57 {
58 public:
59
60 typedef char* iterator;
61 typedef const char* const_iterator;
62 typedef etl::span<char> callback_parameter_type;
63 typedef etl::delegate<void(callback_parameter_type)> callback_type;
64
65 //***************************************************************************
67 //***************************************************************************
68 byte_stream_writer(etl::span<char> span_, etl::endian stream_endianness_, callback_type callback_ = callback_type())
69 : pdata(span_.begin())
70 , pcurrent(span_.begin())
71 , stream_length(span_.size_bytes())
72 , stream_endianness(stream_endianness_)
73 , callback(callback_)
74 {
75 }
76
77 //***************************************************************************
79 //***************************************************************************
80 byte_stream_writer(etl::span<unsigned char> span_, etl::endian stream_endianness_, callback_type callback_ = callback_type())
81 : pdata(reinterpret_cast<char*>(span_.begin()))
82 , pcurrent(reinterpret_cast<char*>(span_.begin()))
83 , stream_length(span_.size_bytes())
84 , stream_endianness(stream_endianness_)
85 , callback(callback_)
86 {
87 }
88
89 //***************************************************************************
91 //***************************************************************************
92 byte_stream_writer(void* begin_, void* end_, etl::endian stream_endianness_, callback_type callback_ = callback_type())
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_)
97 , callback(callback_)
98 {
99 }
100
101 //***************************************************************************
103 //***************************************************************************
104 byte_stream_writer(void* begin_, size_t length_, etl::endian stream_endianness_, callback_type callback_ = callback_type())
105 : pdata(reinterpret_cast<char*>(begin_))
106 , pcurrent(reinterpret_cast<char*>(begin_))
107 , stream_length(length_)
108 , stream_endianness(stream_endianness_)
109 , callback(callback_)
110 {
111 }
112
113 //***************************************************************************
115 //***************************************************************************
116 template <typename T, size_t Size>
117 byte_stream_writer(T (&begin_)[Size], etl::endian stream_endianness_, callback_type callback_ = callback_type())
118 : pdata(begin_)
119 , pcurrent(begin_)
120 , stream_length(begin_ + (Size * sizeof(T)))
121 , stream_endianness(stream_endianness_)
122 , callback(callback_)
123 {
124 }
125
126 //***************************************************************************
128 //***************************************************************************
129 void write_unchecked(bool value)
130 {
131 *pcurrent++ = value ? 1 : 0;
132 }
133
134 //***************************************************************************
136 //***************************************************************************
137 bool write(bool value)
138 {
139 bool success = (available<bool>() > 0U);
140
141 if (success)
142 {
143 write_unchecked(value);
144 }
145
146 return success;
147 }
148
149 //***************************************************************************
151 //***************************************************************************
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)
154 {
155 to_bytes<T>(value);
156 }
157
158 //***************************************************************************
160 //***************************************************************************
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)
163 {
164 bool success = (available<T>() > 0U);
165
166 if (success)
167 {
168 write_unchecked(value);
169 }
170
171 return success;
172 }
173
174 //***************************************************************************
176 //***************************************************************************
177 template <typename T>
178 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value, void>::type write_unchecked(const etl::span<T>& range)
179 {
180 typename etl::span<T>::iterator itr = range.begin();
181
182 while (itr != range.end())
183 {
184 to_bytes(*itr);
185 ++itr;
186 }
187 }
188
189 //***************************************************************************
191 //***************************************************************************
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)
194 {
195 bool success = (available<T>() >= range.size());
196
197 if (success)
198 {
199 write_unchecked(range);
200 }
201
202 return success;
203 }
204
205 //***************************************************************************
207 //***************************************************************************
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)
210 {
211 while (length-- != 0U)
212 {
213 to_bytes(*start);
214 ++start;
215 }
216 }
217
218 //***************************************************************************
220 //***************************************************************************
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)
223 {
224 bool success = (available<T>() >= length);
225
226 if (success)
227 {
228 write_unchecked(start, length);
229 }
230
231 return success;
232 }
233
234 //***************************************************************************
238 //***************************************************************************
239 template <typename T>
240 bool skip(size_t n)
241 {
242 bool success = (available<T>() >= n);
243
244 if (success)
245 {
246 step(n * sizeof(T));
247 }
248
249 return success;
250 }
251
252 //***************************************************************************
254 //***************************************************************************
255 void restart(size_t n = 0U)
256 {
257 pcurrent = pdata + n;
258 }
259
260 //***************************************************************************
262 //***************************************************************************
263 iterator begin()
264 {
265 return pdata;
266 }
267
268 //***************************************************************************
270 //***************************************************************************
271 const_iterator begin() const
272 {
273 return pdata;
274 }
275
276 //***************************************************************************
278 //***************************************************************************
279 iterator end()
280 {
281 return pcurrent;
282 }
283
284 //***************************************************************************
286 //***************************************************************************
287 const_iterator end() const
288 {
289 return pcurrent;
290 }
291
292 //***************************************************************************
294 //***************************************************************************
295 const_iterator cbegin() const
296 {
297 return pdata;
298 }
299
300 //***************************************************************************
302 //***************************************************************************
303 const_iterator cend() const
304 {
305 return pcurrent;
306 }
307
308 //***************************************************************************
310 //***************************************************************************
312 {
313 return etl::span<char>(pdata, pcurrent);
314 }
315
316 //***************************************************************************
318 //***************************************************************************
320 {
321 return etl::span<const char>(pdata, pcurrent);
322 }
323
324 //***************************************************************************
326 //***************************************************************************
328 {
329 return etl::span<char>(pcurrent, pdata + stream_length);
330 }
331
332 //***************************************************************************
334 //***************************************************************************
336 {
337 return etl::span<const char>(pcurrent, pdata + stream_length);
338 }
339
340 //***************************************************************************
342 //***************************************************************************
344 {
345 return etl::span<char>(pdata, pdata + stream_length);
346 }
347
348 //***************************************************************************
350 //***************************************************************************
352 {
353 return etl::span<const char>(pdata, pdata + stream_length);
354 }
355
356 //***************************************************************************
358 //***************************************************************************
359 bool full() const
360 {
361 return size_bytes() == capacity();
362 }
363
364 //***************************************************************************
366 //***************************************************************************
367 bool empty() const
368 {
369 return size_bytes() == 0U;
370 }
371
372 //***************************************************************************
374 //***************************************************************************
375 size_t size_bytes() const
376 {
377 return static_cast<size_t>(etl::distance(pdata, pcurrent));
378 }
379
380 //***************************************************************************
382 //***************************************************************************
383 size_t capacity() const
384 {
385 return stream_length;
386 }
387
388 //***************************************************************************
390 //***************************************************************************
391 template <typename T>
392 size_t available() const
393 {
394 return (capacity() - size_bytes()) / sizeof(T);
395 }
396
397 //***************************************************************************
399 //***************************************************************************
400 size_t available_bytes() const
401 {
402 return available<char>();
403 }
404
405 //***************************************************************************
407 //***************************************************************************
408 void set_callback(callback_type callback_)
409 {
410 callback = callback_;
411 }
412
413 //***************************************************************************
415 //***************************************************************************
416 callback_type get_callback() const
417 {
418 return callback;
419 }
420
421 //***************************************************************************
423 //***************************************************************************
425 {
426 return stream_endianness;
427 }
428
429 private:
430
431 //***************************************************************************
433 //***************************************************************************
434 template <typename T>
435 typename etl::enable_if<sizeof(T) == 1U, void>::type to_bytes(const T value)
436 {
437 *pcurrent = static_cast<char>(value);
438 step(1U);
439 }
440
441 //*********************************
442 template <typename T>
443 typename etl::enable_if<sizeof(T) != 1U, void>::type to_bytes(const T value)
444 {
445 const char* pv = reinterpret_cast<const char*>(&value);
446 copy_value(pv, pcurrent, sizeof(T));
447 step(sizeof(T));
448 }
449
450 //*********************************
451 void step(size_t n)
452 {
453 callback.call_if(etl::span<char>(pcurrent, pcurrent + n));
454
455 pcurrent += n;
456 }
457
458 //*********************************
459 void copy_value(const char* source, char* destination, size_t length) const
460 {
461 const etl::endian platform_endianness = etl::endianness::value();
462
463 if (stream_endianness == platform_endianness)
464 {
465 etl::copy(source, source + length, destination);
466 }
467 else
468 {
469 etl::reverse_copy(source, source + length, destination);
470 }
471 }
472
473 char* const pdata;
474 char* pcurrent;
475 const size_t stream_length;
476 const etl::endian stream_endianness;
477 callback_type callback;
478 };
479
480 //***************************************************************************
483 //***************************************************************************
485 {
486 public:
487
488 typedef char* iterator;
489 typedef const char* const_iterator;
490
491 //***************************************************************************
493 //***************************************************************************
495 : pdata(span_.begin())
496 , pcurrent(span_.begin())
497 , stream_length(span_.size_bytes())
498 , stream_endianness(stream_endianness_)
499 {
500 }
501
502 //***************************************************************************
504 //***************************************************************************
506 : pdata(span_.begin())
507 , pcurrent(span_.begin())
508 , stream_length(span_.size_bytes())
509 , stream_endianness(stream_endianness_)
510 {
511 }
512
513 //***************************************************************************
515 //***************************************************************************
516 byte_stream_reader(const void* begin_, const void* end_, etl::endian 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_)
521 {
522 }
523
524 //***************************************************************************
526 //***************************************************************************
527 byte_stream_reader(const void* begin_, size_t length_, etl::endian 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_)
532 {
533 }
534
535 //***************************************************************************
537 //***************************************************************************
538 template <typename T, size_t Size>
539 byte_stream_reader(T (&begin_)[Size], etl::endian stream_endianness_)
540 : pdata(begin_)
541 , pcurrent(begin_)
542 , stream_length(begin_ + (Size * sizeof(T)))
543 , stream_endianness(stream_endianness_)
544 {
545 }
546
547 //***************************************************************************
549 //***************************************************************************
550 template <typename T, size_t Size>
551 byte_stream_reader(const T (&begin_)[Size], etl::endian stream_endianness_)
552 : pdata(begin_)
553 , pcurrent(begin_)
554 , stream_length(begin_ + (Size * sizeof(T)))
555 , stream_endianness(stream_endianness_)
556 {
557 }
558
559 //***************************************************************************
561 //***************************************************************************
562 template <typename T>
563 typename etl::enable_if< etl::is_integral<T>::value || etl::is_floating_point<T>::value, T>::type read_unchecked()
564 {
565 return from_bytes<T>();
566 }
567
568 //***************************************************************************
570 //***************************************************************************
571 template <typename T>
572 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value, etl::optional<T> >::type read()
573 {
574 etl::optional<T> result;
575
576 // Do we have enough room?
577 if (available<T>() > 0U)
578 {
579 result = read_unchecked<T>();
580 }
581
582 return result;
583 }
584
585 //***************************************************************************
587 //***************************************************************************
588 template <typename T>
589 typename etl::enable_if<sizeof(T) == 1U, etl::span<const T> >::type read_unchecked(size_t n)
590 {
591 etl::span<const T> result;
592
593 const char* pend = pcurrent + (n * sizeof(T));
594
595 result = etl::span<const T>(reinterpret_cast<const T*>(pcurrent), reinterpret_cast<const T*>(pend));
596 pcurrent = pend;
597
598 return result;
599 }
600
601 //***************************************************************************
603 //***************************************************************************
604 template <typename T>
605 typename etl::enable_if<sizeof(T) == 1U, etl::optional<etl::span<const T> > >::type read(size_t n)
606 {
608
609 // Do we have enough room?
610 if (available<T>() >= n)
611 {
612 result = read_unchecked<T>(n);
613 }
614
615 return result;
616 }
617
618 //***************************************************************************
620 //***************************************************************************
621 template <typename T>
622 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value, etl::span<const T> >::type
624 {
625 typename etl::span<T>::iterator destination = range.begin();
626
627 while (destination != range.end())
628 {
629 *destination++ = from_bytes<T>();
630 }
631
632 return etl::span<const T>(range.begin(), range.end());
633 }
634
635 //***************************************************************************
637 //***************************************************************************
638 template <typename T>
639 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value, etl::optional<etl::span<const T> > >::type
641 {
642 // Do we have enough room?
643 if (available<T>() >= range.size())
644 {
646 }
647
649 }
650
651 //***************************************************************************
653 //***************************************************************************
654 template <typename T>
655 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value, etl::span<const T> >::type read_unchecked(T* start,
656 size_t length)
657 {
658 T* destination = start;
659
660 for (size_t i = 0; i < length; ++i)
661 {
662 *destination++ = from_bytes<T>();
663 }
664
665 return etl::span<const T>(start, length);
666 }
667
668 //***************************************************************************
670 //***************************************************************************
671 template <typename T>
672 typename etl::enable_if<etl::is_integral<T>::value || etl::is_floating_point<T>::value, etl::optional<etl::span<const T> > >::type
673 read(T* start, size_t length)
674 {
675 // Do we have enough room?
676 if (available<T>() >= length)
677 {
679 }
680
682 }
683
684 //***************************************************************************
688 //***************************************************************************
689 template <typename T>
690 bool skip(size_t n)
691 {
692 if (n <= available<T>())
693 {
694 pcurrent += (n * sizeof(T));
695 return true;
696 }
697 else
698 {
699 return false;
700 }
701 }
702
703 //***************************************************************************
705 //***************************************************************************
706 void restart(size_t n = 0U)
707 {
708 pcurrent = pdata + n;
709 }
710
711 //***************************************************************************
713 //***************************************************************************
714 const_iterator begin() const
715 {
716 return pdata;
717 }
718
719 //***************************************************************************
721 //***************************************************************************
722 const_iterator end() const
723 {
724 return pcurrent;
725 }
726
727 //***************************************************************************
729 //***************************************************************************
730 const_iterator cbegin() const
731 {
732 return pdata;
733 }
734
735 //***************************************************************************
737 //***************************************************************************
738 const_iterator cend() const
739 {
740 return pcurrent;
741 }
742
743 //***************************************************************************
745 //***************************************************************************
747 {
748 return etl::span<const char>(pdata, pcurrent);
749 }
750
751 //***************************************************************************
753 //***************************************************************************
755 {
756 return etl::span<const char>(pcurrent, pdata + stream_length);
757 }
758
759 //***************************************************************************
761 //***************************************************************************
763 {
764 return etl::span<const char>(pdata, pdata + stream_length);
765 }
766
767 //***************************************************************************
769 //***************************************************************************
770 bool empty() const
771 {
772 return available<char>() == 0U;
773 }
774
775 //***************************************************************************
777 //***************************************************************************
778 size_t size_bytes() const
779 {
780 return stream_length;
781 }
782
783 //***************************************************************************
785 //***************************************************************************
786 template <typename T>
787 size_t available() const
788 {
789 size_t used = static_cast<size_t>(etl::distance(pdata, pcurrent));
790
791 return (stream_length - used) / sizeof(T);
792 }
793
794 //***************************************************************************
796 //***************************************************************************
797 size_t available_bytes() const
798 {
799 return available<char>();
800 }
801
802 //***************************************************************************
804 //***************************************************************************
806 {
807 return stream_endianness;
808 }
809
810 private:
811
812 //***************************************************************************
814 //***************************************************************************
815 template <typename T>
816 typename etl::enable_if<sizeof(T) == 1U, T>::type from_bytes()
817 {
818 return static_cast<T>(*pcurrent++);
819 }
820
821 //*********************************
822 template <typename T>
823 typename etl::enable_if<sizeof(T) != 1U, T>::type from_bytes()
824 {
825 T value;
826
827 char* pv = reinterpret_cast<char*>(&value);
828 copy_value(pcurrent, pv, sizeof(T));
829 pcurrent += sizeof(T);
830
831 return value;
832 }
833
834 //*********************************
835 void copy_value(const char* source, char* destination, size_t length) const
836 {
837 const etl::endian platform_endianness = etl::endianness::value();
838
839 if (stream_endianness == platform_endianness)
840 {
841 etl::copy(source, source + length, destination);
842 }
843 else
844 {
845 etl::reverse_copy(source, source + length, destination);
846 }
847 }
848
849 const char* const pdata;
850 const char* pcurrent;
851 const size_t stream_length;
852 const etl::endian stream_endianness;
853 };
854
855 //***************************************************************************
859 //***************************************************************************
860 template <typename T>
861 void write_unchecked(etl::byte_stream_writer& stream, const T& value)
862 {
863 stream.write_unchecked(value);
864 }
865
866 //***************************************************************************
868 //***************************************************************************
869 template <typename T>
870 bool write(etl::byte_stream_writer& stream, const T& value)
871 {
872 return stream.write(value);
873 }
874
875 //***************************************************************************
879 //***************************************************************************
880 template <typename T>
882 {
883 return stream.read_unchecked<T>();
884 }
885
886 //***************************************************************************
888 //***************************************************************************
889 template <typename T>
891 {
892 return stream.read<T>();
893 }
894} // namespace etl
895
896#endif
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