33 using value_type = std::remove_cv_t<T>;
35 constexpr span()
noexcept : span(
nullptr,
nullptr) {}
37 constexpr span(T* begin, T* end)
noexcept : begin_(begin), end_(end) {
40 std::is_constant_evaluated() || (begin !=
nullptr && end !=
nullptr && begin <= end) ||
41 (begin ==
nullptr && end ==
nullptr)
45 constexpr span(T* begin, std::size_t size)
noexcept : begin_(begin), end_(begin + size) {
47 UASSERT(std::is_constant_evaluated() || begin !=
nullptr || size == 0);
50#if defined(__GNUC__
) && !defined(__clang__
)
52#pragma GCC diagnostic push
53#pragma GCC diagnostic ignored "-Winit-list-lifetime"
56 template <
typename Void =
void,
typename = std::enable_if_t<std::is_const_v<T> && std::is_void_v<Void>>>
57 constexpr span(std::initializer_list<value_type> il)
61#if defined(__GNUC__
) && !defined(__clang__
)
63#pragma GCC diagnostic pop
69 typename = std::enable_if_t<
71 (std::is_lvalue_reference_v<Container> || std::is_const_v<T>)&&
73 !std::is_same_v<std::remove_cv_t<std::remove_reference_t<Container>>, span> &&
75 std::is_convertible_v<
decltype(std::data(std::declval<Container&>())), T*>>>
77 constexpr span(Container&& cont)
noexcept : span(std::data(cont), std::size(cont)) {}
79 template <std::size_t Size>
80 constexpr span(impl::TypeIdentity<T> (&array)[Size])
noexcept
81 : span(std::data(array), std::size(array)) {}
83 constexpr T* begin()
const noexcept {
return begin_; }
84 constexpr T* end()
const noexcept {
return end_; }
86 constexpr T* data()
const noexcept {
return begin_; }
87 constexpr std::size_t size()
const noexcept {
return end_ - begin_; }
88 constexpr bool empty()
const noexcept {
return size() == 0; }
90 constexpr span<T> first(std::size_t count)
const noexcept {
92 return span{begin_, begin_ + count};
95 constexpr span<T> last(std::size_t count)
const noexcept {
97 return span{end_ - count, end_};
100 constexpr span<T> subspan(std::size_t offset)
const noexcept {
102 return span{begin_ + offset, end_};
105 constexpr span<T> subspan(
109 UASSERT(offset + count <= size());
110 return span{begin_ + offset, begin_ + offset + count};
113 constexpr T& operator[](std::size_t index)
const noexcept {
115 return begin_[index];