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()) {}
121 template <
typename Container>
122 constexpr Span(Container& cont) noexcept
123 : storage_(cont.data(), cont.size()) {}
125 template <
typename Container>
126 constexpr Span(
const Container& cont) noexcept
127 : storage_(cont.data(), cont.size()) {}
131 constexpr reference operator[](index_type idx)
const noexcept {
135 constexpr reference front()
const noexcept {
139 constexpr reference back()
const noexcept {
140 return data()[size() - 1];
143 constexpr pointer data()
const noexcept {
144 return storage_.data_;
148 constexpr iterator begin()
const noexcept {
152 constexpr iterator end()
const noexcept {
153 return data() + size();
156 constexpr const_iterator cbegin()
const noexcept {
160 constexpr const_iterator cend()
const noexcept {
161 return data() + size();
164 constexpr reverse_iterator rbegin()
const noexcept {
165 return reverse_iterator(end());
168 constexpr reverse_iterator rend()
const noexcept {
169 return reverse_iterator(begin());
172 constexpr const_reverse_iterator crbegin()
const noexcept {
173 return const_reverse_iterator(cend());
176 constexpr const_reverse_iterator crend()
const noexcept {
177 return const_reverse_iterator(cbegin());
181 constexpr bool empty()
const noexcept {
185 constexpr index_type size()
const noexcept {
186 return storage_.size_;
189 constexpr index_type size_bytes()
const noexcept {
190 return size() *
sizeof(element_type);
194 A_CONSTEXPR_CXX14
Span subspan(index_type offset, index_type count =
static_cast<index_type
>(-1))
const noexcept {
195 if (count ==
static_cast<index_type
>(-1)) {
196 count = size() - offset;
198 return Span(data() + offset, count);
201 constexpr Span first(index_type count)
const noexcept {
202 return Span(data(), count);
205 constexpr Span last(index_type count)
const noexcept {
206 return Span(data() + size() - count, count);