Embedded Template Library 1.0
Loading...
Searching...
No Matches
span.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) 2020 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_SPAN_INCLUDED
32#define ETL_SPAN_INCLUDED
33
34#include "platform.h"
35
36#include "error_handler.h"
37#include "exception.h"
38#include "alignment.h"
39#include "iterator.h"
40#include "algorithm.h"
41#include "circular_iterator.h"
42#include "nullptr.h"
43#include "hash.h"
44#include "type_traits.h"
45#include "integral_limits.h"
46#include "memory.h"
47#include "array.h"
48#include "byte.h"
49#include "static_assert.h"
50
52
55
56namespace etl
57{
58 //***************************************************************************
59 // Tag to indicate a class is a span.
60 //***************************************************************************
61 class span_tag {};
62
63 //***************************************************************************
66 //***************************************************************************
68 {
69 public:
70
71 span_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
73 {
74 }
75 };
76
77 //***************************************************************************
80 //***************************************************************************
82 {
83 public:
84
85 span_alignment_exception(string_type file_name_, numeric_type line_number_)
86 : span_exception(ETL_ERROR_TEXT("span:alignment", ETL_SPAN_FILE_ID"A"), file_name_, line_number_)
87 {
88 }
89 };
90
91 //***************************************************************************
94 //***************************************************************************
96 {
97 public:
98
99 span_size_mismatch(string_type file_name_, numeric_type line_number_)
100 : span_exception(ETL_ERROR_TEXT("span:size", ETL_SPAN_FILE_ID"B"), file_name_, line_number_)
101 {
102 }
103 };
104
105 //***************************************************************************
107 //***************************************************************************
108 template <typename T, size_t Extent = etl::dynamic_extent>
109 class span : public span_tag
110 {
111 public:
112
113 typedef T element_type;
114 typedef typename etl::remove_cv<T>::type value_type;
115 typedef size_t size_type;
116 typedef T& reference;
117 typedef const T& const_reference;
118 typedef T* pointer;
119 typedef const T* const_pointer;
120
121 typedef T* iterator;
122 typedef const T* const_iterator;
123 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
124 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
125
126 typedef etl::circular_iterator<pointer> circular_iterator;
127 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
128
129 static ETL_CONSTANT size_t extent = Extent;
130
131 //*************************************************************************
133 //*************************************************************************
134 template <typename TIterator, typename TSize>
135 ETL_CONSTEXPR explicit span(const TIterator begin_, const TSize /*size_*/) ETL_NOEXCEPT
136 : pbegin(etl::to_address(begin_))
137 {
138 }
139
140 //*************************************************************************
142 //*************************************************************************
143 template <typename TIterator>
144 ETL_CONSTEXPR explicit span(const TIterator begin_, const TIterator /*end_*/)
145 : pbegin(etl::to_address(begin_))
146 {
147 }
148
149 //*************************************************************************
151 //*************************************************************************
152#if ETL_USING_CPP11
153 template<size_t Array_Size, typename = typename etl::enable_if<(Array_Size == Extent), void>::type>
154 ETL_CONSTEXPR span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
155 : pbegin(begin_)
156 {
157 }
158#else
159 //*************************************************************************
161 //*************************************************************************
162 template<size_t Array_Size>
163 ETL_CONSTEXPR span(element_type(&begin_)[Array_Size], typename etl::enable_if<(Array_Size == Extent), void>::type* = 0) ETL_NOEXCEPT
164 : pbegin(begin_)
165 {
166 }
167#endif
168
169#if ETL_USING_CPP11
170 //*************************************************************************
173 //*************************************************************************
174 template <typename TContainer, typename = typename etl::enable_if<!etl::is_base_of<span_tag, etl::remove_reference_t<TContainer>>::value &&
175 !etl::is_pointer<etl::remove_reference_t<TContainer>>::value &&
176 !etl::is_array<etl::remove_reference_t<TContainer>>::value&&
177 etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<typename etl::remove_reference_t<TContainer>::value_type>>::value, void>::type>
178 ETL_CONSTEXPR span(TContainer&& a) ETL_NOEXCEPT
179 : pbegin(a.data())
180 {
181 }
182#else
183 //*************************************************************************
186 //*************************************************************************
187 template <typename TContainer>
188 span(TContainer& a, typename etl::enable_if<!etl::is_base_of<span_tag, typename etl::remove_reference<TContainer>::type>::value &&
189 !etl::is_pointer<typename etl::remove_reference<TContainer>::type>::value &&
191 etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::remove_reference<TContainer>::type::value_type>::type>::value, void>::type* = 0) ETL_NOEXCEPT
192 : pbegin(a.data())
193 {
194 }
195
196 //*************************************************************************
199 //*************************************************************************
200 template <typename TContainer>
201 span(const TContainer& a, typename etl::enable_if<!etl::is_base_of<span_tag, typename etl::remove_reference<TContainer>::type>::value &&
202 !etl::is_pointer<typename etl::remove_reference<TContainer>::type>::value &&
204 etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::remove_reference<TContainer>::type::value_type>::type>::value, void>::type* = 0) ETL_NOEXCEPT
205 : pbegin(a.data())
206 {
207 }
208#endif
209
210 //*************************************************************************
212 //*************************************************************************
213 ETL_CONSTEXPR span(const span& other) ETL_NOEXCEPT
214 : pbegin(other.pbegin)
215 {
216 }
217
218 //*************************************************************************
221 //*************************************************************************
222 template <typename U, size_t N>
223 ETL_CONSTEXPR span(const etl::span<U, N>& other, typename etl::enable_if<N == Extent, void>::type* = 0) ETL_NOEXCEPT
224 : pbegin(other.data())
225 {
226 }
227
228 //*************************************************************************
231 //*************************************************************************
232 template <typename U, size_t N>
234 : pbegin(other.data())
235 {
236 ETL_ASSERT(other.size() == Extent, ETL_ERROR(span_size_mismatch));
237 }
238
239 //*************************************************************************
241 //*************************************************************************
242 ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
243 {
244 return *pbegin;
245 }
246
247 //*************************************************************************
249 //*************************************************************************
250 ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
251 {
252 return *((pbegin + Extent) - 1);
253 }
254
255 //*************************************************************************
257 //*************************************************************************
258 ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
259 {
260 return pbegin;
261 }
262
263 //*************************************************************************
265 //*************************************************************************
266 ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
267 {
268 return pbegin;
269 }
270
271 //*************************************************************************
273 //*************************************************************************
274 ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
275 {
276 return pbegin;
277 }
278
279 //*************************************************************************
281 //*************************************************************************
282 ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
283 {
284 return circular_iterator(begin(), end());
285 }
286
287 //*************************************************************************
289 //*************************************************************************
290 ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
291 {
292 return (pbegin + Extent);
293 }
294
295 //*************************************************************************
297 //*************************************************************************
298 ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
299 {
300 return (pbegin + Extent);
301 }
302
303 //*************************************************************************
304 // Returns a const reverse iterator to the reverse beginning of the span.
305 //*************************************************************************
306 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
307 {
308 return const_reverse_iterator((pbegin + Extent));
309 }
310
311 //*************************************************************************
312 // Returns an reverse iterator to the reverse beginning of the span.
313 //*************************************************************************
314 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rbegin() const ETL_NOEXCEPT
315 {
316 return reverse_iterator((pbegin + Extent));
317 }
318
319 //*************************************************************************
321 //*************************************************************************
322 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
323 {
324 return reverse_circular_iterator(rbegin(), rend());
325 }
326
327 //*************************************************************************
329 //*************************************************************************
330 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
331 {
332 return const_reverse_iterator(pbegin);
333 }
334
335 //*************************************************************************
337 //*************************************************************************
338 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
339 {
340 return reverse_iterator(pbegin);
341 }
342
343 //*************************************************************************
345 //*************************************************************************
346 ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
347 {
348 return Extent == 0;
349 }
350
351 //*************************************************************************
353 //*************************************************************************
354 ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
355 {
356 return Extent;
357 }
358
359 //*************************************************************************
361 //*************************************************************************
362 ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
363 {
364 return sizeof(element_type) * Extent;
365 }
366
367 //*************************************************************************
369 //*************************************************************************
370 ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
371 {
372 return size();
373 }
374
375 //*************************************************************************
377 //*************************************************************************
378 ETL_CONSTEXPR14 span& operator =(const span& other) ETL_NOEXCEPT
379 {
380 pbegin = other.pbegin;
381 return *this;
382 }
383
384 //*************************************************************************
386 //*************************************************************************
387 ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
388 {
389 ETL_ASSERT(i < size(), ETL_ERROR(array_out_of_range));
390
391 return pbegin[i];
392 }
393
394 //*************************************************************************
396 //*************************************************************************
397 ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
398 {
399 ETL_ASSERT(i < size(), ETL_ERROR(array_out_of_range));
400
401 return pbegin[i];
402 }
403
404 //*************************************************************************
406 //*************************************************************************
407 ETL_CONSTEXPR reference operator[](const size_t i) const
408 {
409 return pbegin[i];
410 }
411
412 //*************************************************************************
414 //*************************************************************************
415 template <size_t COUNT>
416 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> first() const ETL_NOEXCEPT
417 {
418 // If Extent is static, check that original span contains at least COUNT elements
419 ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? COUNT <= Extent : true, "Original span does not contain COUNT elements");
420
421 return etl::span<element_type, COUNT>(pbegin, pbegin + COUNT);
422 }
423
424 //*************************************************************************
426 //*************************************************************************
427 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> first(size_t count) const ETL_NOEXCEPT
428 {
429 return etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count);
430 }
431
432 //*************************************************************************
434 //*************************************************************************
435 template <size_t COUNT>
436 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> last() const ETL_NOEXCEPT
437 {
438 // If Extent is static, check that original span contains at least COUNT elements
439 ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? COUNT <= Extent : true, "Original span does not contain COUNT elements");
440
441 return etl::span<element_type, COUNT>(pbegin + Extent - COUNT, (pbegin + Extent));
442 }
443
444 //*************************************************************************
446 //*************************************************************************
447 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> last(size_t count) const ETL_NOEXCEPT
448 {
449 return etl::span<element_type, etl::dynamic_extent>((pbegin + Extent) - count, (pbegin + Extent));
450 }
451
452#if ETL_USING_CPP11
453 //*************************************************************************
455 //*************************************************************************
456 template <size_t OFFSET, size_t COUNT = etl::dynamic_extent>
457 ETL_NODISCARD ETL_CONSTEXPR
458 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET> subspan() const ETL_NOEXCEPT
459 {
460 // If Extent is static, check that OFFSET is within the original span
461 ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? OFFSET <= Extent : true, "OFFSET is not within the original span");
462
463 // If count is also static, check that OFFSET + COUNT is within the original span
464 ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) : true, "OFFSET + COUNT is not within the original span");
465
466 return (COUNT == etl::dynamic_extent) ? etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, (pbegin + Extent))
467 : etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
468 }
469#else
470 //*************************************************************************
472 //*************************************************************************
473 template <size_t OFFSET, size_t COUNT>
474 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET> subspan() const
475 {
476 // If Extent is static, check that OFFSET is within the original span
477 ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? OFFSET <= Extent : true, "OFFSET is not within the original span");
478
479 // If count is also static, check that OFFSET + COUNT is within the original span
480 ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) : true, "OFFSET + COUNT is not within the original span");
481
482 if (COUNT == etl::dynamic_extent)
483 {
484 return etl::span<element_type, (COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET)>(pbegin + OFFSET, (pbegin + Extent));
485 }
486 else
487 {
488 return etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
489 }
490 }
491#endif
492
493 //*************************************************************************
495 //*************************************************************************
496 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> subspan(size_t offset, size_t count = etl::dynamic_extent) const ETL_NOEXCEPT
497 {
498 return (count == etl::dynamic_extent) ? etl::span<element_type, etl::dynamic_extent>(pbegin + offset, (pbegin + Extent))
499 : etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pbegin + offset + count);
500 }
501
502 //*************************************************************************
505 //*************************************************************************
506 void advance(size_t elements) ETL_NOEXCEPT
507 {
508 elements = etl::min(elements, size());
509 pbegin += elements;
510 }
511
512 //*************************************************************************
514 //*************************************************************************
515 template<typename TNew>
516 ETL_NODISCARD ETL_CONSTEXPR14 etl::span<TNew, etl::dynamic_extent> reinterpret_as() const
517 {
519
520 return etl::span<TNew, etl::dynamic_extent>(reinterpret_cast<TNew*>(pbegin),
521 Extent * sizeof(element_type) / sizeof(TNew));
522 }
523
524 private:
525
526 pointer pbegin;
527 };
528
529 //*************************************************************************
532 //*************************************************************************
533 template <typename T, size_t Extent>
534 ETL_CONSTEXPR span<T, Extent> make_span(T (&data)[Extent])
535 {
536 return span<T, Extent>(data);
537 }
538
539 //***************************************************************************
541 //***************************************************************************
542 template <typename T>
543 class span<T, etl::dynamic_extent> : public span_tag
544 {
545 public:
546
547 typedef T element_type;
548 typedef typename etl::remove_cv<T>::type value_type;
549 typedef size_t size_type;
550 typedef T& reference;
551 typedef const T& const_reference;
552 typedef T* pointer;
553 typedef const T* const_pointer;
554
555 typedef T* iterator;
556 typedef const T* const_iterator;
557 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
558 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
559
560 typedef etl::circular_iterator<pointer> circular_iterator;
561 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
562
563 static ETL_CONSTANT size_t extent = etl::dynamic_extent;
564
565 //*************************************************************************
567 //*************************************************************************
568 ETL_CONSTEXPR span() ETL_NOEXCEPT
569 : pbegin(ETL_NULLPTR)
570 , pend(ETL_NULLPTR)
571 {
572 }
573
574 //*************************************************************************
576 //*************************************************************************
577 template <typename TIterator, typename TSize>
578 ETL_CONSTEXPR span(const TIterator begin_, const TSize size_) ETL_NOEXCEPT
579 : pbegin(etl::to_address(begin_))
580 , pend(etl::to_address(begin_) + size_)
581 {
582 }
583
584 //*************************************************************************
586 //*************************************************************************
587 template <typename TIterator>
588 ETL_CONSTEXPR span(const TIterator begin_, const TIterator end_)
589 : pbegin(etl::to_address(begin_))
590 , pend(etl::to_address(begin_) + etl::distance(begin_, end_))
591 {
592 }
593
594 //*************************************************************************
596 //*************************************************************************
597 template<size_t Array_Size>
598 ETL_CONSTEXPR span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
599 : pbegin(begin_)
600 , pend(begin_ + Array_Size)
601 {
602 }
603
604#if ETL_USING_CPP11
605 //*************************************************************************
608 //*************************************************************************
609 template <typename TContainer, typename = typename etl::enable_if<!etl::is_base_of<span_tag, etl::remove_reference_t<TContainer>>::value &&
610 !etl::is_pointer<etl::remove_reference_t<TContainer>>::value &&
611 !etl::is_array<etl::remove_reference_t<TContainer>>::value &&
612 etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<typename etl::remove_reference_t<TContainer>::value_type>>::value, void>::type>
613 ETL_CONSTEXPR span(TContainer&& a) ETL_NOEXCEPT
614 : pbegin(a.data())
615 , pend(a.data() + a.size())
616 {
617 }
618#else
619 //*************************************************************************
622 //*************************************************************************
623 template <typename TContainer>
624 ETL_CONSTEXPR span(TContainer& a, typename etl::enable_if<!etl::is_base_of<span_tag, typename etl::remove_reference<TContainer>::type>::value &&
625 !etl::is_pointer<typename etl::remove_reference<TContainer>::type>::value &&
627 etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::remove_reference<TContainer>::type::value_type>::type>::value, void>::type* = 0) ETL_NOEXCEPT
628 : pbegin(a.data())
629 , pend(a.data() + a.size())
630 {
631 }
632
633 //*************************************************************************
636 //*************************************************************************
637 template <typename TContainer>
638 ETL_CONSTEXPR span(const TContainer& a, typename etl::enable_if<!etl::is_base_of<span_tag, typename etl::remove_reference<TContainer>::type>::value &&
639 !etl::is_pointer<typename etl::remove_reference<TContainer>::type>::value &&
641 etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::remove_reference<TContainer>::type::value_type>::type>::value, void>::type* = 0) ETL_NOEXCEPT
642 : pbegin(a.data())
643 , pend(a.data() + a.size())
644 {
645 }
646#endif
647
648 //*************************************************************************
650 //*************************************************************************
651 ETL_CONSTEXPR span(const span& other) ETL_NOEXCEPT
652 : pbegin(other.pbegin)
653 , pend(other.pend)
654 {
655 }
656
657 //*************************************************************************
659 //*************************************************************************
660 template <typename U, size_t N>
661 ETL_CONSTEXPR span(const etl::span<U, N>& other) ETL_NOEXCEPT
662 : pbegin(other.data())
663 , pend(other.data() + other.size())
664 {
665 }
666
667 //*************************************************************************
669 //*************************************************************************
670 ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
671 {
672 return *pbegin;
673 }
674
675 //*************************************************************************
677 //*************************************************************************
678 ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
679 {
680 return *(pend - 1);
681 }
682
683 //*************************************************************************
685 //*************************************************************************
686 ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
687 {
688 return pbegin;
689 }
690
691 //*************************************************************************
693 //*************************************************************************
694 ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
695 {
696 return pbegin;
697 }
698
699 //*************************************************************************
701 //*************************************************************************
702 ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
703 {
704 return pbegin;
705 }
706
707 //*************************************************************************
709 //*************************************************************************
710 ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
711 {
712 return circular_iterator(begin(), end());
713 }
714
715 //*************************************************************************
717 //*************************************************************************
718 ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
719 {
720 return pend;
721 }
722
723 //*************************************************************************
725 //*************************************************************************
726 ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
727 {
728 return pend;
729 }
730
731 //*************************************************************************
732 // Returns an reverse iterator to the reverse beginning of the span.
733 //*************************************************************************
734 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rbegin() const ETL_NOEXCEPT
735 {
736 return reverse_iterator(pend);
737 }
738
739 //*************************************************************************
740 // Returns a const reverse iterator to the reverse beginning of the span.
741 //*************************************************************************
742 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
743 {
744 return const_reverse_iterator(pend);
745 }
746
747 //*************************************************************************
749 //*************************************************************************
750 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
751 {
752 return reverse_circular_iterator(rbegin(), rend());
753 }
754
755 //*************************************************************************
757 //*************************************************************************
758 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
759 {
760 return const_reverse_iterator(pbegin);
761 }
762
763 //*************************************************************************
765 //*************************************************************************
766 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
767 {
768 return reverse_iterator(pbegin);
769 }
770
771 //*************************************************************************
773 //*************************************************************************
774 ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
775 {
776 return (pbegin == pend);
777 }
778
779 //*************************************************************************
781 //*************************************************************************
782 ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
783 {
784 return (pend - pbegin);
785 }
786
787 //*************************************************************************
789 //*************************************************************************
790 ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
791 {
792 return sizeof(element_type) * (pend - pbegin);
793 }
794
795 //*************************************************************************
797 //*************************************************************************
798 ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
799 {
800 return size();
801 }
802
803 //*************************************************************************
805 //*************************************************************************
806 ETL_CONSTEXPR14 span& operator =(const span& other) ETL_NOEXCEPT
807 {
808 pbegin = other.pbegin;
809 pend = other.pend;
810 return *this;
811 }
812
813 //*************************************************************************
815 //*************************************************************************
816 ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
817 {
818 ETL_ASSERT(i < size(), ETL_ERROR(array_out_of_range));
819
820 return pbegin[i];
821 }
822
823 //*************************************************************************
825 //*************************************************************************
826 ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
827 {
828 ETL_ASSERT(i < size(), ETL_ERROR(array_out_of_range));
829
830 return pbegin[i];
831 }
832
833 //*************************************************************************
835 //*************************************************************************
836 ETL_CONSTEXPR reference operator[](const size_t i) const
837 {
838 return pbegin[i];
839 }
840
841 //*************************************************************************
843 //*************************************************************************
844 template <size_t COUNT>
845 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> first() const ETL_NOEXCEPT
846 {
847 return etl::span<element_type, COUNT>(pbegin, pbegin + COUNT);
848 }
849
850 //*************************************************************************
852 //*************************************************************************
853 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> first(size_t count) const ETL_NOEXCEPT
854 {
855 return etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count);
856 }
857
858 //*************************************************************************
860 //*************************************************************************
861 template <size_t COUNT>
862 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> last() const ETL_NOEXCEPT
863 {
864 return etl::span<element_type, COUNT>(pend - COUNT, pend);
865 }
866
867 //*************************************************************************
869 //*************************************************************************
870 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> last(size_t count) const ETL_NOEXCEPT
871 {
872 return etl::span<element_type, etl::dynamic_extent>(pend - count, pend);
873 }
874
875#if ETL_USING_CPP11
876 //*************************************************************************
878 //*************************************************************************
879 template <size_t OFFSET, size_t COUNT = etl::dynamic_extent>
880 ETL_NODISCARD ETL_CONSTEXPR
882 {
884 : etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
885 }
886#else
887 //*************************************************************************
889 //*************************************************************************
890 template <size_t OFFSET, size_t COUNT>
902#endif
903
904 //*************************************************************************
906 //*************************************************************************
907 ETL_NODISCARD ETL_CONSTEXPR14 etl::span<element_type, etl::dynamic_extent> subspan(size_t offset, size_t count = etl::dynamic_extent) const ETL_NOEXCEPT
908 {
909 return (count == etl::dynamic_extent) ? etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pend)
910 : etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pbegin + offset + count);
911 }
912
913 //*************************************************************************
916 //*************************************************************************
917 void advance(size_t elements) ETL_NOEXCEPT
918 {
919 elements = etl::min(elements, size());
920 pbegin += elements;
921 }
922
923 //*************************************************************************
925 //*************************************************************************
926 template<typename TNew>
927 ETL_NODISCARD ETL_CONSTEXPR14 etl::span<TNew, etl::dynamic_extent> reinterpret_as() const
928 {
930
931 return etl::span<TNew, etl::dynamic_extent>(reinterpret_cast<TNew*>(pbegin),
932 (pend - pbegin) * sizeof(element_type) / sizeof(TNew));
933 }
934
935 //*************************************************************************
940 //*************************************************************************
941 template<typename TRet>
942 ETL_NODISCARD etl::span<TRet> take(size_t const n)
943 {
944 ETL_STATIC_ASSERT(sizeof(TRet) % sizeof(element_type) == 0, "sizeof(TRet) must be divisible by sizeof(T)");
945
947 ETL_ASSERT(sizeof(TRet) * n <= sizeof(element_type) * size(), ETL_ERROR(span_size_mismatch));
948
950 advance(sizeof(TRet) / sizeof(element_type) * n);
951
952 return result;
953 }
954
955 //*************************************************************************
959 //*************************************************************************
960 template<typename TRet>
961 ETL_NODISCARD TRet& take()
962 {
963 ETL_STATIC_ASSERT(sizeof(TRet) % sizeof(element_type) == 0, "sizeof(TRet) must be divisible by sizeof(T)");
964
966 ETL_ASSERT(sizeof(TRet) <= sizeof(element_type) * size(), ETL_ERROR(span_size_mismatch));
967
968 TRet& result = *reinterpret_cast<TRet*>(data());
969 advance(sizeof(TRet) / sizeof(element_type));
970
971 return result;
972 }
973
974 private:
975
976 pointer pbegin;
977 pointer pend;
978 };
979
980 //*************************************************************************
983 //*************************************************************************
984 template <typename T>
989
990 //*************************************************************************
993 //*************************************************************************
994 template <typename T>
999
1000 template <typename T, size_t Extent>
1001 ETL_CONSTANT size_t span<T, Extent>::extent;
1002
1003 template <typename T>
1004 ETL_CONSTANT size_t span<T, etl::dynamic_extent>::extent;
1005
1006 //*************************************************************************
1008 //*************************************************************************
1009 template <typename T1, size_t N1, typename T2, size_t N2>
1010 ETL_NODISCARD
1011 ETL_CONSTEXPR
1012 typename etl::enable_if<etl::is_same<typename etl::remove_cv<T1>::type, typename etl::remove_cv<T2>::type>::value, bool>::type
1014 {
1015 return (lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size());
1016 }
1017
1018 //*************************************************************************
1020 //*************************************************************************
1021 template <typename T1, size_t N1, typename T2, size_t N2>
1022 ETL_NODISCARD
1023 ETL_CONSTEXPR
1024 bool operator !=(const etl::span<T1, N1>& lhs, const etl::span<T2, N2>& rhs) ETL_NOEXCEPT
1025 {
1026 return !(lhs == rhs);
1027 }
1028
1029 //*************************************************************************
1036 //*************************************************************************
1037 template <typename T1, size_t N1, typename T2, size_t N2>
1038 typename etl::enable_if<etl::is_same<typename etl::remove_cv<T1>::type, typename etl::remove_cv<T2>::type>::value, bool>::type
1040 {
1041 return (lhs.empty() && rhs.empty()) ||
1042 ((lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size())) ||
1043 etl::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
1044 }
1045
1046 //*************************************************************************
1055 //*************************************************************************
1056 template <typename T1, size_t N1, typename T2, size_t N2>
1057 typename etl::enable_if<etl::is_same<typename etl::remove_cv<T1>::type, typename etl::remove_cv<T2>::type>::value &&
1058 !etl::is_const<T2>::value, bool>::type
1060 {
1061 if (src.empty() || (src.begin() == dst.begin()))
1062 {
1063 return true;
1064 }
1065 if (src.size() > dst.size())
1066 {
1067 return false;
1068 }
1069 (void) etl::copy(src.begin(), src.end(), dst.begin());
1070 return true;
1071 }
1072
1073 //*************************************************************************
1075 //*************************************************************************
1076#if ETL_USING_CPP17
1077 template <typename TIterator>
1078 span(const TIterator begin_, const TIterator end_)
1079 ->span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1080
1081 template <typename TIterator, typename TSize>
1082 span(const TIterator begin_, const TSize size_)
1083 ->span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1084
1085 template <typename T, size_t N>
1086 span(T(&)[N])
1087 -> span<T, N>;
1088
1089 template <typename T, size_t N>
1090 span(etl::array<T, N>&)
1091 -> span<T, N>;
1092
1093 template <typename T, size_t N>
1094 span(const etl::array<T, N>&)
1096
1097#if ETL_USING_STL && ETL_USING_CPP11
1098 template <typename T, size_t N>
1099 span(std::array<T, N>&)
1100 ->span<T, N>;
1101
1102 template <typename T, size_t N>
1103 span(const std::array<T, N>&)
1104 ->span<const T, N>;
1105#endif
1106#endif
1107
1108 //*************************************************************************
1110 //*************************************************************************
1111#if ETL_USING_8BIT_TYPES
1112 template <typename T, size_t Extent>
1113 struct hash<etl::span<T, Extent> >
1114 {
1115 size_t operator()(const etl::span<T>& view) const
1116 {
1117 return etl::private_hash::generic_hash<size_t>(reinterpret_cast<const uint8_t*>(view.data()),
1118 reinterpret_cast<const uint8_t*>(view.data() + view.size()));
1119 }
1120 };
1121#endif
1122
1123 //*************************************************************************
1125 //*************************************************************************
1126 template <class T, size_t N>
1127 span<const byte, (N == etl::dynamic_extent) ? (etl::dynamic_extent) : (N * sizeof(T))>
1128 as_bytes(span<T, N> s) ETL_NOEXCEPT
1129 {
1130 return span<const byte, (N == etl::dynamic_extent) ? (etl::dynamic_extent) : (N * sizeof(T))>(reinterpret_cast<byte*>(s.data()), s.size_bytes());
1131 }
1132
1133 //*************************************************************************
1135 //*************************************************************************
1136 template <class T, size_t N>
1137 span<byte, (N == etl::dynamic_extent) ? (etl::dynamic_extent) : (N * sizeof(T))>
1139 {
1140 ETL_STATIC_ASSERT(!etl::is_const<T>::value, "span<T> must be of non-const type");
1141 return span<byte, (N == etl::dynamic_extent) ? (etl::dynamic_extent) : (N * sizeof(T))>(reinterpret_cast<byte*>(s.data()), s.size_bytes());
1142 }
1143}
1144
1145#endif
Definition iterator.h:228
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:710
ETL_CONSTEXPR span(const TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:638
ETL_NODISCARD etl::span< TRet > take(size_t const n)
Definition span.h:942
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:651
ETL_CONSTEXPR span() ETL_NOEXCEPT
Default constructor.
Definition span.h:568
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :etl::dynamic_extent > subspan() const
Obtains a span that is a view from OFFSET over the next COUNT elements of this span.
Definition span.h:891
void advance(size_t elements) ETL_NOEXCEPT
Definition span.h:917
ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
Returns a reverse circular iterator to the end of the span.
Definition span.h:750
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT
Obtains a span that is a view over the first COUNT elements of this span.
Definition span.h:845
ETL_NODISCARD TRet & take()
Definition span.h:961
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:782
ETL_CONSTEXPR span(const etl::span< U, N > &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:661
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT
Obtains a span that is a view from 'offset' over the next 'count' elements of this span.
Definition span.h:907
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:774
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > last() const ETL_NOEXCEPT
Obtains a span that is a view over the last COUNT elements of this span.
Definition span.h:862
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT
Obtains a span that is a view over the first count elements of this span.
Definition span.h:853
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition span.h:678
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT
Obtains a span that is a view over the last count elements of this span.
Definition span.h:870
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
Returns a const reverse iterator to the end of the span.
Definition span.h:758
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:836
ETL_CONSTEXPR span(TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:624
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:718
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:702
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:826
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< TNew, etl::dynamic_extent > reinterpret_as() const
Reinterpret the span as a span with different element type.
Definition span.h:927
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition span.h:670
ETL_CONSTEXPR span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
Construct from C array.
Definition span.h:598
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:726
ETL_CONSTEXPR span(const TIterator begin_, const TIterator end_)
Construct from iterators.
Definition span.h:588
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:694
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:686
ETL_CONSTEXPR span(const TIterator begin_, const TSize size_) ETL_NOEXCEPT
Construct from pointer + size.
Definition span.h:578
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:766
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:798
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:790
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:816
Definition span.h:61
Span - Fixed Extent.
Definition span.h:110
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:338
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:282
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:266
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > last() const ETL_NOEXCEPT
Obtains a span that is a view over the last COUNT elements of this span.
Definition span.h:436
ETL_CONSTEXPR14 span(const etl::span< U, N > &other, typename etl::enable_if< N==etl::dynamic_extent, void >::type *=0)
Definition span.h:233
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:213
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :Extent - OFFSET > subspan() const
Obtains a span that is a view from OFFSET over the next COUNT elements of this span.
Definition span.h:474
void advance(size_t elements) ETL_NOEXCEPT
Definition span.h:506
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT
Obtains a span that is a view over the first count elements of this span.
Definition span.h:427
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT
Obtains a span that is a view from 'offset' over the next 'count' elements of this span.
Definition span.h:496
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT
Obtains a span that is a view over the last count elements of this span.
Definition span.h:447
ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
Returns a reverse circular iterator to the end of the span.
Definition span.h:322
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:274
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:362
span(const TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:201
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:346
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:290
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT
Obtains a span that is a view over the first COUNT elements of this span.
Definition span.h:416
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:354
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition span.h:250
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition span.h:378
ETL_CONSTEXPR span(const TIterator begin_, const TIterator)
Construct from iterators.
Definition span.h:144
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:258
ETL_CONSTEXPR span(const TIterator begin_, const TSize) ETL_NOEXCEPT
Construct from iterators + size.
Definition span.h:135
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:387
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:407
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:397
ETL_CONSTEXPR span(const etl::span< U, N > &other, typename etl::enable_if< N==Extent, void >::type *=0) ETL_NOEXCEPT
Definition span.h:223
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
Returns a const reverse iterator to the end of the span.
Definition span.h:330
span(TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:188
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:370
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< TNew, etl::dynamic_extent > reinterpret_as() const
Reinterpret the span as a span with different element type.
Definition span.h:516
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition span.h:242
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:298
ETL_CONSTEXPR span(element_type(&begin_)[Array_Size], typename etl::enable_if<(Array_Size==Extent), void >::type *=0) ETL_NOEXCEPT
Construct from C array.
Definition span.h:163
Definition array.h:88
Definition array.h:73
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
Definition exception.h:47
Definition span.h:82
Definition span.h:68
Definition span.h:96
add_rvalue_reference
Definition type_traits_generator.h:1366
enable_if
Definition type_traits_generator.h:1230
extent
Definition type_traits_generator.h:1241
is_array
Definition type_traits_generator.h:1130
is_base_of
Definition type_traits_generator.h:1291
is_const
Definition type_traits_generator.h:947
is_pointer
Definition type_traits_generator.h:1140
is_same
Definition type_traits_generator.h:1080
remove_cv
Definition type_traits_generator.h:1007
remove_reference
Definition type_traits_generator.h:917
bitset_ext
Definition absolute.h:38
span< byte,(N==etl::dynamic_extent) ?(etl::dynamic_extent) :(N *sizeof(T))> as_writable_bytes(span< T, N > s) ETL_NOEXCEPT
Obtains a view to the byte representation of the elements of the span s.
Definition span.h:1138
ETL_CONSTEXPR T * to_address(T *p)
Definition memory.h:62
span< const byte,(N==etl::dynamic_extent) ?(etl::dynamic_extent) :(N *sizeof(T))> as_bytes(span< T, N > s) ETL_NOEXCEPT
Template deduction guides.
Definition span.h:1128
bool is_aligned(const void *p, size_t required_alignment)
Check that 'p' has 'required_alignment'.
Definition alignment.h:91
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1109
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1097
ETL_CONSTEXPR span< T, Extent > make_span(T(&data)[Extent])
Definition span.h:534
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314