73 using element_type =
T;
74 using value_type =
typename std::remove_cv<T>::type;
75 using index_type = std::size_t;
76 using difference_type = std::ptrdiff_t;
79 using const_pointer =
const T*;
80 using const_reference =
const T&;
81 using iterator = pointer;
82 using const_iterator = const_pointer;
83 using reverse_iterator = std::reverse_iterator<iterator>;
84 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
86 static constexpr std::ptrdiff_t extent = Extent;
89 constexpr Span() noexcept
90 : storage_(
nullptr, 0)
93 constexpr Span(std::initializer_list<T> init) noexcept
94 : storage_(init.begin(), init.size()) {}
96 constexpr Span(pointer ptr, index_type count) noexcept
97 : storage_(ptr, count) {}
99 constexpr Span(pointer first, pointer last) noexcept
100 : storage_(first, last - first) {}
102 template <std::
size_t N>
105 Span(element_type (&arr)[
N]) noexcept
106 : storage_(arr,
N) {}
108 template <
typename U, std::
size_t N>
109 constexpr explicit Span(std::array<U, N>& arr) noexcept
110 : storage_(arr.data(),
N) {}
112 template <
typename U, std::
size_t N>
113 constexpr explicit Span(
const std::array<U, N>& arr) noexcept
114 : storage_(arr.data(),
N) {}
116 template <
typename U>
117 constexpr explicit Span(
const std::vector<U>& span) noexcept
118 : storage_(span.data(), span.size()) {}
120 template <
typename U>
121 constexpr explicit Span(std::vector<U>& span) noexcept
122 : storage_(span.data(), span.size()) {}
125 template <
typename Container>
126 constexpr Span(Container& cont) noexcept
127 : storage_(cont.data(), cont.size()) {}
129 template <
typename Container>
130 constexpr Span(
const Container& cont) noexcept
131 : storage_(cont.data(), cont.size()) {}
135 constexpr reference operator[](index_type idx)
const noexcept {
139 constexpr reference front()
const noexcept {
143 constexpr reference back()
const noexcept {
144 return data()[size() - 1];
147 constexpr pointer data()
const noexcept {
148 return storage_.data_;
152 constexpr iterator begin()
const noexcept {
156 constexpr iterator end()
const noexcept {
157 return data() + size();
160 constexpr const_iterator cbegin()
const noexcept {
164 constexpr const_iterator cend()
const noexcept {
165 return data() + size();
168 constexpr reverse_iterator rbegin()
const noexcept {
169 return reverse_iterator(end());
172 constexpr reverse_iterator rend()
const noexcept {
173 return reverse_iterator(begin());
176 constexpr const_reverse_iterator crbegin()
const noexcept {
177 return const_reverse_iterator(cend());
180 constexpr const_reverse_iterator crend()
const noexcept {
181 return const_reverse_iterator(cbegin());
185 constexpr bool empty()
const noexcept {
189 constexpr index_type size()
const noexcept {
190 return storage_.size_;
193 constexpr index_type size_bytes()
const noexcept {
194 return size() *
sizeof(element_type);
198 A_CONSTEXPR_CXX14
Span subspan(index_type offset, index_type count =
static_cast<index_type
>(-1))
const noexcept {
199 if (count ==
static_cast<index_type
>(-1)) {
200 count = size() - offset;
202 return Span(data() + offset, count);
205 constexpr Span first(index_type count)
const noexcept {
206 return Span(data(), count);
209 constexpr Span last(index_type count)
const noexcept {
210 return Span(data() + size() - count, count);