6#include <initializer_list>
33 using EnableIfHasSizeAndData =
34 typename std::enable_if_t<detail::HasSize<C>::value && detail::HasData<C>::value>;
52 constexpr Span() noexcept = default;
61 template <
typename Container,
typename = EnableIfHasSizeAndData<Container>>
62 constexpr Span(Container& container)
noexcept
63 :
Span(std::data(container), std::size(container)) {}
68 template <
typename Container,
typename = EnableIfHasSizeAndData<Container>>
69 constexpr Span(
const Container& container)
noexcept
70 :
Span(std::data(container), std::size(container)) {}
85 constexpr Span(std::initializer_list<value_type> values) noexcept
86 :
Span(values.begin(), values.size()) {}
89 std::swap(data_, other.data_);
90 std::swap(size_, other.size_);
93 [[nodiscard]]
constexpr size_t size() const noexcept {
97 [[nodiscard]]
constexpr bool empty() const noexcept {
107 assert(index <
size());
108 return data()[index];
114 if (index >=
size()) {
115 throw std::out_of_range(
116 std::string(
"index (") + std::to_string(index) +
") >= size() (" +
117 std::to_string(
size()) +
")"
120 return data()[index];
167 size_t offset,
size_t count = (std::numeric_limits<std::size_t>::max)()
169 if (offset >=
size()) {
172 if (count >
size() - offset) {
173 count =
size() - offset;
175 return {
data() + offset, count};
179 [[nodiscard]]
constexpr Span first(
size_t count)
const noexcept {
180 if (count >=
size()) {
183 return {
data(), count};
187 [[nodiscard]]
constexpr Span last(
size_t count)
const noexcept {
188 if (count >=
size()) {
191 return {
data() + (
size() - count), count};
202template <
typename Container>
206template <
typename Container>
214struct IsSpan : std::false_type {};
217struct IsSpan<
Span<T>> : std::true_type {};
225template <
typename T,
typename U>
226using EnableIfEqualityComparable =
typename std::enable_if_t<
227 std::is_invocable_v<std::equal_to<>,
const T&,
const U&> &&
228 std::is_invocable_v<std::not_equal_to<>,
const T&,
const U&>>;
233template <
typename T,
typename U,
typename = detail::EnableIfEqualityComparable<T, U>>
239template <
typename T,
typename U,
typename = detail::EnableIfEqualityComparable<T, U>>
241 return !(lhs == rhs);
View to a contiguous sequence of objects, similar to std::span in C++20.
constexpr const_reverse_iterator crend() const noexcept
std::remove_cv_t< T > value_type
const T & const_reference
constexpr Span last(size_t count) const noexcept
Obtain a view over the last count elements of this Span.
constexpr reverse_iterator rend() const noexcept
constexpr reference operator[](size_t index) const noexcept
Access element by index.
constexpr reference at(size_t index) const
Access element by index with bounds checking.
constexpr const_iterator cbegin() const noexcept
constexpr iterator begin() const noexcept
constexpr Span() noexcept=default
constexpr bool operator==(Span< T > lhs, Span< U > rhs)
constexpr Span(std::initializer_list< value_type > values) noexcept
Implicit constructor from an initializer list.
constexpr bool empty() const noexcept
constexpr bool operator!=(Span< T > lhs, Span< U > rhs)
constexpr void swap(Span &other) noexcept
constexpr Span subview(size_t offset, size_t count=(std::numeric_limits< std::size_t >::max)()) const noexcept
Obtain a view over count elements of this Span starting at offset offset.
std::reverse_iterator< const_iterator > const_reverse_iterator
constexpr const_reverse_iterator crbegin() const noexcept
constexpr size_t size() const noexcept
Span(Container &) -> Span< typename Container::value_type >
constexpr reference front() const noexcept
constexpr Span(Container &container) noexcept
Implicit constructor from a container like std::array or std::vector.
std::reverse_iterator< iterator > reverse_iterator
Span(const Container &) -> Span< const typename Container::value_type >
constexpr reverse_iterator rbegin() const noexcept
constexpr reference back() const noexcept
const_pointer const_iterator
std::ptrdiff_t difference_type
constexpr iterator end() const noexcept
constexpr const_iterator cend() const noexcept
constexpr pointer data() const noexcept
constexpr Span(const Container &container) noexcept
Implicit constructor from a container like std::array or std::vector (const).
constexpr Span first(size_t count) const noexcept
Obtain a view over the first count elements of this Span.