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.