18 #if __has_include(<version>)
22 #include <boost/version.hpp>
28 namespace utils {
using std::span; }
31 #elif BOOST_VERSION >= 107800
33 #include <boost/core/span.hpp>
49 #include <initializer_list>
51 #include <type_traits>
57 data(C&
c) noexcept(noexcept(
c.data())) -> decltype(
c.data())
64 data(
const C&
c) noexcept(noexcept(
c.data())) -> decltype(
c.data())
69 template<
class T, std::
size_t N>
77 inline constexpr
const T*
78 data(std::initializer_list<T> l) noexcept
85 template<
class T, std::
size_t E = dynamic_extent>
90 template<
class U,
class T>
92 static constexpr
bool value = std::is_convertible<U(*)[], T(*)[]>
::value;
95 template<std::
size_t E, std::
size_t N>
100 template<
class T, std::
size_t E,
class U, std::
size_t N>
112 static constexpr
bool value =
false;
115 template<
class T, std::
size_t E>
122 static constexpr
bool value =
false;
125 template<
class T, std::
size_t N>
133 template<
class,
class =
void>
138 typename std::enable_if<std::is_pointer<span_ptr<T> >::value>
::type> {
139 typedef typename std::remove_pointer<span_ptr<T> >
::type type;
142 template<
class,
class,
class =
void>
144 static constexpr
bool value =
false;
147 template<
class R,
class T>
148 struct span_has_data<R, T, typename std::enable_if<span_convertible<typename
149 span_data<R>::type, T>::value>
::type> {
153 template<
class,
class =
void>
155 static constexpr
bool value =
false;
160 std::enable_if<std::is_convertible<decltype(std::declval<R&>().size()),
161 std::size_t>::value>
::type> {
165 template<
class R,
class T>
167 static constexpr
bool value = (std::is_const<T>::value ||
168 std::is_lvalue_reference<R>::value) &&
176 template<std::
size_t E, std::
size_t N>
182 template<
class T, std::
size_t E,
class U, std::
size_t N>
188 template<std::
size_t E, std::
size_t O>
194 template<
class T, std::
size_t E>
198 static constexpr std::size_t
n = E;
211 template<
class T, std::
size_t E>
213 static constexpr std::size_t
value =
sizeof(T) * E;
223 template<
class T, std::
size_t E>
241 template<std::size_t N = E,
258 template<
class I,
class L,
264 template<
class I,
class L,
270 template<std::size_t N,
271 typename std::enable_if<detail::span_capacity<E, N>::value,
276 template<
class U, std::size_t N,
277 typename std::enable_if<detail::span_compatible<T, E, U, N>::value,
279 constexpr
span(std::array<U, N>& a) noexcept
280 :
s_(a.data(), N) { }
282 template<
class U, std::size_t N,
284 N>::value,
int>
::type = 0>
285 constexpr
span(
const std::array<U, N>& a) noexcept
286 :
s_(a.data(), N) { }
302 template<
class U, std::size_t N,
303 typename std::enable_if<detail::span_implicit<E, N>::value &&
306 :
s_(
s.data(),
s.size()) { }
308 template<
class U, std::size_t N,
309 typename std::enable_if<!detail::span_implicit<E, N>::value &&
312 :
s_(
s.data(),
s.size()) { }
314 template<std::
size_t C>
316 static_assert(C <= E,
"Count <= Extent");
320 template<std::
size_t C>
322 static_assert(C <= E,
"Count <= Extent");
326 template<std::
size_t O, std::
size_t C = dynamic_extent>
329 static_assert(O <= E,
"Offset <= Extent");
333 template<std::
size_t O, std::
size_t C = dynamic_extent>
336 static_assert(O <= E && C <= E - O,
337 "Offset <= Extent && Count <= Extent - Offset");
360 return s_.n *
sizeof(T);
363 constexpr
bool empty() const noexcept {
376 return s_.p[
s_.n - 1];
419 #if defined(BOOST_NO_CXX17_INLINE_VARIABLES)
420 template<
class T, std::
size_t E>
424 #ifdef __cpp_deduction_guides
425 template<
class I,
class L>
428 template<
class T, std::
size_t N>
431 template<
class T, std::
size_t N>
434 template<
class T, std::
size_t N>
440 template<
class T, std::
size_t E>
444 #ifdef __cpp_lib_byte
445 template<
class T, std::
size_t E>
450 E>::value>(
reinterpret_cast<const std::byte*
>(
s.data()),
454 template<
class T, std::
size_t E>
455 inline typename std::enable_if<!std::is_const<T>::value,
456 span<std::byte, detail::span_bytes<T, E>::value> >
::type
457 as_writable_bytes(span<T, E>
s) noexcept
459 return span<std::byte, detail::span_bytes<T,
460 E>::value>(
reinterpret_cast<std::byte*
>(
s.data()),
s.size_bytes());
constexpr reverse_iterator rbegin() const noexcept
std::remove_cv< T >::type value_type
constexpr reference operator[](size_type i) const
constexpr iterator end() const noexcept
std::reverse_iterator< const T * > const_reverse_iterator
constexpr const_reverse_iterator crbegin() const noexcept
constexpr std::enable_if< C==dynamic_extent, span< T, detail::span_sub< E, O >::value > >::type subspan() const
constexpr span(std::array< U, N > &a) noexcept
constexpr span(R &&r) noexcept(noexcept(boost::data(r)) &&noexcept(r.size()))
constexpr span< T, dynamic_extent > first(size_type c) const
constexpr std::enable_if< C !=dynamic_extent, span< T, C > >::type subspan() const
constexpr span(typename std::enable_if< true, T >::type(&a)[N]) noexcept
constexpr const_reverse_iterator crend() const noexcept
constexpr const_iterator cbegin() const noexcept
constexpr span< T, C > last() const
constexpr bool empty() const noexcept
constexpr pointer data() const noexcept
std::ptrdiff_t difference_type
std::reverse_iterator< T * > reverse_iterator
constexpr size_type size_bytes() const noexcept
constexpr span< T, dynamic_extent > subspan(size_type o, size_type c=dynamic_extent) const
detail::span_store< T, E > s_
constexpr span() noexcept
constexpr iterator begin() const noexcept
static constexpr std::size_t extent
constexpr const_iterator cend() const noexcept
constexpr span(const span< U, N > &s) noexcept
constexpr span< T, dynamic_extent > last(size_type c) const
constexpr span< T, C > first() const
constexpr reference front() const
constexpr reference back() const
constexpr reverse_iterator rend() const noexcept
constexpr size_type size() const noexcept
constexpr span(I *f, size_type c)
const T & const_reference
constexpr span(const std::array< U, N > &a) noexcept
constexpr span(I *f, L *l)
typename std::remove_cv< typename std::remove_reference< T >::type >::type span_uncvref
decltype(boost::data(std::declval< T & >())) span_ptr
constexpr std::size_t dynamic_extent
constexpr auto data(C &c) noexcept(noexcept(c.data())) -> decltype(c.data())
static constexpr std::size_t value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
std::remove_pointer< span_ptr< T > >::type type
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
constexpr span_store(T *p_, std::size_t n_) noexcept
constexpr span_store(T *p_, std::size_t) noexcept
static constexpr std::size_t n
static constexpr std::size_t value
static map_location::direction s