10 #ifndef CORE_SPAN_TYPE_HPP
11 #define CORE_SPAN_TYPE_HPP
16 template <
class,
class =
void>
22 decltype(std::size(std::declval<C>())),
23 decltype(std::data(std::declval<C>()))>
27 template <
class,
class,
class =
void>
29 template <
class C,
class E>
33 decltype(std::data(std::declval<C>())),
34 typename std::remove_pointer<decltype(std::data( std::declval<C&>()))>::type(*)[]>
35 > : std::is_convertible<typename std::remove_pointer<decltype(std::data(std::declval<C&>()))>::type(*)[], E(*)[]>{};
38 template <
class C,
class E>
41 has_size_and_data<C>::value
42 && is_compatible_element<C,E>::value
62 typedef T element_type;
63 typedef typename std::remove_cv< T >::type value_type;
67 typedef const T &const_reference;
68 typedef const T *const_pointer;
70 typedef pointer iterator;
71 typedef const_pointer const_iterator;
73 typedef size_t size_type;
74 typedef std::ptrdiff_t difference_type;
76 constexpr
span() noexcept : first(
nullptr), last(
nullptr) {}
78 constexpr
span(pointer data_in,
size_t size_in) : first(data_in), last(data_in + size_in) {}
80 template<
class Container,
typename std::enable_if<(is_compatible_container<Container, element_type>::value),
int>::type = 0>
81 constexpr
span(Container &list) noexcept : first(std::data(list)), last(std::data(list) + std::size(list)) {}
82 template<
class Container,
typename std::enable_if<(std::is_const<element_type>::value && is_compatible_container<Container, element_type>::value),
int>::type = 0>
83 constexpr
span(
const Container &list) noexcept : first(std::data(list)), last(std::data(list) + std::size(list)) {}
85 constexpr
size_t size()
const noexcept {
return static_cast<size_t>( last - first ); }
86 constexpr std::ptrdiff_t ssize()
const noexcept {
return static_cast<std::ptrdiff_t
>( last - first ); }
87 constexpr
bool empty()
const noexcept {
return size() == 0; }
89 constexpr iterator begin()
const noexcept {
return iterator(first); }
90 constexpr iterator end()
const noexcept {
return iterator(last); }
92 constexpr const_iterator cbegin()
const noexcept {
return const_iterator(first); }
93 constexpr const_iterator cend()
const noexcept {
return const_iterator(last); }