10 typename Vec::value_type;
28template<
class T,
size_t N = std::dynamic_extent>
class Span :
public std::span<T, N> {
30 using Base = std::span<T, N>;
35 explicit(
N != std::dynamic_extent)
constexpr Span(std::initializer_list<T> init)
noexcept
36 :
Base(std::begin(init), std::ranges::distance(init)) {}
39 template<Vectorlike Vec>
requires(std::is_same_v<typename Vec::value_type, T>)
42 template<Vectorlike Vec>
requires(std::is_same_v<std::add_const_t<typename Vec::value_type>, std::add_const_t<T>>)
43 explicit(
N != std::dynamic_extent)
constexpr Span(
const Vec&
vec)
45 constexpr explicit Span(
typename Base::pointer
p)
47 static_assert(
N != std::dynamic_extent);
55 return Base::subspan(
i,
n);
58 return n != std::dynamic_extent ?
subspan(Base::size() -
i -
n,
n) :
subspan(0, Base::size() -
i);
67 template<
size_t i,
size_t n = std::dynamic_extent>
68 constexpr Span<T,
n != std::dynamic_extent ?
n : (
N != std::dynamic_extent ?
N -
i : std::dynamic_extent)>
73 template<
size_t i,
size_t n = std::dynamic_extent>
74 constexpr Span<T,
n != std::dynamic_extent ?
n : (
N != std::dynamic_extent ?
N -
i : std::dynamic_extent)>
76 if constexpr (
n != std::dynamic_extent)
78 else if constexpr (
N != std::dynamic_extent)
86static_assert(std::ranges::contiguous_range<Span<int>>);
106template<
class T,
size_t N>
struct tuple_size<
thorin::Span<T, N>> : std::integral_constant<size_t, N> {};
108template<
size_t I,
class T,
size_t N>
struct tuple_element<I,
thorin::Span<T, N>> {
This is a thin wrapper for std::span<T, N> with the following additional features:
constexpr Span(typename Base::pointer p)
constexpr Span< T, n !=std::dynamic_extent ? n :(N !=std::dynamic_extent ? N - i :std::dynamic_extent)> subspan() const
constexpr Span(std::span< T, N > span) noexcept
constexpr Span< T, n !=std::dynamic_extent ? n :(N !=std::dynamic_extent ? N - i :std::dynamic_extent)> rsubspan() const
constexpr Span< T, std::dynamic_extent > subspan(size_t i, size_t n=std::dynamic_extent) const
constexpr Span< T, std::dynamic_extent > rsubspan(size_t i, size_t n=std::dynamic_extent) const
Something which behaves like std::vector or std::array.
typename thorin::Span< T, N >::reference type
constexpr decltype(auto) get(thorin::Span< T, N > span)