32 template <
typename,
typename =
void>
33 constexpr auto hasToAddress =
false;
38 template <
typename,
typename =
void>
39 constexpr auto hasDataAndSize =
false;
42 constexpr auto hasDataAndSize<T,
44 decltype (
std::size (std::declval<T>()))>> =
true;
46 template <
size_t Extent>
51 constexpr explicit NumBase (
size_t) {}
53 constexpr size_t size()
const {
return Extent; }
64 constexpr size_t size()
const {
return num; }
70 constexpr T* toAddress (T* p)
75 template <
typename It>
76 constexpr auto toAddress (
const It&
it)
78 if constexpr (detail::hasToAddress<It>)
81 return toAddress (
it.operator->());
94template <
typename Value,
size_t Extent = dynamicExtent>
100 static constexpr auto extent =
Extent;
102 template <
size_t e = extent, std::enable_if_t<e == 0 || e == dynamicExtent,
int> = 0>
105 template <
typename It>
107 :
Base (end), ptr (detail::toAddress (
it)) {}
109 template <
typename Range, std::enable_if_t<detail::hasDataAndSize<Range>,
int> = 0>
113 constexpr Span (
const Span&) =
default;
115 constexpr Span& operator= (
const Span&) =
default;
117 constexpr Span (
Span&&)
noexcept =
default;
119 constexpr Span& operator= (
Span&&)
noexcept =
default;
123 constexpr Value* begin()
const {
return ptr; }
124 constexpr Value* end()
const {
return ptr + size(); }
126 constexpr auto& front()
const {
return ptr[0]; }
127 constexpr auto& back()
const {
return ptr[size() - 1]; }
129 constexpr auto& operator[] (
size_t index)
const {
return ptr[index]; }
130 constexpr Value* data()
const {
return ptr; }
132 constexpr bool empty()
const {
return size() == 0; }
135 Value* ptr =
nullptr;
138template <
typename T,
typename End>
141template <
typename T,
size_t N>
144template <
typename T,
size_t N>
147template <
typename T,
size_t N>
150template <
typename Range>
A general-purpose range object, that simply represents any linear range with a start and end point.
A non-owning view over contiguous objects stored in an Array or vector or other similar container.
Represents a shared variant value.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...