18#if __has_include(<version>)
22#include <boost/version.hpp>
28namespace utils {
using std::span; }
31#elif BOOST_VERSION >= 107800
33#include <boost/core/span.hpp>
49#include <initializer_list>
57data(C&
c)
noexcept(
noexcept(
c.data())) ->
decltype(
c.data())
64data(
const C&
c)
noexcept(
noexcept(
c.data())) ->
decltype(
c.data())
69template<
class T, std::
size_t N>
77inline constexpr const T*
78data(std::initializer_list<T> l)
noexcept
85template<
class T, std::
size_t E = dynamic_extent>
90template<
class U,
class T>
92 static constexpr bool value = std::is_convertible<U(*)[], T(*)[]>
::value;
95template<std::
size_t E, std::
size_t N>
100template<
class T, std::
size_t E,
class U, std::
size_t N>
108 std::remove_reference<T>::type>::type;
112 static constexpr bool value =
false;
115template<
class T, std::
size_t E>
122 static constexpr bool value =
false;
125template<
class T, std::
size_t N>
133template<
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;
142template<
class,
class,
class =
void>
144 static constexpr bool value =
false;
147template<
class R,
class T>
149 span_data<R>::type, T>::value>::type> {
153template<
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> {
165template<
class R,
class T>
167 static constexpr bool value = (std::is_const<T>::value ||
168 std::is_lvalue_reference<R>::value) &&
176template<std::
size_t E, std::
size_t N>
182template<
class T, std::
size_t E,
class U, std::
size_t N>
188template<std::
size_t E, std::
size_t O>
194template<
class T, std::
size_t E>
198 static constexpr std::size_t
n = E;
211template<
class T, std::
size_t E>
213 static constexpr std::size_t
value =
sizeof(T) * E;
223template<
class T, std::
size_t E>
241 template<std::size_t N = E,
242 typename std::enable_if<N == dynamic_extent || N == 0, int>::type = 0>
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,
273 constexpr span(
typename std::enable_if<true, T>::type (&a)[N]) noexcept
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,
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)
420template<
class T, std::
size_t E>
424#ifdef __cpp_deduction_guides
425template<
class I,
class L>
428template<
class T, std::
size_t N>
431template<
class T, std::
size_t N>
434template<
class T, std::
size_t N>
440template<
class T, std::
size_t E>
445template<
class T, std::
size_t E>
450 E>
::value>(
reinterpret_cast<const std::byte*
>(
s.data()),
454template<
class T, std::
size_t E>
455inline typename std::enable_if<!std::is_const<T>::value,
456 span<std::byte, detail::span_bytes<T, E>::value> >::type
457as_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 std::enable_if< C!=dynamic_extent, span< T, C > >::type subspan() const
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< T, dynamic_extent > last(size_type c) const
constexpr span(std::array< U, N > &a) noexcept
constexpr span(R &&r) noexcept(noexcept(boost::data(r)) &&noexcept(r.size()))
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 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, C > first() 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 reference front() const
constexpr span< T, C > last() const
constexpr span< T, dynamic_extent > first(size_type c) const
constexpr reference back() const
constexpr reverse_iterator rend() const noexcept
constexpr span< T, dynamic_extent > subspan(size_type o, size_type c=dynamic_extent) const
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())
std::unique_ptr< MIX_Audio, decltype(&MIX_DestroyAudio)> value
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