10 typename Vec::value_type;
28template<
class T,
size_t N = std::dynamic_extent>
29class Span :
public std::span<T, N> {
31 using Base = std::span<T, N>;
32 constexpr static auto D = std::dynamic_extent;
41 explicit(N !=
D)
constexpr Span(std::initializer_list<T> init) noexcept
42 :
Base(std::begin(init), std::ranges::distance(init)) {}
45 template<Vectorlike Vec>
46 requires(std::is_same_v<typename Vec::value_type, T>)
47 explicit(N !=
D)
constexpr Span(Vec& vec)
noexcept(
noexcept(vec.data()) &&
noexcept(vec.size()))
48 :
Base(vec.data(), vec.size()) {}
49 template<Vectorlike Vec>
50 requires(std::is_same_v<std::add_const_t<typename Vec::value_type>, std::add_const_t<T>>)
51 explicit(N !=
D)
constexpr Span(
const Vec& vec)
noexcept(
noexcept(vec.data()) &&
noexcept(vec.size()))
52 :
Base(
const_cast<T*
>(vec.data()), vec.size()) {}
53 constexpr explicit Span(
typename Base::pointer p) noexcept
55 static_assert(N !=
D);
65 [[nodiscard]]
constexpr Span<T, D> subspan(
size_t i,
size_t n =
D)
const noexcept {
return Base::subspan(i, n); }
67 template<
size_t i,
size_t n = D>
68 [[nodiscard]]
constexpr Span<T, n !=
D ? n : (N !=
D ? N - i :
D)>
subspan()
const noexcept {
87 template<
size_t i,
size_t n = D>
88 [[nodiscard]]
constexpr Span<T, n !=
D ? n : (N !=
D ? N - i :
D)>
rsubspan()
const noexcept {
91 else if constexpr (N !=
D)
99static_assert(std::ranges::contiguous_range<Span<int>>);
101template<
class T,
size_t N = std::dynamic_extent>
117template<
size_t I,
class T,
size_t N>
118requires(N != std::dynamic_extent)
120 static_assert(I < N,
"index I out of bound N");
129template<
class T,
size_t N>
130requires(N != std::dynamic_extent)
133template<
size_t I,
class T,
size_t N>
134requires(N != std::dynamic_extent)
This is a thin wrapper for std::span<T, N> with the following additional features:
constexpr Span< T, D > subspan(size_t i, size_t n=D) const noexcept
constexpr Span< T, n > span() const noexcept
constexpr Span(typename Base::pointer p) noexcept
constexpr Span< T, n !=D ? n :(N !=D ? N - i :D)> subspan() const noexcept
constexpr Span< T, D > rsubspan(size_t i, size_t n=D) const noexcept
constexpr Span(std::span< T, N > span) noexcept
constexpr Span< T, n !=D ? n :(N !=D ? N - i :D)> rsubspan() const noexcept
span.rsubspan(3, 5) removes the last 3 elements and picks 5 elements starting before those.
Something which behaves like std::vector or std::array.
Span(I, E) -> Span< std::remove_reference_t< std::iter_reference_t< I > > >
constexpr decltype(auto) get(Span< T, N > span) noexcept
typename mim::Span< T, N >::reference type