23#if MOCHI_USE_EXTERN_TEMPLATE
42template <
typename T,
typename SizeT =
size_t>
47 static_assert(std::is_integral_v<SizeT>,
"SizeT should be a signed or unsigned integral type");
71 template <
class ContainerT, MOCHI_CONCEPT((!std::is_same_v<std::decay_t<ContainerT>, Span>))>
73 :
_ptr(std::
data(container)),
_len(static_cast<SizeT>(std::
size(container))) {}
87 template <
typename T2,
typename S2>
93 if (rhs[i] !=
_ptr[i]) {
100 template <
typename T2,
typename S2>
102 return !(*
this == rhs);
133 return (*
this)[
_len - 1];
142template <
typename ContainerT>
149template <
typename ContainerT>
151 auto* ptr = std::data(container);
152 size_t len = std::size(container);
153 return Span<std::remove_reference_t<
decltype(*ptr)>>{ptr, len};
156template <
typename T,
size_t N>
161template <
typename T,
typename S>
166template <
typename ContainerT>
168 auto* ptr = std::data(container);
169 size_t len = std::size(container);
170 return Span<std::add_const_t<std::remove_reference_t<
decltype(*ptr)>>>{ptr, len};
173template <
typename T,
size_t N>
178template <
typename T,
typename S>
193#if MOCHI_USE_EXTERN_TEMPLATE
194extern template class Span<int>;
195extern template class Span<NdArray<int, 2>>;
196extern template class Span<NdArray<int, 3>>;
197extern template class Span<NdArray<int, 4>>;
198extern template class Span<real>;
199extern template class Span<NdArray<real, 3>>;
200extern template class Span<int, int>;
201extern template class Span<NdArray<int, 2>,
int>;
202extern template class Span<NdArray<int, 3>,
int>;
203extern template class Span<NdArray<int, 4>,
int>;
204extern template class Span<real, int>;
205extern template class Span<NdArray<real, 3>,
int>;
210template <
class T,
class SizeT>
211struct ScalarTypeDef<Span<T, SizeT>, void> {
212 using type = ScalarType<T>;
constexpr Span(ContainerT &&container)
bool operator==(Span< T2, S2 > const &rhs) const
constexpr T * end() const
bool operator!=(Span< T2, S2 > const &rhs) const
constexpr Span(T *begin, NotIntegral< T * > end)
constexpr T & front() const
constexpr Span subspan(SizeT start, SizeT len) const
constexpr SizeT size() const
constexpr T & back() const
constexpr bool empty() const
constexpr Span subspan(SizeT start) const
constexpr Span(T *ptr, SizeT len)
constexpr T * begin() const
constexpr T & operator[](SizeT index) const
constexpr T * data() const
#define MOCHI_ASSERT_VERBOSE(condition_without_side_effects,...)
auto MakeConstSpan(ContainerT const &container)
Span< T const, size_t > MakeSingletonConstSpan(T const &obj)
Span< T, size_t > MakeSingletonSpan(T &obj)
auto MakeSpan(ContainerT &container)
NotIntegral(SizeT)=delete