38template <
class T>
class Span {
57 using enable_if_const_t =
58 typename std::enable_if<std::is_const_v<T>, U>::type;
60 using enable_if_mutable_t =
61 typename std::enable_if<!std::is_const_v<T>, U>::type;
63 using enable_if_has_data_t =
typename std::enable_if<
64 std::is_convertible_v<std::decay_t<decltype(std::declval<U>().
data())> *,
75 : m_ptr(array), m_size(length) {}
76 template <std::
size_t N>
79 template <
typename C,
typename = enable_if_mutable_t<C>,
80 typename = enable_if_has_data_t<C>>
82 template <
typename C,
typename = enable_if_const_t<C>,
83 typename = enable_if_has_data_t<C>>
93 return m_ptr + m_size;
103 return (i <
size()) ? m_ptr[i]
104 :
throw std::out_of_range(
"span access out of bounds."),
A stripped-down version of std::span from C++17.
std::reverse_iterator< iterator > reverse_iterator
DEVICE_QUALIFIER Span(C &c) noexcept
DEVICE_QUALIFIER Span(const C &c) noexcept
constexpr reference at(size_type i) const
DEVICE_QUALIFIER constexpr Span(T(&a)[N]) noexcept
DEVICE_QUALIFIER constexpr reference operator[](size_type i) const
std::reverse_iterator< const_iterator > const_reverse_iterator
const T & const_reference
DEVICE_QUALIFIER constexpr pointer data() const
DEVICE_QUALIFIER constexpr size_type size() const
std::ptrdiff_t difference_type
constexpr reverse_iterator rend() const
DEVICE_QUALIFIER constexpr const_iterator cend() const
DEVICE_QUALIFIER constexpr const_iterator cbegin() const
Span(const Span &)=default
typename std::remove_cv< T >::type value_type
Span & operator=(const Span &)=default
DEVICE_QUALIFIER constexpr bool empty() const
DEVICE_QUALIFIER constexpr iterator end() const
const_pointer const_iterator
DEVICE_QUALIFIER constexpr Span(pointer array, size_type length)
constexpr reverse_iterator rbegin() const
DEVICE_QUALIFIER constexpr iterator begin() const
DEVICE_QUALIFIER constexpr Span< T > make_span(T *p, std::size_t N)
DEVICE_QUALIFIER constexpr Span< std::add_const_t< T > > make_const_span(T *p, std::size_t N)