72 using element_type = T;
73 using value_type =
typename std::remove_cv<T>::type;
74 using index_type = std::size_t;
75 using difference_type = std::ptrdiff_t;
78 using const_pointer =
const T*;
79 using const_reference =
const T&;
80 using iterator = pointer;
81 using const_iterator = const_pointer;
82 using reverse_iterator = std::reverse_iterator<iterator>;
83 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
85 static constexpr std::ptrdiff_t extent = Extent;
88 constexpr Span() noexcept
89 : storage_(
nullptr, 0)
92 constexpr Span(std::initializer_list<T> init) noexcept
93 : storage_(init.begin(), init.size()) {}
95 constexpr Span(pointer ptr, index_type count) noexcept
96 : storage_(ptr, count) {}
98 constexpr Span(pointer first, pointer last) noexcept
99 : storage_(first, last - first) {}
101 template <std::
size_t N>
102 constexpr Span(element_type (&arr)[
N]) noexcept
103 : storage_(arr,
N) {}
105 template <
typename U, std::
size_t N>
106 constexpr Span(std::array<U, N>& arr) noexcept
107 : storage_(arr.data(),
N) {}
109 template <
typename U, std::
size_t N>
110 constexpr Span(
const std::array<U, N>& arr) noexcept
111 : storage_(arr.data(),
N) {}
114 template <
typename Container>
115 constexpr Span(Container& cont) noexcept
116 : storage_(cont.data(), cont.size()) {}
118 template <
typename Container>
119 constexpr Span(
const Container& cont) noexcept
120 : storage_(cont.data(), cont.size()) {}
124 constexpr reference operator[](index_type idx)
const noexcept {
128 constexpr reference front()
const noexcept {
132 constexpr reference back()
const noexcept {
133 return data()[size() - 1];
136 constexpr pointer data()
const noexcept {
137 return storage_.data_;
141 constexpr iterator begin()
const noexcept {
145 constexpr iterator end()
const noexcept {
146 return data() + size();
149 constexpr const_iterator cbegin()
const noexcept {
153 constexpr const_iterator cend()
const noexcept {
154 return data() + size();
157 constexpr reverse_iterator rbegin()
const noexcept {
158 return reverse_iterator(end());
161 constexpr reverse_iterator rend()
const noexcept {
162 return reverse_iterator(begin());
165 constexpr const_reverse_iterator crbegin()
const noexcept {
166 return const_reverse_iterator(cend());
169 constexpr const_reverse_iterator crend()
const noexcept {
170 return const_reverse_iterator(cbegin());
174 constexpr bool empty()
const noexcept {
178 constexpr index_type size()
const noexcept {
179 return storage_.size_;
182 constexpr index_type size_bytes()
const noexcept {
183 return size() *
sizeof(element_type);
187 A_CONSTEXPR_CXX14
Span subspan(index_type offset, index_type count =
static_cast<index_type
>(-1))
const noexcept {
188 if (count ==
static_cast<index_type
>(-1)) {
189 count = size() - offset;
191 return Span(data() + offset, count);
194 constexpr Span first(index_type count)
const noexcept {
195 return Span(data(), count);
198 constexpr Span last(index_type count)
const noexcept {
199 return Span(data() + size() - count, count);