95class Span :
private detail::NumBase<Extent>
97 using Base = detail::NumBase<Extent>;
100 static constexpr auto extent = Extent;
102 template <
size_t e = extent, std::enable_if_t<e == 0 || e == dynamicExtent,
int> = 0>
105 template <
typename It>
106 constexpr Span (It it,
size_t end)
107 : Base (end), ptr (detail::toAddress (it)) {}
109 template <
typename Range, std::enable_if_t<detail::hasDataAndSize<Range>,
int> = 0>
111 : Base (std::size (range)), ptr (std::data (range)) {}
113 constexpr Span (
const Span&) =
default;
115 constexpr Span& operator= (
const Span&) =
default;
117 constexpr Span (
Span&&)
noexcept =
default;
119 constexpr Span& operator= (
Span&&)
noexcept =
default;
123 constexpr Value* begin()
const {
return ptr; }
124 constexpr Value* end()
const {
return ptr + size(); }
126 constexpr auto& front()
const {
return ptr[0]; }
127 constexpr auto& back()
const {
return ptr[size() - 1]; }
129 constexpr auto& operator[] (
size_t index)
const {
return ptr[index]; }
130 constexpr Value* data()
const {
return ptr; }
132 constexpr bool empty()
const {
return size() == 0; }
135 Value* ptr =
nullptr;