span.hpp
Go to the documentation of this file.
1 
2 /*
3 This is an implementation of C++20's std::span
4 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4820.pdf
5 */
6 
7 // Copyright Tristan Brindle 2018.
8 // Distributed under the Boost Software License, Version 1.0.
9 // (See accompanying file ../../LICENSE_1_0.txt or copy at
10 // https://www.boost.org/LICENSE_1_0.txt)
11 
12 #ifndef DAI_SPAN_HPP_INCLUDED
13 #define DAI_SPAN_HPP_INCLUDED
14 
15 #include <array>
16 #include <cstddef>
17 #include <cstdint>
18 #include <type_traits>
19 
20 #ifndef DAI_SPAN_NO_EXCEPTIONS
21  // Attempt to discover whether we're being compiled with exception support
22  #if !(defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND))
23  #define DAI_SPAN_NO_EXCEPTIONS
24  #endif
25 #endif
26 
27 #ifndef DAI_SPAN_NO_EXCEPTIONS
28  #include <cstdio>
29  #include <stdexcept>
30 #endif
31 
32 // Various feature test macros
33 #define DAI_SPAN_NAMESPACE_NAME dai
34 
35 #if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
36  #define DAI_SPAN_HAVE_CPP17
37 #endif
38 
39 #if __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
40  #define DAI_SPAN_HAVE_CPP14
41 #endif
42 
44 
45 // Establish default contract checking behavior
46 #if !defined(DAI_SPAN_THROW_ON_CONTRACT_VIOLATION) && !defined(DAI_SPAN_TERMINATE_ON_CONTRACT_VIOLATION) && !defined(DAI_SPAN_NO_CONTRACT_CHECKING)
47  #if defined(NDEBUG) || !defined(DAI_SPAN_HAVE_CPP14)
48  #define DAI_SPAN_NO_CONTRACT_CHECKING
49  #else
50  #define DAI_SPAN_TERMINATE_ON_CONTRACT_VIOLATION
51  #endif
52 #endif
53 
54 #if defined(DAI_SPAN_THROW_ON_CONTRACT_VIOLATION)
55 struct contract_violation_error : std::logic_error {
56  explicit contract_violation_error(const char* msg) : std::logic_error(msg) {}
57 };
58 
59 inline void contract_violation(const char* msg) {
60  throw contract_violation_error(msg);
61 }
62 
63 #elif defined(DAI_SPAN_TERMINATE_ON_CONTRACT_VIOLATION)
64 [[noreturn]] inline void contract_violation(const char* /*unused*/) {
65  std::terminate();
66 }
67 #endif
68 
69 #if !defined(DAI_SPAN_NO_CONTRACT_CHECKING)
70  #define DAI_SPAN_STRINGIFY(cond) #cond
71  #define DAI_SPAN_EXPECT(cond) cond ? (void)0 : contract_violation("Expected " DAI_SPAN_STRINGIFY(cond))
72 #else
73  #define DAI_SPAN_EXPECT(cond)
74 #endif
75 
76 #if defined(DAI_SPAN_HAVE_CPP17) || defined(__cpp_inline_variables)
77  #define DAI_SPAN_INLINE_VAR inline
78 #else
79  #define DAI_SPAN_INLINE_VAR
80 #endif
81 
82 #if defined(DAI_SPAN_HAVE_CPP14) || (defined(__cpp_constexpr) && __cpp_constexpr >= 201304)
83  #define DAI_SPAN_HAVE_CPP14_CONSTEXPR
84 #endif
85 
86 #if defined(DAI_SPAN_HAVE_CPP14_CONSTEXPR)
87  #define DAI_SPAN_CONSTEXPR14 constexpr
88 #else
89  #define DAI_SPAN_CONSTEXPR14
90 #endif
91 
92 #if defined(DAI_SPAN_HAVE_CPP14_CONSTEXPR) && (!defined(_MSC_VER) || _MSC_VER > 1900)
93  #define DAI_SPAN_CONSTEXPR_ASSIGN constexpr
94 #else
95  #define DAI_SPAN_CONSTEXPR_ASSIGN
96 #endif
97 
98 #if defined(DAI_SPAN_NO_CONTRACT_CHECKING)
99  #define DAI_SPAN_CONSTEXPR11 constexpr
100 #else
101  #define DAI_SPAN_CONSTEXPR11 DAI_SPAN_CONSTEXPR14
102 #endif
103 
104 #if defined(DAI_SPAN_HAVE_CPP17) || defined(__cpp_deduction_guides)
105  #define DAI_SPAN_HAVE_DEDUCTION_GUIDES
106 #endif
107 
108 #if defined(DAI_SPAN_HAVE_CPP17) || defined(__cpp_lib_byte)
109  #define DAI_SPAN_HAVE_STD_BYTE
110 #endif
111 
112 #if defined(DAI_SPAN_HAVE_CPP17) || defined(__cpp_lib_array_constexpr)
113  #define DAI_SPAN_HAVE_CONSTEXPR_STD_ARRAY_ETC
114 #endif
115 
116 #if defined(DAI_SPAN_HAVE_CONSTEXPR_STD_ARRAY_ETC)
117  #define DAI_SPAN_ARRAY_CONSTEXPR constexpr
118 #else
119  #define DAI_SPAN_ARRAY_CONSTEXPR
120 #endif
121 
122 #ifdef DAI_SPAN_HAVE_STD_BYTE
123 using byte = std::byte;
124 #else
125 using byte = unsigned char;
126 #endif
127 
128 #if defined(DAI_SPAN_HAVE_CPP17)
129  #define DAI_SPAN_NODISCARD [[nodiscard]]
130 #else
131  #define DAI_SPAN_NODISCARD
132 #endif
133 
134 DAI_SPAN_INLINE_VAR constexpr std::size_t dynamic_extent = SIZE_MAX;
135 
136 template <typename ElementType, std::size_t Extent = dynamic_extent>
137 class span;
138 
139 namespace detail {
140 
141 template <typename E, std::size_t S>
142 struct span_storage {
143  constexpr span_storage() noexcept = default;
144 
145  constexpr span_storage(E* p_ptr, std::size_t /*unused*/) noexcept : ptr(p_ptr) {}
146 
147  E* ptr = nullptr;
148  static constexpr std::size_t size = S;
149 };
150 
151 template <typename E>
153  constexpr span_storage() noexcept = default;
154 
155  constexpr span_storage(E* p_ptr, std::size_t p_size) noexcept : ptr(p_ptr), size(p_size) {}
156 
157  E* ptr = nullptr;
158  std::size_t size = 0;
159 };
160 
161 // Reimplementation of C++17 std::size() and std::data()
162 #if defined(DAI_SPAN_HAVE_CPP17) || defined(__cpp_lib_nonmember_container_access)
163 using std::data;
164 using std::size;
165 #else
166 template <class C>
167 constexpr auto size(const C& c) -> decltype(c.size()) {
168  return c.size();
169 }
170 
171 template <class T, std::size_t N>
172 constexpr std::size_t size(const T (&)[N]) noexcept {
173  return N;
174 }
175 
176 template <class C>
177 constexpr auto data(C& c) -> decltype(c.data()) {
178  return c.data();
179 }
180 
181 template <class C>
182 constexpr auto data(const C& c) -> decltype(c.data()) {
183  return c.data();
184 }
185 
186 template <class T, std::size_t N>
187 constexpr T* data(T (&array)[N]) noexcept {
188  return array;
189 }
190 
191 template <class E>
192 constexpr const E* data(std::initializer_list<E> il) noexcept {
193  return il.begin();
194 }
195 #endif // DAI_SPAN_HAVE_CPP17
196 
197 #if defined(DAI_SPAN_HAVE_CPP17) || defined(__cpp_lib_void_t)
198 using std::void_t;
199 #else
200 template <typename...>
201 using void_t = void;
202 #endif
203 
204 template <typename T>
206 
207 template <typename>
208 struct is_span : std::false_type {};
209 
210 template <typename T, std::size_t S>
211 struct is_span<span<T, S>> : std::true_type {};
212 
213 template <typename>
214 struct is_std_array : std::false_type {};
215 
216 template <typename T, std::size_t N>
217 struct is_std_array<std::array<T, N>> : std::true_type {};
218 
219 template <typename, typename = void>
220 struct has_size_and_data : std::false_type {};
221 
222 template <typename T>
223 struct has_size_and_data<T, void_t<decltype(detail::size(std::declval<T>())), decltype(detail::data(std::declval<T>()))>> : std::true_type {};
224 
225 template <typename C, typename U = uncvref_t<C>>
226 struct is_container {
227  static constexpr bool value = !is_span<U>::value && !is_std_array<U>::value && !std::is_array<U>::value && has_size_and_data<C>::value;
228 };
229 
230 template <typename T>
232 
233 template <typename, typename, typename = void>
234 struct is_container_element_type_compatible : std::false_type {};
235 
236 template <typename T, typename E>
238  T,
239  E,
240  typename std::enable_if<!std::is_same<typename std::remove_cv<decltype(detail::data(std::declval<T>()))>::type, void>::value
241  && std::is_convertible<remove_pointer_t<decltype(detail::data(std::declval<T>()))> (*)[], E (*)[]>::value>::type> : std::true_type {
242 };
243 
244 template <typename, typename = size_t>
245 struct is_complete : std::false_type {};
246 
247 template <typename T>
248 struct is_complete<T, decltype(sizeof(T))> : std::true_type {};
249 
250 } // namespace detail
251 
252 template <typename ElementType, std::size_t Extent>
253 class span {
254  static_assert(std::is_object<ElementType>::value,
255  "A span's ElementType must be an object type (not a "
256  "reference type or void)");
258  "A span's ElementType must be a complete type (not a forward "
259  "declaration)");
260  static_assert(!std::is_abstract<ElementType>::value, "A span's ElementType cannot be an abstract class type");
261 
263 
264  public:
265  // constants and types
266  using element_type = ElementType;
268  using size_type = std::size_t;
269  using difference_type = std::ptrdiff_t;
271  using const_pointer = const element_type*;
274  using iterator = pointer;
275  using reverse_iterator = std::reverse_iterator<iterator>;
276 
277  static constexpr size_type extent = Extent;
278 
279  // [span.cons], span constructors, copy, assignment, and destructor
280  template <std::size_t E = Extent, typename std::enable_if<(E == dynamic_extent || E <= 0), int>::type = 0>
281  constexpr span() noexcept {}
282 
283  DAI_SPAN_CONSTEXPR11 span(pointer ptr, size_type count) : storage_(ptr, count) {
284  DAI_SPAN_EXPECT(extent == dynamic_extent || count == extent);
285  }
286 
287  DAI_SPAN_CONSTEXPR11 span(pointer first_elem, pointer last_elem) : storage_(first_elem, last_elem - first_elem) {
288  DAI_SPAN_EXPECT(extent == dynamic_extent || last_elem - first_elem == static_cast<std::ptrdiff_t>(extent));
289  }
290 
291  template <std::size_t N,
292  std::size_t E = Extent,
293  typename std::enable_if<(E == dynamic_extent || N == E) && detail::is_container_element_type_compatible<element_type (&)[N], ElementType>::value,
294  int>::type = 0>
295  constexpr span(element_type (&arr)[N]) noexcept : storage_(arr, N) {}
296 
297  template <typename T,
298  std::size_t N,
299  std::size_t E = Extent,
300  typename std::enable_if<(E == dynamic_extent || N == E) && detail::is_container_element_type_compatible<std::array<T, N>&, ElementType>::value,
301  int>::type = 0>
302  DAI_SPAN_ARRAY_CONSTEXPR span(std::array<T, N>& arr) noexcept : storage_(arr.data(), N) {}
303 
304  template <
305  typename T,
306  std::size_t N,
307  std::size_t E = Extent,
308  typename std::enable_if<(E == dynamic_extent || N == E) && detail::is_container_element_type_compatible<const std::array<T, N>&, ElementType>::value,
309  int>::type = 0>
310  DAI_SPAN_ARRAY_CONSTEXPR span(const std::array<T, N>& arr) noexcept : storage_(arr.data(), N) {}
311 
312  template <typename Container,
313  std::size_t E = Extent,
314  typename std::enable_if<E == dynamic_extent && detail::is_container<Container>::value
316  int>::type = 0>
317  constexpr span(Container& cont) : storage_(detail::data(cont), detail::size(cont)) {}
318 
319  template <typename Container,
320  std::size_t E = Extent,
321  typename std::enable_if<E == dynamic_extent && detail::is_container<Container>::value
323  int>::type = 0>
324  constexpr span(const Container& cont) : storage_(detail::data(cont), detail::size(cont)) {}
325 
326  constexpr span(const span& other) noexcept = default;
327 
328  template <typename OtherElementType,
329  std::size_t OtherExtent,
330  typename std::enable_if<(Extent == dynamic_extent || OtherExtent == dynamic_extent || Extent == OtherExtent)
331  && std::is_convertible<OtherElementType (*)[], ElementType (*)[]>::value,
332  int>::type = 0>
333  constexpr span(const span<OtherElementType, OtherExtent>& other) noexcept : storage_(other.data(), other.size()) {}
334 
335  ~span() noexcept = default;
336 
337  DAI_SPAN_CONSTEXPR_ASSIGN span& operator=(const span& other) noexcept = default;
338 
339  // [span.sub], span subviews
340  template <std::size_t Count>
342  DAI_SPAN_EXPECT(Count <= size());
343  return {data(), Count};
344  }
345 
346  template <std::size_t Count>
348  DAI_SPAN_EXPECT(Count <= size());
349  return {data() + (size() - Count), Count};
350  }
351 
352  template <std::size_t Offset, std::size_t Count = dynamic_extent>
353  using subspan_return_t = span<ElementType, Count != dynamic_extent ? Count : (Extent != dynamic_extent ? Extent - Offset : dynamic_extent)>;
354 
355  template <std::size_t Offset, std::size_t Count = dynamic_extent>
357  DAI_SPAN_EXPECT(Offset <= size() && (Count == dynamic_extent || Offset + Count <= size()));
358  return {data() + Offset, Count != dynamic_extent ? Count : size() - Offset};
359  }
360 
362  DAI_SPAN_EXPECT(count <= size());
363  return {data(), count};
364  }
365 
367  DAI_SPAN_EXPECT(count <= size());
368  return {data() + (size() - count), count};
369  }
370 
372  DAI_SPAN_EXPECT(offset <= size() && (count == dynamic_extent || offset + count <= size()));
373  return {data() + offset, count == dynamic_extent ? size() - offset : count};
374  }
375 
376  // [span.obs], span observers
377  constexpr size_type size() const noexcept {
378  return storage_.size;
379  }
380 
381  constexpr size_type size_bytes() const noexcept {
382  return size() * sizeof(element_type);
383  }
384 
385  DAI_SPAN_NODISCARD constexpr bool empty() const noexcept {
386  return size() == 0;
387  }
388 
389  // [span.elem], span element access
391  DAI_SPAN_EXPECT(idx < size());
392  return *(data() + idx);
393  }
394 
397  return *data();
398  }
399 
402  return *(data() + (size() - 1));
403  }
404 
405  constexpr pointer data() const noexcept {
406  return storage_.ptr;
407  }
408 
409  // [span.iterators], span iterator support
410  constexpr iterator begin() const noexcept {
411  return data();
412  }
413 
414  constexpr iterator end() const noexcept {
415  return data() + size();
416  }
417 
419  return reverse_iterator(end());
420  }
421 
423  return reverse_iterator(begin());
424  }
425 
426  private:
428 };
429 
430 #ifdef DAI_SPAN_HAVE_DEDUCTION_GUIDES
431 
432 /* Deduction Guides */
433 template <class T, size_t N>
434 span(T (&)[N]) -> span<T, N>;
435 
436 template <class T, size_t N>
437 span(std::array<T, N>&) -> span<T, N>;
438 
439 template <class T, size_t N>
440 span(const std::array<T, N>&) -> span<const T, N>;
441 
442 template <class Container>
443 span(Container&) -> span<typename std::remove_reference<decltype(*detail::data(std::declval<Container&>()))>::type>;
444 
445 template <class Container>
446 span(const Container&) -> span<const typename Container::value_type>;
447 
448 #endif // DAI_HAVE_DEDUCTION_GUIDES
449 
450 template <typename ElementType, std::size_t Extent>
452  return s;
453 }
454 
455 template <typename T, std::size_t N>
456 constexpr span<T, N> make_span(T (&arr)[N]) noexcept {
457  return {arr};
458 }
459 
460 template <typename T, std::size_t N>
461 DAI_SPAN_ARRAY_CONSTEXPR span<T, N> make_span(std::array<T, N>& arr) noexcept {
462  return {arr};
463 }
464 
465 template <typename T, std::size_t N>
466 DAI_SPAN_ARRAY_CONSTEXPR span<const T, N> make_span(const std::array<T, N>& arr) noexcept {
467  return {arr};
468 }
469 
470 template <typename Container>
472  return {cont};
473 }
474 
475 template <typename Container>
476 constexpr span<const typename Container::value_type> make_span(const Container& cont) {
477  return {cont};
478 }
479 
480 template <typename ElementType, std::size_t Extent>
481 span<const byte, ((Extent == dynamic_extent) ? dynamic_extent : sizeof(ElementType) * Extent)> as_bytes(span<ElementType, Extent> s) noexcept {
482  return {reinterpret_cast<const byte*>(s.data()), s.size_bytes()};
483 }
484 
485 template <class ElementType, size_t Extent, typename std::enable_if<!std::is_const<ElementType>::value, int>::type = 0>
486 span<byte, ((Extent == dynamic_extent) ? dynamic_extent : sizeof(ElementType) * Extent)> as_writable_bytes(span<ElementType, Extent> s) noexcept {
487  return {reinterpret_cast<byte*>(s.data()), s.size_bytes()};
488 }
489 
490 template <std::size_t N, typename E, std::size_t S>
491 constexpr auto get(span<E, S> s) -> decltype(s[N]) {
492  return s[N];
493 }
494 
495 } // namespace DAI_SPAN_NAMESPACE_NAME
496 
497 namespace std {
498 
499 template <typename ElementType, size_t Extent>
500 class tuple_size<DAI_SPAN_NAMESPACE_NAME::span<ElementType, Extent>> : public integral_constant<size_t, Extent> {};
501 
502 template <typename ElementType>
503 class tuple_size<DAI_SPAN_NAMESPACE_NAME::span<ElementType, DAI_SPAN_NAMESPACE_NAME::dynamic_extent>>; // not defined
504 
505 template <size_t I, typename ElementType, size_t Extent>
506 class tuple_element<I, DAI_SPAN_NAMESPACE_NAME::span<ElementType, Extent>> {
507  public:
508  static_assert(Extent != DAI_SPAN_NAMESPACE_NAME::dynamic_extent && I < Extent, "");
509  using type = ElementType;
510 };
511 
512 } // end namespace std
513 
514 #endif // DAI_SPAN_HPP_INCLUDED
DAI_SPAN_NAMESPACE_NAME::detail::is_std_array
Definition: span.hpp:214
DAI_SPAN_NAMESPACE_NAME::span::storage_
storage_type storage_
Definition: span.hpp:427
DAI_SPAN_NAMESPACE_NAME::span::span
constexpr span() noexcept
Definition: span.hpp:281
DAI_SPAN_NAMESPACE_NAME::detail::is_container::value
static constexpr bool value
Definition: span.hpp:227
DAI_SPAN_NAMESPACE_NAME::get
constexpr auto get(span< E, S > s) -> decltype(s[N])
Definition: span.hpp:491
DAI_SPAN_NAMESPACE_NAME::as_writable_bytes
span< byte,((Extent==dynamic_extent) ? dynamic_extent :sizeof(ElementType) *Extent)> as_writable_bytes(span< ElementType, Extent > s) noexcept
Definition: span.hpp:486
DAI_SPAN_NAMESPACE_NAME::span::front
DAI_SPAN_CONSTEXPR11 reference front() const
Definition: span.hpp:395
DAI_SPAN_NAMESPACE_NAME::dynamic_extent
constexpr DAI_SPAN_INLINE_VAR std::size_t dynamic_extent
Definition: span.hpp:134
DAI_SPAN_NAMESPACE_NAME::span::span
constexpr span(element_type(&arr)[N]) noexcept
Definition: span.hpp:295
DAI_SPAN_NAMESPACE_NAME::span::span
constexpr span(Container &cont)
Definition: span.hpp:317
DAI_SPAN_NAMESPACE_NAME::span::size_bytes
constexpr size_type size_bytes() const noexcept
Definition: span.hpp:381
DAI_SPAN_NAMESPACE_NAME::span::data
constexpr pointer data() const noexcept
Definition: span.hpp:405
DAI_SPAN_NAMESPACE_NAME::detail::void_t
void void_t
Definition: span.hpp:201
DAI_SPAN_INLINE_VAR
#define DAI_SPAN_INLINE_VAR
Definition: span.hpp:79
DAI_SPAN_NAMESPACE_NAME::span::reference
element_type & reference
Definition: span.hpp:272
DAI_SPAN_NAMESPACE_NAME::span::difference_type
std::ptrdiff_t difference_type
Definition: span.hpp:269
DAI_SPAN_CONSTEXPR_ASSIGN
#define DAI_SPAN_CONSTEXPR_ASSIGN
Definition: span.hpp:95
DAI_SPAN_EXPECT
#define DAI_SPAN_EXPECT(cond)
Definition: span.hpp:73
DAI_SPAN_NAMESPACE_NAME::span::reverse_iterator
std::reverse_iterator< iterator > reverse_iterator
Definition: span.hpp:275
DAI_SPAN_NAMESPACE_NAME::span::extent
static constexpr size_type extent
Definition: span.hpp:277
DAI_SPAN_NAMESPACE_NAME::detail::span_storage::span_storage
constexpr span_storage(E *p_ptr, std::size_t) noexcept
Definition: span.hpp:145
DAI_SPAN_NAMESPACE_NAME::span::size_type
std::size_t size_type
Definition: span.hpp:268
DAI_SPAN_NAMESPACE_NAME::span::end
constexpr iterator end() const noexcept
Definition: span.hpp:414
DAI_SPAN_NAMESPACE_NAME::detail::remove_pointer_t
typename std::remove_pointer< T >::type remove_pointer_t
Definition: span.hpp:231
DAI_SPAN_NAMESPACE_NAME::detail::data
constexpr auto data(C &c) -> decltype(c.data())
Definition: span.hpp:177
DAI_SPAN_NAMESPACE_NAME::span::first
DAI_SPAN_CONSTEXPR11 span< element_type, Count > first() const
Definition: span.hpp:341
DAI_SPAN_NODISCARD
#define DAI_SPAN_NODISCARD
Definition: span.hpp:131
DAI_SPAN_NAMESPACE_NAME::span::span
constexpr span(const Container &cont)
Definition: span.hpp:324
DAI_SPAN_NAMESPACE_NAME::byte
unsigned char byte
Definition: span.hpp:125
DAI_SPAN_NAMESPACE_NAME::span::last
DAI_SPAN_CONSTEXPR11 span< element_type, dynamic_extent > last(size_type count) const
Definition: span.hpp:366
DAI_SPAN_NAMESPACE_NAME::detail::span_storage
Definition: span.hpp:142
DAI_SPAN_NAMESPACE_NAME::detail::uncvref_t
typename std::remove_cv< typename std::remove_reference< T >::type >::type uncvref_t
Definition: span.hpp:205
DAI_SPAN_NAMESPACE_NAME::detail::span_storage::ptr
E * ptr
Definition: span.hpp:147
DAI_SPAN_NAMESPACE_NAME::span::subspan
DAI_SPAN_CONSTEXPR11 span< element_type, dynamic_extent > subspan(size_type offset, size_type count=dynamic_extent) const
Definition: span.hpp:371
DAI_SPAN_NAMESPACE_NAME::detail::size
constexpr auto size(const C &c) -> decltype(c.size())
Definition: span.hpp:167
DAI_SPAN_NAMESPACE_NAME::span::rbegin
DAI_SPAN_ARRAY_CONSTEXPR reverse_iterator rbegin() const noexcept
Definition: span.hpp:418
DAI_SPAN_NAMESPACE_NAME::detail::span_storage< E, dynamic_extent >::span_storage
constexpr span_storage(E *p_ptr, std::size_t p_size) noexcept
Definition: span.hpp:155
DAI_SPAN_NAMESPACE_NAME::detail::span_storage::span_storage
constexpr span_storage() noexcept=default
DAI_SPAN_NAMESPACE_NAME::detail::has_size_and_data
Definition: span.hpp:220
DAI_SPAN_NAMESPACE_NAME::detail::is_container_element_type_compatible
Definition: span.hpp:234
DAI_SPAN_NAMESPACE_NAME::span::first
DAI_SPAN_CONSTEXPR11 span< element_type, dynamic_extent > first(size_type count) const
Definition: span.hpp:361
DAI_SPAN_NAMESPACE_NAME::span::~span
~span() noexcept=default
DAI_SPAN_NAMESPACE_NAME::span::subspan
DAI_SPAN_CONSTEXPR11 subspan_return_t< Offset, Count > subspan() const
Definition: span.hpp:356
DAI_SPAN_NAMESPACE_NAME
Definition: span.hpp:43
nanorpc::core::detail::pack::meta::type
type
Definition: pack_meta.h:26
DAI_SPAN_NAMESPACE_NAME::span::span
DAI_SPAN_ARRAY_CONSTEXPR span(std::array< T, N > &arr) noexcept
Definition: span.hpp:302
DAI_SPAN_NAMESPACE_NAME::span::element_type
ElementType element_type
Definition: span.hpp:266
std::tuple_element< I, DAI_SPAN_NAMESPACE_NAME::span< ElementType, Extent > >::type
ElementType type
Definition: span.hpp:509
DAI_SPAN_NAMESPACE_NAME::detail::size
constexpr std::size_t size(const T(&)[N]) noexcept
Definition: span.hpp:172
DAI_SPAN_NAMESPACE_NAME::as_bytes
span< const byte,((Extent==dynamic_extent) ? dynamic_extent :sizeof(ElementType) *Extent)> as_bytes(span< ElementType, Extent > s) noexcept
Definition: span.hpp:481
DAI_SPAN_NAMESPACE_NAME::span::size
constexpr size_type size() const noexcept
Definition: span.hpp:377
DAI_SPAN_NAMESPACE_NAME::span::operator[]
DAI_SPAN_CONSTEXPR11 reference operator[](size_type idx) const
Definition: span.hpp:390
DAI_SPAN_NAMESPACE_NAME::span::span
DAI_SPAN_ARRAY_CONSTEXPR span(const std::array< T, N > &arr) noexcept
Definition: span.hpp:310
DAI_SPAN_NAMESPACE_NAME::span::value_type
typename std::remove_cv< ElementType >::type value_type
Definition: span.hpp:267
DAI_SPAN_NAMESPACE_NAME::span::const_pointer
const element_type * const_pointer
Definition: span.hpp:271
std
Definition: Node.hpp:366
DAI_SPAN_NAMESPACE_NAME::detail::is_complete
Definition: span.hpp:245
DAI_SPAN_NAMESPACE_NAME::span::empty
constexpr DAI_SPAN_NODISCARD bool empty() const noexcept
Definition: span.hpp:385
DAI_SPAN_NAMESPACE_NAME::span::rend
DAI_SPAN_ARRAY_CONSTEXPR reverse_iterator rend() const noexcept
Definition: span.hpp:422
DAI_SPAN_NAMESPACE_NAME::span::span
constexpr span(const span< OtherElementType, OtherExtent > &other) noexcept
Definition: span.hpp:333
DAI_SPAN_NAMESPACE_NAME::span::last
DAI_SPAN_CONSTEXPR11 span< element_type, Count > last() const
Definition: span.hpp:347
DAI_SPAN_ARRAY_CONSTEXPR
#define DAI_SPAN_ARRAY_CONSTEXPR
Definition: span.hpp:119
DAI_SPAN_NAMESPACE_NAME::detail::is_container
Definition: span.hpp:226
DAI_SPAN_NAMESPACE_NAME::span::const_reference
const element_type & const_reference
Definition: span.hpp:273
DAI_SPAN_NAMESPACE_NAME::span
Definition: span.hpp:137
DAI_SPAN_CONSTEXPR11
#define DAI_SPAN_CONSTEXPR11
Definition: span.hpp:99
DAI_SPAN_NAMESPACE_NAME::span::iterator
pointer iterator
Definition: span.hpp:274
DAI_SPAN_NAMESPACE_NAME::make_span
constexpr span< ElementType, Extent > make_span(span< ElementType, Extent > s) noexcept
Definition: span.hpp:451
DAI_SPAN_NAMESPACE_NAME::span::back
DAI_SPAN_CONSTEXPR11 reference back() const
Definition: span.hpp:400
DAI_SPAN_NAMESPACE_NAME::detail::span_storage::size
static constexpr std::size_t size
Definition: span.hpp:148
DAI_SPAN_NAMESPACE_NAME::span::begin
constexpr iterator begin() const noexcept
Definition: span.hpp:410
DAI_SPAN_NAMESPACE_NAME::detail::data
constexpr const E * data(std::initializer_list< E > il) noexcept
Definition: span.hpp:192
DAI_SPAN_NAMESPACE_NAME::span::pointer
element_type * pointer
Definition: span.hpp:270
DAI_SPAN_NAMESPACE_NAME::detail::is_span
Definition: span.hpp:208


depthai
Author(s): Martin Peterlin
autogenerated on Sat Mar 22 2025 02:58:19