9#include <dr/detail/ranges_shim.hpp>
13template <
typename T, rng::random_access_iterator Iter = T *>
14class span :
public rng::view_interface<dr::sp::span<T, Iter>> {
16 static_assert(std::is_same_v<std::iter_value_t<Iter>, T>);
18 using value_type = std::iter_value_t<Iter>;
19 using size_type = std::size_t;
20 using difference_type = std::iter_difference_t<Iter>;
21 using reference = std::iter_reference_t<Iter>;
22 using iterator = Iter;
24 template <rng::random_access_range R>
25 span(R &&r) : begin_(rng::begin(r)), end_(rng::end(r)) {}
26 span(Iter first, Iter last) : begin_(first), end_(last) {}
27 span(Iter first, std::size_t count) : begin_(first), end_(first + count) {}
30 span(
const span &)
noexcept =
default;
31 span &operator=(
const span &)
noexcept =
default;
33 std::size_t size()
const noexcept {
return std::size_t(end() - begin()); }
35 bool empty()
const noexcept {
return size() == 0; }
37 Iter begin()
const noexcept {
return begin_; }
39 Iter end()
const noexcept {
return end_; }
41 reference operator[](size_type
index)
const {
return *(begin() +
index); }
43 span first(size_type n)
const {
return span(begin(), begin() + n); }
45 span last(size_type n)
const {
return span(end() - n, end()); }
47 span subspan(std::size_t offset, std::size_t count)
const {
48 return span(begin() + offset, begin() + offset + count);
55template <rng::random_access_range R>
58template <rng::random_access_iterator Iter>