44template <
typename ElementType, std::
size_t Extent = dynamic_extent>
49template <
typename E, std::
size_t S>
51 constexpr span_storage() noexcept = default;
53 constexpr span_storage(E* pointer, std::
size_t ) noexcept : ptr(pointer)
57 static constexpr std::size_t size = S;
62 constexpr span_storage() noexcept = default;
64 constexpr span_storage(E* pointer, std::
size_t sz) noexcept
65 : ptr(pointer), size(sz)
73constexpr auto size(
const C&
c) ->
decltype(
c.size())
78template <
class T, std::
size_t N>
79constexpr std::size_t size(
const T (&)[
N])
noexcept
85constexpr auto data(
C&
c) ->
decltype(
c.data())
91constexpr auto data(
const C&
c) ->
decltype(
c.data())
96template <
class T, std::
size_t N>
97constexpr T* data(
T (&
array)[
N])
noexcept
103constexpr const E* data(std::initializer_list<E>
il)
noexcept
109struct is_span : std::false_type {};
111template <
typename T, std::
size_t S>
112struct is_span<span<
T,
S>> : std::true_type {};
117template <
typename T, std::
size_t N>
120template <
typename,
typename =
void>
125 decltype(detail::data(std::declval<T>()))>>
128template <
typename C,
typename U = remove_cvref_t<C>>
130 static constexpr bool value =
131 !is_span<U>::value && !is_std_array<U>::value &&
132 !std::is_array<U>::value && has_size_and_data<C>::value;
138template <
typename,
typename,
typename =
void>
141template <
typename T,
typename E>
143 T,
E, std::
void_t<decltype(detail::data(std::declval<T>()))>>
144 : std::is_convertible<
145 remove_pointer_t<decltype(detail::data(std::declval<T>()))> (*)[],
148template <
typename,
typename =
size_t>
149struct is_complete : std::false_type {};
166template <
typename ElementType, std::
size_t Extent>
168 static_assert(std::is_object<ElementType>::value,
169 "A span's ElementType must be an object type (not a "
170 "reference type or void)");
171 static_assert(detail::is_complete<ElementType>::value,
172 "A span's ElementType must be a complete type (not a forward "
174 static_assert(!std::is_abstract<ElementType>::value,
175 "A span's ElementType cannot be an abstract class type");
177 using storage_type = detail::span_storage<ElementType, Extent>;
182 using value_type =
typename std::remove_cv<ElementType>::type;
200 typename std::enable_if<(
E ==
dynamic_extent || E <= 0), int>::type = 0>
215 template <std::size_t
N, std::size_t
E =
Extent,
216 typename std::enable_if<
218 detail::is_container_element_type_compatible<
225 template <std::size_t
N, std::size_t
E =
Extent,
226 typename std::enable_if<
228 detail::is_container_element_type_compatible<
232 : storage_(
arr.data(),
N)
236 template <std::size_t
N, std::size_t
E =
Extent,
237 typename std::enable_if<
239 detail::is_container_element_type_compatible<
243 : storage_(
arr.data(),
N)
249 typename std::enable_if<
251 detail::is_container_element_type_compatible<
261 typename std::enable_if<
263 detail::is_container_element_type_compatible<
275 typename std::enable_if<
300 template <std::
size_t Count>
307 template <std::
size_t Offset, std::
size_t Count = dynamic_extent>
315 template <std::
size_t Offset, std::
size_t Count = dynamic_extent>
426 storage_type storage_{};
435template <
typename T, std::
size_t X,
typename U, std::
size_t Y>
438 if (
lhs.size() !=
rhs.size()) {
442 for (std::size_t
i = 0;
i <
lhs.size();
i++) {
451template <
typename T, std::
size_t X,
typename U, std::
size_t Y>
457template <
typename T, std::
size_t X,
typename U, std::
size_t Y>
461 const std::size_t size =
lhs.size() <
rhs.size() ?
lhs.size() :
rhs.size();
463 for (std::size_t
i = 0;
i < size;
i++) {
471 return lhs.size() <
rhs.size();
474template <
typename T, std::
size_t X,
typename U, std::
size_t Y>
480template <
typename T, std::
size_t X,
typename U, std::
size_t Y>
486template <
typename T, std::
size_t X,
typename U, std::
size_t Y>
502template <
typename ElementType, std::
size_t Extent>
507 return {
reinterpret_cast<const unsigned char *
>(
s.data()),
s.size_bytes()};
520 typename std::enable_if<!std::is_const<ElementType>::value,
int>::type = 0>
525 return {
reinterpret_cast<unsigned char *
>(
s.data()),
s.size_bytes()};
536template <std::
size_t N,
typename E, std::
size_t S>
549template <
typename ElementType,
size_t Extent>
550class tuple_size<
gul17::span<ElementType, Extent>>
551 :
public integral_constant<size_t, Extent> {};
553template <
typename ElementType>
554class tuple_size<
gul17::span<ElementType, gul17::dynamic_extent>>;
556template <size_t I, typename ElementType, size_t Extent>
557class tuple_element<I, gul17::span<ElementType, Extent>> {
560 using type = ElementType;
A view to a contiguous sequence of objects.
Definition span.h:167
constexpr reference front() const
See std::span.
Definition span.h:368
constexpr span(pointer first_elem, pointer last_elem)
See std::span.
Definition span.h:210
static constexpr index_type extent
See std::span.
Definition span.h:194
const_reverse_iterator crend() const noexcept
See std::span.
Definition span.h:414
const_reverse_iterator crbegin() const noexcept
See std::span.
Definition span.h:408
constexpr span(const span< OtherElementType, OtherExtent > &other) noexcept
See std::span.
Definition span.h:280
constexpr iterator begin() const noexcept
See std::span.
Definition span.h:384
constexpr span() noexcept
See std::span.
Definition span.h:201
constexpr span< element_type, dynamic_extent > first(index_type count) const
See std::span.
Definition span.h:324
constexpr span(const span &other) noexcept=default
See std::span.
constexpr pointer data() const noexcept
See std::span.
Definition span.h:380
constexpr span(element_type(&arr)[N]) noexcept
See std::span.
Definition span.h:221
reverse_iterator rbegin() const noexcept
See std::span.
Definition span.h:396
constexpr const_iterator cend() const noexcept
See std::span.
Definition span.h:393
reverse_iterator rend() const noexcept
See std::span.
Definition span.h:402
std::reverse_iterator< iterator > reverse_iterator
See std::span.
Definition span.h:190
pointer iterator
See std::span.
Definition span.h:188
constexpr subspan_return_t< Offset, Count > subspan() const
See std::span.
Definition span.h:316
constexpr index_type size() const noexcept
See std::span.
Definition span.h:346
constexpr index_type size_bytes() const noexcept
See std::span.
Definition span.h:349
friend constexpr iterator end(span s) noexcept
See std::span.
Definition span.h:423
std::reverse_iterator< const_iterator > const_reverse_iterator
See std::span.
Definition span.h:191
const element_type * const_pointer
See std::span.
Definition span.h:186
std::size_t index_type
See std::span.
Definition span.h:183
constexpr span(const Container &cont)
See std::span.
Definition span.h:266
ElementType element_type
See std::span.
Definition span.h:181
constexpr span< element_type, Count > first() const
See std::span.
Definition span.h:294
const_pointer const_iterator
See std::span.
Definition span.h:189
constexpr span(Container &cont)
See std::span.
Definition span.h:254
constexpr reference operator[](index_type idx) const
See std::span.
Definition span.h:362
friend constexpr iterator begin(span s) noexcept
See std::span.
Definition span.h:420
constexpr const_iterator cbegin() const noexcept
See std::span.
Definition span.h:390
element_type & reference
See std::span.
Definition span.h:187
typename std::remove_cv< ElementType >::type value_type
See std::span.
Definition span.h:182
std::ptrdiff_t difference_type
See std::span.
Definition span.h:184
constexpr iterator end() const noexcept
See std::span.
Definition span.h:387
constexpr span< element_type, dynamic_extent > subspan(index_type offset, index_type count=dynamic_extent) const
See std::span.
Definition span.h:338
~span() noexcept=default
See std::span.
constexpr span(pointer ptr, index_type count)
See std::span.
Definition span.h:205
element_type * pointer
See std::span.
Definition span.h:185
span(const std::array< value_type, N > &arr) noexcept
See std::span.
Definition span.h:242
span(std::array< value_type, N > &arr) noexcept
See std::span.
Definition span.h:231
constexpr span< element_type, Count > last() const
See std::span.
Definition span.h:301
constexpr reference back() const
See std::span.
Definition span.h:374
constexpr bool empty() const noexcept
See std::span.
Definition span.h:355
constexpr span< element_type, dynamic_extent > last(index_type count) const
See std::span.
Definition span.h:331
auto constexpr bit_set(unsigned bit) noexcept -> ReturnT
Set a bit in an integral type.
Definition bit_manip.h:121
span< unsigned char,((Extent==dynamic_extent) ? dynamic_extent :sizeof(ElementType) *Extent)> as_writable_bytes(span< ElementType, Extent > s) noexcept
Return a writable view to the byte representation of the elements of a given span.
Definition span.h:523
span< const unsigned char,((Extent==dynamic_extent) ? dynamic_extent :sizeof(ElementType) *Extent)> as_bytes(span< ElementType, Extent > s) noexcept
Return a constant view to the byte representation of the elements of a given span.
Definition span.h:505
constexpr auto get(span< E, S > s) -> decltype(s[N])
Return a reference to the Nth element of a given span.
Definition span.h:537
Namespace gul17 contains all functions and classes of the General Utility Library.
Definition doxygen.h:26
Some metaprogramming traits for the General Utility Library.