32 template <
typename T,
size_t Extent = std::dynamic_extent>
33 using span = std::span<T, Extent>;
44 template <
typename T,
size_t Extent = size_t(-1)>
66 constexpr span() noexcept : data_(
nullptr), size_(0)
68 static_assert(Extent == dynamic_extent || Extent == 0,
69 "Default-constructed span must have dynamic extent or zero extent");
74 static_assert(Extent == dynamic_extent || Extent == count,
75 "Size mismatch in span construction");
80 static_assert(Extent == dynamic_extent || Extent ==
size_,
81 "Size mismatch in span construction");
86 constexpr span(std::array<value_type, N>& arr) noexcept
89 static_assert(Extent == dynamic_extent || Extent == N,
90 "Size mismatch in span construction from array");
94 constexpr span(
const std::array<value_type, N>& arr) noexcept
97 static_assert(Extent == dynamic_extent || Extent == N,
98 "Size mismatch in span construction from const array");
102 template <
typename Allocator>
103 constexpr span(std::vector<value_type, Allocator>& vec) noexcept
106 static_assert(Extent == dynamic_extent || Extent == 0,
107 "Non-dynamic extent not supported for std::vector constructor");
110 template <
typename Allocator>
111 constexpr span(
const std::vector<value_type, Allocator>& vec) noexcept
114 static_assert(Extent == dynamic_extent || Extent == 0,
115 "Non-dynamic extent not supported for std::vector constructor");
123 static_assert(Extent == dynamic_extent || Extent == N,
124 "Size mismatch in span construction from array");
133 [[nodiscard]]
constexpr bool empty() const noexcept {
return size_ == 0; }
164 template<
size_t Count>
175 template<
size_t Count>
186 template<
size_t Offset,
size_t Count = dynamic_extent>
187 [[nodiscard]]
constexpr auto subspan() const noexcept
189 constexpr size_t new_extent = Count != dynamic_extent ? Count :
190 (Extent != dynamic_extent ? Extent - Offset : dynamic_extent);
193 Count != dynamic_extent ? Count : (
size_ - Offset));
199 size_type new_count = count == dynamic_extent ?
size_ - offset : count;
209 template <
class T,
size_t N>
210 span(T (&)[N]) -> span<T, N>;
212 template <
class T,
size_t N>
213 span(std::array<T, N>&) -> span<T, N>;
215 template <
class T,
size_t N>
216 span(
const std::array<T, N>&) -> span<const T, N>;
218 template <
class Container>
219 span(Container&) -> span<typename Container::value_type>;
221 template <
class Container>
222 span(
const Container&) -> span<const typename Container::value_type>;
A fallback span implementation for C++17 and earlier compilers.
constexpr span(const std::array< value_type, N > &arr) noexcept
const_pointer const_iterator
ptrdiff_t difference_type
constexpr span & operator=(const span &other) noexcept=default
constexpr auto subspan() const noexcept
constexpr span(pointer first, pointer last) noexcept
static constexpr size_t dynamic_extent
constexpr reference front() const noexcept
constexpr span< element_type, dynamic_extent > subspan(size_type offset, size_type count=dynamic_extent) const noexcept
constexpr span< element_type, dynamic_extent > last(size_type count) const noexcept
constexpr iterator begin() const noexcept
constexpr span< element_type, Count > last() const noexcept
constexpr bool empty() const noexcept
constexpr pointer data() const noexcept
constexpr const_iterator cbegin() const noexcept
constexpr size_type size() const noexcept
constexpr span(std::vector< value_type, Allocator > &vec) noexcept
std::remove_cv_t< T > value_type
constexpr const_iterator cend() const noexcept
constexpr reverse_iterator rend() const noexcept
constexpr const_reverse_iterator crbegin() const noexcept
const T & const_reference
constexpr reference operator[](size_type idx) const noexcept
constexpr reverse_iterator rbegin() const noexcept
std::reverse_iterator< iterator > reverse_iterator
constexpr span< element_type, dynamic_extent > first(size_type count) const noexcept
constexpr const_reverse_iterator crend() const noexcept
constexpr span(std::array< value_type, N > &arr) noexcept
constexpr iterator end() const noexcept
constexpr reference back() const noexcept
constexpr span(const std::vector< value_type, Allocator > &vec) noexcept
constexpr span() noexcept
constexpr span(pointer ptr, size_type count) noexcept
constexpr span(element_type(&arr)[N]) noexcept
constexpr span< element_type, Count > first() const noexcept
std::reverse_iterator< const_iterator > const_reverse_iterator
constexpr size_type size_bytes() const noexcept
span(T(&)[N]) -> span< T, N >