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 "algorithm.h"
37#include "alignment.h"
38#include "array.h"
39#include "byte.h"
40#include "circular_iterator.h"
41#include "container.h"
42#include "error_handler.h"
43#include "exception.h"
44#include "hash.h"
45#include "integral_limits.h"
46#include "iterator.h"
47#include "memory.h"
48#include "nullptr.h"
49#include "static_assert.h"
50#include "type_traits.h"
51#include "private/tuple_size.h"
52
53#if ETL_USING_STL && ETL_USING_CPP20
54 #include <span>
55#endif
56
58
61
62namespace etl
63{
64 template <typename T>
66 {
67 };
68#if ETL_USING_STL && ETL_USING_CPP11
69 template <typename T, size_t N>
70 struct is_std_array<std::array<T, N>> : etl::true_type
71 {
72 };
73#endif
74 template <typename T>
75 struct is_std_array<const T> : is_std_array<T>
76 {
77 };
78 template <typename T>
79 struct is_std_array<volatile T> : is_std_array<T>
80 {
81 };
82 template <typename T>
83 struct is_std_array<const volatile T> : is_std_array<T>
84 {
85 };
86
87 template <typename T>
89 {
90 };
91 template <typename T, size_t N>
92 struct is_etl_array<etl::array<T, N> > : etl::true_type
93 {
94 };
95 template <typename T>
96 struct is_etl_array<const T> : is_etl_array<T>
97 {
98 };
99 template <typename T>
100 struct is_etl_array<volatile T> : is_etl_array<T>
101 {
102 };
103 template <typename T>
104 struct is_etl_array<const volatile T> : is_etl_array<T>
105 {
106 };
107
108 //***************************************************************************
109 // Tag to indicate a class is a span.
110 //***************************************************************************
111
112 // Forward declaration for trait
113 template <typename T, size_t Extent>
114 class span;
115
116 namespace private_span
117 {
118 template <typename T>
120 {
121 };
122
123 template <typename T, size_t Extent>
124 struct is_span_helper<etl::span<T, Extent> > : etl::true_type
125 {
126 };
127 } // namespace private_span
128
129 template <typename T>
130 struct is_span : private_span::is_span_helper<typename etl::remove_cvref<T>::type>
131 {
132 };
133
134#if ETL_USING_CPP17
135 template <typename T>
136 inline constexpr bool is_span_v = is_span<T>::value;
137#endif
138
139 //***************************************************************************
142 //***************************************************************************
143 class span_exception : public exception
144 {
145 public:
146
147 span_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
148 : exception(reason_, file_name_, line_number_)
149 {
150 }
151 };
152
153 //***************************************************************************
156 //***************************************************************************
157 class span_alignment_exception : public span_exception
158 {
159 public:
160
161 span_alignment_exception(string_type file_name_, numeric_type line_number_)
162 : span_exception(ETL_ERROR_TEXT("span:alignment", ETL_SPAN_FILE_ID"A"), file_name_, line_number_)
163 {
164 }
165 };
166
167 //***************************************************************************
170 //***************************************************************************
171 class span_size_mismatch : public span_exception
172 {
173 public:
174
175 span_size_mismatch(string_type file_name_, numeric_type line_number_)
176 : span_exception(ETL_ERROR_TEXT("span:size", ETL_SPAN_FILE_ID"B"), file_name_, line_number_)
177 {
178 }
179 };
180
181 //***************************************************************************
184 //***************************************************************************
185 class span_out_of_range : public span_exception
186 {
187 public:
188
189 span_out_of_range(string_type file_name_, numeric_type line_number_)
190 : span_exception(ETL_ERROR_TEXT("span:range", ETL_SPAN_FILE_ID"C"), file_name_, line_number_)
191 {
192 }
193 };
194
195 //***************************************************************************
200 {
201 };
202
203 //***************************************************************************
205 //***************************************************************************
206 template <typename T, size_t Extent = etl::dynamic_extent>
207 class span : public span_tag
208 {
209 public:
210
211 typedef T element_type;
212 typedef typename etl::remove_cv<T>::type value_type;
213 typedef size_t size_type;
214 typedef T& reference;
215 typedef const T& const_reference;
216 typedef T* pointer;
217 typedef const T* const_pointer;
218
219 typedef T* iterator;
220 typedef const T* const_iterator;
221 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
222 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
223
224 typedef etl::circular_iterator<pointer> circular_iterator;
225 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
226
227 static ETL_CONSTANT size_t extent = Extent;
228
229 //*************************************************************************
232 //*************************************************************************
233#if ETL_USING_CPP11
234 template <size_t E = Extent, typename = typename etl::enable_if<E == 0, void>::type>
235 ETL_CONSTEXPR span() ETL_NOEXCEPT
236 : pbegin(ETL_NULLPTR)
237 {
238 }
239#else
240 ETL_CONSTEXPR span() ETL_NOEXCEPT
241 : pbegin(ETL_NULLPTR)
242 {
243 ETL_STATIC_ASSERT(Extent == 0, "Default constructor only available for zero extent");
244 }
245#endif
246
247 //*************************************************************************
249 //*************************************************************************
250 template <typename TIterator>
251 explicit ETL_CONSTEXPR14 span(const TIterator begin_, const size_t size_) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
252 : pbegin(etl::to_address(begin_))
253 {
254 ETL_ASSERT(size_ == Extent, ETL_ERROR(span_size_mismatch));
255 (void)size_;
256 }
257
258 //*************************************************************************
260 //*************************************************************************
261 template <typename TIteratorBegin, typename TIteratorEnd>
262 ETL_CONSTEXPR14 span(const TIteratorBegin begin_, const TIteratorEnd end_,
263 typename etl::enable_if< !etl::is_integral<TIteratorEnd>::value, void>::type* = 0) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
264 : pbegin(etl::to_address(begin_))
265 {
266 ETL_ASSERT(etl::distance(begin_, end_) == Extent, ETL_ERROR(span_size_mismatch));
267 (void)end_;
268 }
269
270 //*************************************************************************
272 //*************************************************************************
273 template <size_t Array_Size>
274 ETL_CONSTEXPR span(typename etl::type_identity<element_type>::type (&begin_)[Array_Size],
275 typename etl::enable_if<(Array_Size == Extent), void>::type* = 0) ETL_NOEXCEPT
276 : pbegin(begin_)
277 {
278 }
279
280#if ETL_USING_CPP11
281 //*************************************************************************
284 //*************************************************************************
285 template <typename TContainer>
286 ETL_CONSTEXPR14 span(TContainer&& a,
287 typename etl::enable_if<
288 !etl::is_span<TContainer>::value && !etl::is_std_array< typename etl::remove_reference<TContainer>::type>::value
289 && !etl::is_etl_array< typename etl::remove_reference<TContainer>::type>::value
290 && !etl::is_pointer< typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
291 && etl::is_lvalue_reference<TContainer&&>::value && has_size<TContainer>::value && has_data<TContainer>::value
292 && etl::is_convertible< decltype(etl::declval< typename etl::remove_reference<TContainer>::type&>().data()), pointer>::value
293 && etl::is_same< typename etl::remove_cv<T>::type,
295 void>::type* = 0) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
296 : pbegin(a.data())
297 {
298 ETL_ASSERT(a.size() == Extent, ETL_ERROR(span_size_mismatch));
299 }
300#else
301 //*************************************************************************
304 //*************************************************************************
305 template <typename TContainer>
306 span(TContainer& a, typename etl::enable_if<
307 !etl::is_span<TContainer>::value && !etl::is_std_array< typename etl::remove_reference<TContainer>::type>::value
308 && !etl::is_etl_array< typename etl::remove_reference<TContainer>::type>::value
309 && !etl::is_pointer< typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
310 && has_size<TContainer>::value && has_data<TContainer>::value
311 && etl::is_same< typename etl::remove_cv<T>::type,
313 void>::type* = 0)
314 : pbegin(a.data())
315 {
316 ETL_ASSERT(a.size() == Extent, ETL_ERROR(span_size_mismatch));
317 }
318
319 //*************************************************************************
322 //*************************************************************************
323 template <typename TContainer>
325 const TContainer& a,
326 typename etl::enable_if<
327 !etl::is_span<TContainer>::value && !etl::is_std_array< typename etl::remove_reference<TContainer>::type>::value
328 && !etl::is_etl_array< typename etl::remove_reference<TContainer>::type>::value
329 && !etl::is_pointer< typename etl::remove_reference<TContainer>::type>::value && has_size<TContainer>::value && has_data<TContainer>::value
330 && etl::is_same< typename etl::remove_cv<T>::type,
332 void>::type* = 0)
333 : pbegin(a.data())
334 {
335 ETL_ASSERT(a.size() == Extent, ETL_ERROR(span_size_mismatch));
336 }
337#endif
338
339 //*************************************************************************
341 //*************************************************************************
342 template <typename U, size_t Size>
343 ETL_CONSTEXPR span(etl::array<U, Size>& other,
344 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0) ETL_NOEXCEPT
345 : pbegin(other.data())
346 {
347 }
348
349 //*************************************************************************
351 //*************************************************************************
352 template <typename U, size_t Size>
353 ETL_CONSTEXPR span(const etl::array<U, Size>& other,
354 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0) ETL_NOEXCEPT
355 : pbegin(other.data())
356 {
357 }
358
359#if ETL_USING_CPP11
360 template <typename U, size_t Size>
361 span(etl::array<U, Size>&&) = delete;
362#endif
363
364#if ETL_USING_STL && ETL_USING_CPP11
365 //*************************************************************************
367 //*************************************************************************
368 template <typename U, size_t Size>
369 ETL_CONSTEXPR span(std::array<U, Size>& other,
370 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0) ETL_NOEXCEPT
371 : pbegin(other.data())
372 {
373 }
374
375 //*************************************************************************
377 //*************************************************************************
378 template <typename U, size_t Size>
379 ETL_CONSTEXPR span(const std::array<U, Size>& other,
380 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0) ETL_NOEXCEPT
381 : pbegin(other.data())
382 {
383 }
384
385 template <typename U, size_t Size>
386 span(std::array<U, Size>&&) = delete;
387#endif
388
389 //*************************************************************************
391 //*************************************************************************
392 ETL_CONSTEXPR span(const span& other) ETL_NOEXCEPT
393 : pbegin(other.pbegin)
394 {
395 }
396
397 //*************************************************************************
400 //*************************************************************************
401 template <typename U, size_t Size>
402 ETL_CONSTEXPR span(const etl::span<U, Size>& other,
403 typename etl::enable_if<(Size == Extent) && (Size != etl::dynamic_extent), void>::type* = 0) ETL_NOEXCEPT
404 : pbegin(other.data())
405 {
406 }
407
408 //*************************************************************************
411 //*************************************************************************
412 template <typename U, size_t Size>
413 ETL_CONSTEXPR14 explicit span(const etl::span<U, Size>& other, typename etl::enable_if<(Size == etl::dynamic_extent), void>::type* = 0)
414 : pbegin(other.data())
415 {
416 ETL_ASSERT(other.size() == Extent, ETL_ERROR(span_size_mismatch));
417 }
418
419#if ETL_USING_STL && ETL_USING_CPP20
420 //*************************************************************************
423 //*************************************************************************
424 template <typename U, size_t Size>
425 ETL_CONSTEXPR span(const std::span<U, Size>& other,
426 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value, int>::type* = 0) ETL_NOEXCEPT
427 : pbegin(other.data())
428 {
429 }
430
431 //*************************************************************************
434 //*************************************************************************
435 template <typename U, size_t Size>
436 ETL_CONSTEXPR14 span(const std::span<U, Size>& other,
437 typename etl::enable_if<(Size == etl::dynamic_extent && etl::is_convertible<U (*)[], T (*)[]>::value), int>::type* = 0)
438 ETL_NOEXCEPT
439 : pbegin(other.data())
440 {
441 ETL_ASSERT(other.size() == Extent, ETL_ERROR(span_size_mismatch));
442 }
443#endif
444
445 //*************************************************************************
447 //*************************************************************************
448 ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
449 {
450 ETL_STATIC_ASSERT(Extent > 0, "Span is empty");
451
452 return *pbegin;
453 }
454
455 //*************************************************************************
457 //*************************************************************************
458 ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
459 {
460 ETL_STATIC_ASSERT(Extent > 0, "Span is empty");
461
462 return *((pbegin + Extent) - 1);
463 }
464
465 //*************************************************************************
467 //*************************************************************************
468 ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
469 {
470 return pbegin;
471 }
472
473 //*************************************************************************
475 //*************************************************************************
476 ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
477 {
478 return pbegin;
479 }
480
481 //*************************************************************************
483 //*************************************************************************
484 ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
485 {
486 return pbegin;
487 }
488
489 //*************************************************************************
491 //*************************************************************************
492 ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
493 {
494 return circular_iterator(begin(), end());
495 }
496
497 //*************************************************************************
499 //*************************************************************************
500 ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
501 {
502 return (pbegin + Extent);
503 }
504
505 //*************************************************************************
507 //*************************************************************************
508 ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
509 {
510 return (pbegin + Extent);
511 }
512
513 //*************************************************************************
514 // Returns a const reverse iterator to the reverse beginning of the span.
515 //*************************************************************************
516 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
517 {
518 return const_reverse_iterator((pbegin + Extent));
519 }
520
521 //*************************************************************************
522 // Returns an reverse iterator to the reverse beginning of the span.
523 //*************************************************************************
524 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rbegin() const ETL_NOEXCEPT
525 {
526 return reverse_iterator((pbegin + Extent));
527 }
528
529 //*************************************************************************
531 //*************************************************************************
532 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
533 {
534 return reverse_circular_iterator(rbegin(), rend());
535 }
536
537 //*************************************************************************
539 //*************************************************************************
540 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
541 {
542 return const_reverse_iterator(pbegin);
543 }
544
545 //*************************************************************************
547 //*************************************************************************
548 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
549 {
550 return reverse_iterator(pbegin);
551 }
552
553 //*************************************************************************
555 //*************************************************************************
556 ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
557 {
558 return Extent == 0;
559 }
560
561 //*************************************************************************
563 //*************************************************************************
564 ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
565 {
566 return Extent;
567 }
568
569 //*************************************************************************
571 //*************************************************************************
572 ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
573 {
574 return sizeof(element_type) * Extent;
575 }
576
577 //*************************************************************************
579 //*************************************************************************
580 ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
581 {
582 return size();
583 }
584
585 //*************************************************************************
587 //*************************************************************************
588 ETL_CONSTEXPR14 span& operator=(const span& other) ETL_NOEXCEPT
589 {
590 pbegin = other.pbegin;
591 return *this;
592 }
593
594 //*************************************************************************
596 //*************************************************************************
597 ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
598 {
599 ETL_ASSERT(i < size(), ETL_ERROR(span_out_of_range));
600
601 return pbegin[i];
602 }
603
604 //*************************************************************************
606 //*************************************************************************
607 ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
608 {
609 ETL_ASSERT(i < size(), ETL_ERROR(span_out_of_range));
610
611 return pbegin[i];
612 }
613
614 //*************************************************************************
616 //*************************************************************************
617 ETL_CONSTEXPR reference operator[](const size_t i) const
618 {
619#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_INDEX_OPERATOR
620 return i < size() ? pbegin[i] : throw(ETL_ERROR(span_out_of_range));
621#else
622 ETL_ASSERT_CHECK_INDEX_OPERATOR(i < size(), ETL_ERROR(span_out_of_range));
623
624 return pbegin[i];
625#endif
626 }
627
628 //*************************************************************************
631 //*************************************************************************
632 template <size_t COUNT>
633 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> first() const ETL_NOEXCEPT
634 {
635 // If Extent is static, check that original span contains at least COUNT
636 // elements
637 ETL_STATIC_ASSERT(COUNT <= Extent, "Original span does not contain COUNT elements");
638
639 return etl::span<element_type, COUNT>(pbegin, pbegin + COUNT);
640 }
641
642 //*************************************************************************
645 //*************************************************************************
646 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> first(size_t count) const
647 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
648 {
649#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
650 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count) : throw(ETL_ERROR(span_out_of_range));
651#else
652 ETL_ASSERT_CHECK_EXTRA(count <= size(), ETL_ERROR(span_out_of_range));
653
654 return etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count);
655#endif
656 }
657
658 //*************************************************************************
660 //*************************************************************************
661 template <size_t COUNT>
662 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> last() const ETL_NOEXCEPT
663 {
664 // If Extent is static, check that original span contains at least COUNT
665 // elements
666 ETL_STATIC_ASSERT(COUNT <= Extent, "Original span does not contain COUNT elements");
667
668 return etl::span<element_type, COUNT>(pbegin + Extent - COUNT, (pbegin + Extent));
669 }
670
671 //*************************************************************************
673 //*************************************************************************
674 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> last(size_t count) const
675 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
676 {
677#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
678 return count <= size() ? etl::span<element_type, etl::dynamic_extent>((pbegin + Extent) - count, (pbegin + Extent))
679 : throw(ETL_ERROR(span_out_of_range));
680#else
681 ETL_ASSERT_CHECK_EXTRA(count <= size(), ETL_ERROR(span_out_of_range));
682
683 return etl::span<element_type, etl::dynamic_extent>((pbegin + Extent) - count, (pbegin + Extent));
684#endif
685 }
686
687#if ETL_USING_CPP11
688 //*************************************************************************
691 //*************************************************************************
692 template <size_t OFFSET, size_t COUNT = etl::dynamic_extent>
693 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET> subspan() const ETL_NOEXCEPT
694 {
695 // If Extent is static, check that OFFSET is within the original span
696 ETL_STATIC_ASSERT(OFFSET <= Extent, "OFFSET is not within the original span");
697
698 // If count is also static, check that OFFSET + COUNT is within the
699 // original span
700 ETL_STATIC_ASSERT((COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) : true, "OFFSET + COUNT is not within the original span");
701
702 return (COUNT == etl::dynamic_extent) ? etl::span < element_type,
703 COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin + OFFSET, (pbegin + Extent)) : etl::span < element_type,
704 COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
705 }
706#else
707 //*************************************************************************
710 //*************************************************************************
711 template <size_t OFFSET, size_t COUNT>
712 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET> subspan() const
713 {
714 // If Extent is static, check that OFFSET is within the original span
715 ETL_STATIC_ASSERT(OFFSET <= Extent, "OFFSET is not within the original span");
716
717 // If count is also static, check that OFFSET + COUNT is within the
718 // original span
719 ETL_STATIC_ASSERT((COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) : true, "OFFSET + COUNT is not within the original span");
720
721 if (COUNT == etl::dynamic_extent)
722 {
723 return etl::span<element_type, (COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET)>(pbegin + OFFSET, (pbegin + Extent));
724 }
725 else
726 {
727 return etl::span < element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
728 }
729 }
730#endif
731
732 //*************************************************************************
735 //*************************************************************************
736 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> subspan(size_t offset, size_t count = etl::dynamic_extent) const
737 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
738 {
739#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
740 return (offset <= size()) && (count != etl::dynamic_extent ? count <= (size() - offset) : true)
741 ? ((count == etl::dynamic_extent) ? etl::span<element_type, etl::dynamic_extent>(pbegin + offset, (pbegin + Extent))
742 : etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pbegin + offset + count))
743 : throw(ETL_ERROR(span_out_of_range));
744#else
745 ETL_ASSERT_CHECK_EXTRA(offset <= size(), ETL_ERROR(span_out_of_range));
746 ETL_ASSERT_CHECK_EXTRA(count != etl::dynamic_extent ? count <= (size() - offset) : true, ETL_ERROR(span_out_of_range));
747
748 return (count == etl::dynamic_extent) ? etl::span<element_type, etl::dynamic_extent>(pbegin + offset, (pbegin + Extent))
749 : etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pbegin + offset + count);
750#endif
751 }
752
753 //*************************************************************************
755 //*************************************************************************
756 template <typename TNew>
757 ETL_NODISCARD ETL_CONSTEXPR14 etl::span<TNew, Extent * sizeof(element_type) / sizeof(TNew)> reinterpret_as() const
758 {
759 ETL_ASSERT(etl::is_aligned<etl::alignment_of<TNew>::value>(pbegin), ETL_ERROR(span_alignment_exception));
760
761 return etl::span<TNew, Extent * sizeof(element_type) / sizeof(TNew)>(reinterpret_cast<TNew*>(pbegin),
762 Extent * sizeof(element_type) / sizeof(TNew));
763 }
764
765 private:
766
767 pointer pbegin;
768 };
769
770 //*************************************************************************
773 //*************************************************************************
774 template <typename T, size_t Extent>
775 ETL_CONSTEXPR span<T, Extent> make_span(T (&data)[Extent])
776 {
777 return span<T, Extent>(data);
778 }
779
780 //***************************************************************************
782 //***************************************************************************
783 template <typename T>
784 class span<T, etl::dynamic_extent> : public span_tag
785 {
786 public:
787
788 typedef T element_type;
789 typedef typename etl::remove_cv<T>::type value_type;
790 typedef size_t size_type;
791 typedef T& reference;
792 typedef const T& const_reference;
793 typedef T* pointer;
794 typedef const T* const_pointer;
795
796 typedef T* iterator;
797 typedef const T* const_iterator;
798 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
799 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
800
801 typedef etl::circular_iterator<pointer> circular_iterator;
802 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
803
804 static ETL_CONSTANT size_t extent = etl::dynamic_extent;
805
806 //*************************************************************************
808 //*************************************************************************
809 ETL_CONSTEXPR span() ETL_NOEXCEPT
810 : pbegin(ETL_NULLPTR)
811 , pend(ETL_NULLPTR)
812 {
813 }
814
815 //*************************************************************************
817 //*************************************************************************
818 template <typename TIterator>
819 ETL_CONSTEXPR span(const TIterator begin_, size_t size_) ETL_NOEXCEPT
820 : pbegin(etl::to_address(begin_))
821 , pend(etl::to_address(begin_) + size_)
822 {
823 }
824
825 //*************************************************************************
827 //*************************************************************************
828 template <typename TIteratorBegin, typename TIteratorEnd>
829 ETL_CONSTEXPR span(const TIteratorBegin begin_, const TIteratorEnd end_,
830 typename etl::enable_if<!etl::is_integral<TIteratorEnd>::value, void>::type* = 0) ETL_NOEXCEPT
831 : pbegin(etl::to_address(begin_))
832 , pend(etl::to_address(begin_) + etl::distance(begin_, end_))
833 {
834 }
835
836 //*************************************************************************
838 //*************************************************************************
839 template <size_t Array_Size>
840 ETL_CONSTEXPR span(element_type (&begin_)[Array_Size]) ETL_NOEXCEPT
841 : pbegin(begin_)
842 , pend(begin_ + Array_Size)
843 {
844 }
845
846#if ETL_USING_CPP11
847 //*************************************************************************
850 //*************************************************************************
851 template <typename TContainer>
852 ETL_CONSTEXPR span(TContainer&& a,
853 typename etl::enable_if<
854 !etl::is_span<TContainer>::value && !etl::is_std_array< typename etl::remove_reference<TContainer>::type>::value
855 && !etl::is_etl_array< typename etl::remove_reference<TContainer>::type>::value
856 && !etl::is_pointer< typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
857 && etl::is_lvalue_reference<TContainer&&>::value && has_size<TContainer>::value && has_data<TContainer>::value
858 && etl::is_convertible< decltype(etl::declval< typename etl::remove_reference<TContainer>::type&>().data()), pointer>::value
859 && etl::is_same< typename etl::remove_cv<T>::type,
861 void>::type* = 0) ETL_NOEXCEPT
862 : pbegin(a.data())
863 , pend(a.data() + a.size())
864 {
865 }
866#else
867 //*************************************************************************
870 //*************************************************************************
871 template <typename TContainer>
872 span(TContainer& a, typename etl::enable_if<
873 !etl::is_span<TContainer>::value && !etl::is_std_array< typename etl::remove_reference<TContainer>::type>::value
874 && !etl::is_etl_array< typename etl::remove_reference<TContainer>::type>::value
875 && !etl::is_pointer< typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
876 && has_size<TContainer>::value && has_data<TContainer>::value
877 && etl::is_same< typename etl::remove_cv<T>::type,
879 void>::type* = 0) ETL_NOEXCEPT
880 : pbegin(a.data())
881 , pend(a.data() + a.size())
882 {
883 }
884
885 //*************************************************************************
888 //*************************************************************************
889 template <typename TContainer>
890 span(const TContainer& a,
891 typename etl::enable_if<
892 !etl::is_span<TContainer>::value && !etl::is_std_array< typename etl::remove_reference<TContainer>::type>::value
893 && !etl::is_etl_array< typename etl::remove_reference<TContainer>::type>::value
894 && !etl::is_pointer< typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
895 && has_size<TContainer>::value && has_data<TContainer>::value
896 && etl::is_same< typename etl::remove_cv<T>::type,
898 void>::type* = 0) ETL_NOEXCEPT
899 : pbegin(a.data())
900 , pend(a.data() + a.size())
901 {
902 }
903#endif
904
905#if ETL_USING_STL && ETL_USING_CPP20
906 //*************************************************************************
908 //*************************************************************************
909 template <typename U, size_t Size>
910 ETL_CONSTEXPR span(std::span<U, Size>& other, typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value, int>::type* = 0) ETL_NOEXCEPT
911 : pbegin(other.data())
912 , pend(other.data() + other.size())
913 {
914 }
915
916 //*************************************************************************
918 //*************************************************************************
919 template <typename U, size_t Size>
920 ETL_CONSTEXPR span(const std::span<U, Size>& other, typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value, int>::type* = 0)
921 ETL_NOEXCEPT
922 : pbegin(other.data())
923 , pend(other.data() + other.size())
924 {
925 }
926#endif
927
928 //*************************************************************************
930 //*************************************************************************
931 template <typename U, size_t Size>
932 ETL_CONSTEXPR span(etl::array<U, Size>& other, typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0)
933 ETL_NOEXCEPT
934 : pbegin(other.data())
935 , pend(other.data() + Size)
936 {
937 }
938
939 //*************************************************************************
941 //*************************************************************************
942 template <typename U, size_t Size>
943 ETL_CONSTEXPR span(const etl::array<U, Size>& other, typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0)
944 ETL_NOEXCEPT
945 : pbegin(other.data())
946 , pend(other.data() + Size)
947 {
948 }
949
950#if ETL_USING_CPP11
951 template <typename U, size_t Size>
952 span(etl::array<U, Size>&&) = delete;
953#endif
954
955#if ETL_USING_STL && ETL_USING_CPP11
956 //*************************************************************************
958 //*************************************************************************
959 template <typename U, size_t Size>
960 ETL_CONSTEXPR span(std::array<U, Size>& other, typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0)
961 ETL_NOEXCEPT
962 : pbegin(other.data())
963 , pend(other.data() + Size)
964 {
965 }
966
967 //*************************************************************************
969 //*************************************************************************
970 template <typename U, size_t Size>
971 ETL_CONSTEXPR span(const std::array<U, Size>& other, typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value, void>::type* = 0)
972 ETL_NOEXCEPT
973 : pbegin(other.data())
974 , pend(other.data() + Size)
975 {
976 }
977
978 template <typename U, size_t Size>
979 span(std::array<U, Size>&&) = delete;
980#endif
981
982 //*************************************************************************
984 //*************************************************************************
985 ETL_CONSTEXPR span(const span& other) ETL_NOEXCEPT
986 : pbegin(other.pbegin)
987 , pend(other.pend)
988 {
989 }
990
991 //*************************************************************************
993 //*************************************************************************
994 template <typename U, size_t Size>
995 ETL_CONSTEXPR span(const etl::span<U, Size>& other) ETL_NOEXCEPT
996 : pbegin(other.data())
997 , pend(other.data() + other.size())
998 {
999 }
1000
1001 //*************************************************************************
1003 //*************************************************************************
1004 ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1005 {
1006#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1007 return size() > 0 ? *pbegin : throw(ETL_ERROR(span_out_of_range));
1008#else
1009 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(span_out_of_range));
1010
1011 return *pbegin;
1012#endif
1013 }
1014
1015 //*************************************************************************
1017 //*************************************************************************
1018 ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1019 {
1020#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1021 return size() > 0 ? *(pend - 1) : throw(ETL_ERROR(span_out_of_range));
1022#else
1023 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(span_out_of_range));
1024
1025 return *(pend - 1);
1026#endif
1027 }
1028
1029 //*************************************************************************
1031 //*************************************************************************
1032 ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
1033 {
1034 return pbegin;
1035 }
1036
1037 //*************************************************************************
1039 //*************************************************************************
1040 ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
1041 {
1042 return pbegin;
1043 }
1044
1045 //*************************************************************************
1047 //*************************************************************************
1048 ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
1049 {
1050 return pbegin;
1051 }
1052
1053 //*************************************************************************
1055 //*************************************************************************
1056 ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
1057 {
1058 return circular_iterator(begin(), end());
1059 }
1060
1061 //*************************************************************************
1063 //*************************************************************************
1064 ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
1065 {
1066 return pend;
1067 }
1068
1069 //*************************************************************************
1071 //*************************************************************************
1072 ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
1073 {
1074 return pend;
1075 }
1076
1077 //*************************************************************************
1078 // Returns an reverse iterator to the reverse beginning of the span.
1079 //*************************************************************************
1080 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rbegin() const ETL_NOEXCEPT
1081 {
1082 return reverse_iterator(pend);
1083 }
1084
1085 //*************************************************************************
1086 // Returns a const reverse iterator to the reverse beginning of the span.
1087 //*************************************************************************
1088 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
1089 {
1090 return const_reverse_iterator(pend);
1091 }
1092
1093 //*************************************************************************
1095 //*************************************************************************
1096 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
1097 {
1098 return reverse_circular_iterator(rbegin(), rend());
1099 }
1100
1101 //*************************************************************************
1103 //*************************************************************************
1104 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
1105 {
1106 return const_reverse_iterator(pbegin);
1107 }
1108
1109 //*************************************************************************
1111 //*************************************************************************
1112 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
1113 {
1114 return reverse_iterator(pbegin);
1115 }
1116
1117 //*************************************************************************
1119 //*************************************************************************
1120 ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
1121 {
1122 return (pbegin == pend);
1123 }
1124
1125 //*************************************************************************
1127 //*************************************************************************
1128 ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
1129 {
1130 return static_cast<size_t>(pend - pbegin);
1131 }
1132
1133 //*************************************************************************
1135 //*************************************************************************
1136 ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
1137 {
1138 return sizeof(element_type) * static_cast<size_t>(pend - pbegin);
1139 }
1140
1141 //*************************************************************************
1143 //*************************************************************************
1144 ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
1145 {
1146 return size();
1147 }
1148
1149 //*************************************************************************
1151 //*************************************************************************
1152 ETL_CONSTEXPR14 span& operator=(const span& other) ETL_NOEXCEPT
1153 {
1154 pbegin = other.pbegin;
1155 pend = other.pend;
1156 return *this;
1157 }
1158
1159 //*************************************************************************
1161 //*************************************************************************
1162 ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
1163 {
1164 ETL_ASSERT(i < size(), ETL_ERROR(span_out_of_range));
1165
1166 return pbegin[i];
1167 }
1168
1169 //*************************************************************************
1171 //*************************************************************************
1172 ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
1173 {
1174 ETL_ASSERT(i < size(), ETL_ERROR(span_out_of_range));
1175
1176 return pbegin[i];
1177 }
1178
1179 //*************************************************************************
1181 //*************************************************************************
1182 ETL_CONSTEXPR reference operator[](const size_t i) const
1183 {
1184#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_INDEX_OPERATOR
1185 return i < size() ? pbegin[i] : throw(ETL_ERROR(span_out_of_range));
1186#else
1187 ETL_ASSERT_CHECK_INDEX_OPERATOR(i < size(), ETL_ERROR(span_out_of_range));
1188
1189 return pbegin[i];
1190#endif
1191 }
1192
1193 //*************************************************************************
1196 //*************************************************************************
1197 template <size_t COUNT>
1198 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> first() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1199 {
1200#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1201 return COUNT <= size() ? etl::span<element_type, COUNT>(pbegin, pbegin + COUNT) : throw(ETL_ERROR(span_out_of_range));
1202#else
1203 ETL_ASSERT_CHECK_EXTRA(COUNT <= size(), ETL_ERROR(span_out_of_range));
1204
1205 return etl::span<element_type, COUNT>(pbegin, pbegin + COUNT);
1206#endif
1207 }
1208
1209 //*************************************************************************
1212 //*************************************************************************
1213 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> first(size_t count) const
1214 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1215 {
1216#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1217 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count) : throw(ETL_ERROR(span_out_of_range));
1218#else
1219 ETL_ASSERT_CHECK_EXTRA(count <= size(), ETL_ERROR(span_out_of_range));
1220
1221 return etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count);
1222#endif
1223 }
1224
1225 //*************************************************************************
1227 //*************************************************************************
1228 template <size_t COUNT>
1229 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, COUNT> last() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1230 {
1231#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1232 return COUNT <= size() ? etl::span<element_type, COUNT>(pend - COUNT, pend) : throw(ETL_ERROR(span_out_of_range));
1233#else
1234 ETL_ASSERT_CHECK_EXTRA(COUNT <= size(), ETL_ERROR(span_out_of_range));
1235
1236 return etl::span<element_type, COUNT>(pend - COUNT, pend);
1237#endif
1238 }
1239
1240 //*************************************************************************
1242 //*************************************************************************
1243 ETL_NODISCARD ETL_CONSTEXPR etl::span<element_type, etl::dynamic_extent> last(size_t count) const
1244 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1245 {
1246#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1247 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pend - count, pend) : throw(ETL_ERROR(span_out_of_range));
1248#else
1249 ETL_ASSERT_CHECK_EXTRA(count <= size(), ETL_ERROR(span_out_of_range));
1250
1251 return etl::span<element_type, etl::dynamic_extent>(pend - count, pend);
1252#endif
1253 }
1254
1255#if ETL_USING_CPP11
1256 //*************************************************************************
1259 //*************************************************************************
1260 template <size_t OFFSET, size_t COUNT = etl::dynamic_extent>
1262 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1263 {
1264 #if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1265 return (OFFSET <= size()) && (COUNT != etl::dynamic_extent ? COUNT <= (size() - OFFSET) : true)
1266 ? ((COUNT == etl::dynamic_extent) ? etl::span < element_type,
1267 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pend) : etl::span < element_type,
1268 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pbegin + OFFSET + COUNT))
1269 : throw(ETL_ERROR(span_out_of_range));
1270 #else
1271 ETL_ASSERT_CHECK_EXTRA(OFFSET <= size(), ETL_ERROR(span_out_of_range));
1272 ETL_ASSERT_CHECK_EXTRA(COUNT != etl::dynamic_extent ? COUNT <= (size() - OFFSET) : true, ETL_ERROR(span_out_of_range));
1273
1274 return (COUNT == etl::dynamic_extent) ? etl::span < element_type,
1275 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pend) : etl::span < element_type,
1276 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
1277 #endif
1278 }
1279#else
1280 //*************************************************************************
1283 //*************************************************************************
1284 template <size_t OFFSET, size_t COUNT>
1286 {
1287 ETL_ASSERT_CHECK_EXTRA(OFFSET <= size(), ETL_ERROR(span_out_of_range));
1288 ETL_ASSERT_CHECK_EXTRA(COUNT != etl::dynamic_extent ? COUNT <= (size() - OFFSET) : true, ETL_ERROR(span_out_of_range));
1289
1290 if (COUNT == etl::dynamic_extent)
1291 {
1292 return etl::span < element_type, COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pend);
1293 }
1294 else
1295 {
1296 return etl::span < element_type, COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
1297 }
1298 }
1299#endif
1300
1301 //*************************************************************************
1304 //*************************************************************************
1305 ETL_NODISCARD ETL_CONSTEXPR14 etl::span<element_type, etl::dynamic_extent> subspan(size_t offset, size_t count = etl::dynamic_extent) const
1306 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1307 {
1308 ETL_ASSERT_CHECK_EXTRA(offset <= size(), ETL_ERROR(span_out_of_range));
1309 ETL_ASSERT_CHECK_EXTRA(count != etl::dynamic_extent ? count <= (size() - offset) : true, ETL_ERROR(span_out_of_range));
1310
1311 return (count == etl::dynamic_extent) ? etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pend)
1312 : etl::span<element_type, etl::dynamic_extent>(pbegin + offset, pbegin + offset + count);
1313 }
1314
1315 //*************************************************************************
1319 //*************************************************************************
1320 void advance(size_t elements) ETL_NOEXCEPT
1321 {
1322 elements = etl::min(elements, size());
1323 pbegin += elements;
1324 }
1325
1326 //*************************************************************************
1328 //*************************************************************************
1329 template <typename TNew>
1330 ETL_NODISCARD ETL_CONSTEXPR14 etl::span<TNew, etl::dynamic_extent> reinterpret_as() const
1331 {
1332 ETL_ASSERT(etl::is_aligned<etl::alignment_of<TNew>::value>(pbegin), ETL_ERROR(span_alignment_exception));
1333
1334 return etl::span<TNew, etl::dynamic_extent>(reinterpret_cast<TNew*>(pbegin),
1335 static_cast<size_t>(pend - pbegin) * sizeof(element_type) / sizeof(TNew));
1336 }
1337
1338 //*************************************************************************
1343 //*************************************************************************
1344 template <typename TRet>
1345 ETL_NODISCARD
1346 etl::span<TRet> take(size_t const n)
1347 {
1348 ETL_STATIC_ASSERT(sizeof(TRet) % sizeof(element_type) == 0, "sizeof(TRet) must be divisible by sizeof(T)");
1349
1350 ETL_ASSERT(etl::is_aligned<etl::alignment_of<TRet>::value>(pbegin), ETL_ERROR(span_alignment_exception));
1351 ETL_ASSERT(sizeof(TRet) * n <= sizeof(element_type) * size(), ETL_ERROR(span_size_mismatch));
1352
1354 advance(sizeof(TRet) / sizeof(element_type) * n);
1355
1356 return result;
1357 }
1358
1359 //*************************************************************************
1363 //*************************************************************************
1364 template <typename TRet>
1365 ETL_NODISCARD
1366 TRet& take()
1367 {
1368 ETL_STATIC_ASSERT(sizeof(TRet) % sizeof(element_type) == 0, "sizeof(TRet) must be divisible by sizeof(T)");
1369
1370 ETL_ASSERT(etl::is_aligned<etl::alignment_of<TRet>::value>(pbegin), ETL_ERROR(span_alignment_exception));
1371 ETL_ASSERT(sizeof(TRet) <= sizeof(element_type) * size(), ETL_ERROR(span_size_mismatch));
1372
1373 TRet& result = *reinterpret_cast<TRet*>(data());
1374 advance(sizeof(TRet) / sizeof(element_type));
1375
1376 return result;
1377 }
1378
1379 private:
1380
1381 pointer pbegin;
1382 pointer pend;
1383 };
1384
1385 //*************************************************************************
1388 //*************************************************************************
1389 template <typename T>
1394
1395 //*************************************************************************
1398 //*************************************************************************
1399 template <typename T>
1404
1405 template <typename T, size_t Extent>
1406 ETL_CONSTANT size_t span<T, Extent>::extent;
1407
1408 template <typename T>
1409 ETL_CONSTANT size_t span<T, etl::dynamic_extent>::extent;
1410
1411 //*************************************************************************
1413 //*************************************************************************
1414 template <typename T1, size_t N1, typename T2, size_t N2>
1415 ETL_NODISCARD
1416 ETL_CONSTEXPR typename etl::enable_if< etl::is_same<typename etl::remove_cv<T1>::type, typename etl::remove_cv<T2>::type>::value, bool>::type
1417 operator==(const etl::span<T1, N1>& lhs, const etl::span<T2, N2>& rhs) ETL_NOEXCEPT
1418 {
1419 return (lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size());
1420 }
1421
1422 //*************************************************************************
1424 //*************************************************************************
1425 template <typename T1, size_t N1, typename T2, size_t N2>
1426 ETL_NODISCARD ETL_CONSTEXPR bool operator!=(const etl::span<T1, N1>& lhs, const etl::span<T2, N2>& rhs) ETL_NOEXCEPT
1427 {
1428 return !(lhs == rhs);
1429 }
1430
1431 //*************************************************************************
1438 //*************************************************************************
1439 template <typename T1, size_t N1, typename T2, size_t N2>
1440 typename etl::enable_if< etl::is_same<typename etl::remove_cv<T1>::type, typename etl::remove_cv<T2>::type>::value, bool>::type
1441 equal(const etl::span<T1, N1>& lhs, const etl::span<T2, N2>& rhs)
1442 {
1443 return (lhs.empty() && rhs.empty()) || ((lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size()))
1444 || etl::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
1445 }
1446
1447 //*************************************************************************
1456 //*************************************************************************
1457 template <typename T1, size_t N1, typename T2, size_t N2>
1458 typename etl::enable_if< etl::is_same<typename etl::remove_cv<T1>::type, typename etl::remove_cv<T2>::type>::value && !etl::is_const<T2>::value,
1459 bool>::type
1460 copy(const etl::span<T1, N1>& src, const etl::span<T2, N2>& dst)
1461 {
1462 if (src.empty() || (src.begin() == dst.begin()))
1463 {
1464 return true;
1465 }
1466 if (src.size() > dst.size())
1467 {
1468 return false;
1469 }
1470 (void)etl::copy(src.begin(), src.end(), dst.begin());
1471 return true;
1472 }
1473
1474 //*************************************************************************
1476 //*************************************************************************
1477#if ETL_USING_CPP17
1478 template <typename TIterator>
1479 span(const TIterator begin_, const TIterator end_) -> span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1480
1481 template <typename TIterator, typename TSize>
1482 span(const TIterator begin_, const TSize size_) -> span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1483
1484 template <typename T, size_t Size>
1485 span(T (&)[Size]) -> span<T, Size>;
1486
1487 template <typename T, size_t Size>
1488 span(etl::array<T, Size>&) -> span<T, Size>;
1489
1490 template <typename T, size_t Size>
1491 span(const etl::array<T, Size>&) -> span<const T, Size>;
1492
1493 // Forward declaration of etl::ivector
1494 template <typename T>
1495 class ivector;
1496
1497 template <typename T>
1498 span(etl::ivector<T>&) -> span<T>;
1499
1500 template <typename T>
1501 span(const etl::ivector<T>&) -> span<const T>;
1502
1503 #if ETL_USING_STL && ETL_USING_CPP11
1504 template <typename T, size_t Size>
1505 span(std::array<T, Size>&) -> span<T, Size>;
1506
1507 template <typename T, size_t Size>
1508 span(const std::array<T, Size>&) -> span<const T, Size>;
1509 #endif
1510#endif
1511
1512 //*************************************************************************
1514 //*************************************************************************
1515#if ETL_USING_8BIT_TYPES
1516 template <typename T, size_t Extent>
1517 struct hash<etl::span<T, Extent> >
1518 {
1519 size_t operator()(const etl::span<T>& view) const
1520 {
1521 return etl::private_hash::generic_hash<size_t>(reinterpret_cast<const uint8_t*>(view.data()),
1522 reinterpret_cast<const uint8_t*>(view.data() + view.size()));
1523 }
1524 };
1525#endif
1526
1527 //*************************************************************************
1529 //*************************************************************************
1530 template <class T, size_t Size>
1531 span<const byte, (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size * sizeof(T))> as_bytes(span<T, Size> s) ETL_NOEXCEPT
1532 {
1533 return span < const byte,
1534 (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size * sizeof(T)) > (reinterpret_cast<const byte*>(s.data()), s.size_bytes());
1535 }
1536
1537 //*************************************************************************
1539 //*************************************************************************
1540 template <class T, size_t Size>
1541 span<byte, (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size * sizeof(T))> as_writable_bytes(span<T, Size> s) ETL_NOEXCEPT
1542 {
1543 ETL_STATIC_ASSERT(!etl::is_const<T>::value, "span<T> must be of non-const type");
1544 return span < byte,
1545 (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size * sizeof(T)) > (reinterpret_cast<byte*>(s.data()), s.size_bytes());
1546 }
1547} // namespace etl
1548
1549#endif
The byte class.
Definition byte.h:147
Definition iterator.h:252
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:1056
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the last count elements of this span.
Definition span.h:1243
ETL_NODISCARD etl::span< TRet > take(size_t const n)
Definition span.h:1346
span(const TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::value &&!etl::is_std_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_etl_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&has_size< TContainer >::value &&has_data< 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:890
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:985
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Returns a reference to the last element.
Definition span.h:1018
ETL_CONSTEXPR span() ETL_NOEXCEPT
Default constructor.
Definition span.h:809
ETL_CONSTEXPR span(etl::array< U, Size > &other, typename etl::enable_if< etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from etl array.
Definition span.h:932
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :etl::dynamic_extent > subspan() const
Definition span.h:1285
void advance(size_t elements) ETL_NOEXCEPT
Definition span.h:1320
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:1096
ETL_NODISCARD TRet & take()
Definition span.h:1366
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:1128
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:1305
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition span.h:1152
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:1120
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Returns a reference to the first element.
Definition span.h:1004
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:1104
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:1182
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:1064
span(TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::value &&!etl::is_std_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_etl_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&has_size< TContainer >::value &&has_data< 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:872
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:1048
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:1172
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > last() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the last COUNT elements of this span.
Definition span.h:1229
ETL_CONSTEXPR span(const TIteratorBegin begin_, const TIteratorEnd end_, typename etl::enable_if<!etl::is_integral< TIteratorEnd >::value, void >::type *=0) ETL_NOEXCEPT
Construct from iterators.
Definition span.h:829
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:1213
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:1330
ETL_CONSTEXPR span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
Construct from C array.
Definition span.h:840
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:1072
ETL_CONSTEXPR span(const etl::array< U, Size > &other, typename etl::enable_if< etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from const etl array.
Definition span.h:943
ETL_CONSTEXPR span(const TIterator begin_, size_t size_) ETL_NOEXCEPT
Construct from iterator + size.
Definition span.h:819
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:1040
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:1032
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:1112
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:1144
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:1136
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:1198
ETL_CONSTEXPR span(const etl::span< U, Size > &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:995
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:1162
Span - Fixed Extent.
Definition span.h:208
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:548
ETL_CONSTEXPR span(const etl::span< U, Size > &other, typename etl::enable_if<(Size==Extent) &&(Size !=etl::dynamic_extent), void >::type *=0) ETL_NOEXCEPT
Definition span.h:402
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:492
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:476
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:662
ETL_CONSTEXPR span(etl::array< U, Size > &other, typename etl::enable_if<(Size==Extent) &&etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from etl array.
Definition span.h:343
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:392
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :Extent - OFFSET > subspan() const
Definition span.h:712
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the last count elements of this span.
Definition span.h:674
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:532
ETL_CONSTEXPR14 span(const TIterator begin_, const size_t size_) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
Construct from iterator + size.
Definition span.h:251
ETL_CONSTEXPR14 span(const TIteratorBegin begin_, const TIteratorEnd end_, typename etl::enable_if< !etl::is_integral< TIteratorEnd >::value, void >::type *=0) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
Construct from iterators.
Definition span.h:262
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:484
ETL_CONSTEXPR span(const etl::array< U, Size > &other, typename etl::enable_if<(Size==Extent) &&etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from const etl array.
Definition span.h:353
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:572
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:556
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:500
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT
Definition span.h:633
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:564
ETL_CONSTEXPR span(typename etl::type_identity< element_type >::type(&begin_)[Array_Size], typename etl::enable_if<(Array_Size==Extent), void >::type *=0) ETL_NOEXCEPT
Construct from C array.
Definition span.h:274
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition span.h:458
ETL_CONSTEXPR span() ETL_NOEXCEPT
Definition span.h:240
span(TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::value &&!etl::is_std_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_etl_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&has_size< TContainer >::value &&has_data< 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)
Definition span.h:306
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition span.h:588
ETL_CONSTEXPR14 span(const etl::span< U, Size > &other, typename etl::enable_if<(Size==etl::dynamic_extent), void >::type *=0)
Definition span.h:413
span(const TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::value &&!etl::is_std_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_etl_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&has_size< TContainer >::value &&has_data< 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)
Definition span.h:324
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< TNew, Extent *sizeof(element_type)/sizeof(TNew)> reinterpret_as() const
Reinterpret the span as a span with different element type.
Definition span.h:757
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:646
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:468
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:597
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:617
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:607
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:540
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:736
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:580
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition span.h:448
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:508
Definition array.h:88
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition span.h:158
Definition span.h:186
Definition span.h:172
Definition span.h:200
Definition vector.h:71
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
ETL_CONSTEXPR TContainer::pointer data(TContainer &container)
Definition iterator.h:1228
ETL_CONSTEXPR TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition iterator.h:1109
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1089
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
bool is_aligned(const void *p, size_t required_alignment)
Check that 'p' has 'required_alignment'.
Definition alignment.h:91
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
span< const byte,(Size==etl::dynamic_extent) ?(etl::dynamic_extent) :(Size *sizeof(T))> as_bytes(span< T, Size > s) ETL_NOEXCEPT
Template deduction guides.
Definition span.h:1531
ETL_CONSTEXPR T * to_address(T *p) ETL_NOEXCEPT
Definition memory.h:62
span< byte,(Size==etl::dynamic_extent) ?(etl::dynamic_extent) :(Size *sizeof(T))> as_writable_bytes(span< T, Size > s) ETL_NOEXCEPT
Obtains a view to the byte representation of the elements of the span s.
Definition span.h:1541
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
ETL_CONSTEXPR span< T, Extent > make_span(T(&data)[Extent])
Definition span.h:775
Definition span.h:89
Definition span.h:131
Definition span.h:66
remove_cv
Definition type_traits.h:325
remove_reference
Definition type_traits.h:122