1 #ifndef ZSERIO_SPAN_H_INC
2 #define ZSERIO_SPAN_H_INC
24 template <
typename T,
size_t Extent>
27 SpanStorage() =
default;
29 SpanStorage(T* data,
size_t) :
34 static constexpr
size_t m_size = Extent;
40 SpanStorage() =
default;
42 SpanStorage(T* data,
size_t size) :
59 template <
typename T,
size_t Extent = dynamic_extent>
81 typename std::enable_if<(ext == 0 || ext ==
dynamic_extent),
int>::type = 0>
93 m_storage(first_, count)
104 m_storage(first_, static_cast<size_t>(last_ - first_))
113 typename std::enable_if<(ext ==
dynamic_extent || ext == N),
int>::type = 0>
125 std::is_convertible<U (*)[], T (*)[]>::value,
127 constexpr
Span(std::array<U, N>& arr) noexcept :
128 m_storage(arr.data(), arr.size())
138 std::is_convertible<
const U (*)[], T (*)[]>::value,
140 constexpr
Span(
const std::array<U, N>& arr) noexcept :
141 m_storage(arr.data(), arr.size())
149 template <
typename U,
typename ALLOC,
size_type ext = Extent,
150 typename std::enable_if<(ext ==
dynamic_extent) && std::is_convertible<U (*)[], T (*)[]>::value,
152 constexpr
Span(std::vector<U, ALLOC>& vec) :
161 template <
typename U,
typename ALLOC,
size_type ext = Extent,
162 typename std::enable_if<
163 (ext ==
dynamic_extent) && std::is_convertible<
const U (*)[], T (*)[]>::value,
int>::type =
165 constexpr
Span(
const std::vector<U, ALLOC>& vec) :
175 typename std::enable_if<(Extent == N || Extent ==
dynamic_extent) &&
176 std::is_convertible<U (*)[], T (*)[]>::value,
179 m_storage(span.data(), span.size())
275 return m_storage.m_data;
285 return m_storage.m_size;
303 constexpr
bool empty() const noexcept
313 template <
size_type Count>
316 static_assert(Count <= Extent,
"Requested number of characters out of range.");
336 template <
size_type Count>
339 static_assert(Count <= Extent,
"Requested number of characters out of range.");
354 template <
size_type Offset,
size_type Count>
365 typename std::enable_if<Count == dynamic_extent, int>::type = 0>
369 "Requested number of characters out of range.");
374 typename std::enable_if<Count != dynamic_extent, int>::type = 0>
377 static_assert((Extent ==
dynamic_extent) || (Offset <= Extent && Offset + Count <= Extent),
378 "Requested number of characters out of range.");
398 detail::SpanStorage<T, Extent> m_storage;
constexpr Span(pointer first_, size_type count)
constexpr bool empty() const noexcept
Span & operator=(Span &&other) noexcept=default
constexpr reference front() const
constexpr Span() noexcept
Span(const Span &other) noexcept=default
constexpr size_type size() const noexcept
constexpr Span< element_type, dynamic_extent > last(size_type Count) const
static constexpr size_type extent
constexpr Span(const Span< U, N > &span) noexcept
constexpr Span< element_type, Count > last() const
constexpr Span(pointer first_, pointer last_)
constexpr reverse_iterator rbegin() const noexcept
std::ptrdiff_t difference_type
constexpr reverse_iterator rend() const noexcept
const_pointer const_iterator
constexpr Span< element_type, dynamic_extent > subspan(size_type Offset, size_type Count=dynamic_extent) const
typename std::remove_cv< T >::type value_type
constexpr reference back() const
constexpr Span(const std::vector< U, ALLOC > &vec)
constexpr pointer data() const noexcept
constexpr SubspanReturnType< Offset, Count > subspan() const
std::reverse_iterator< iterator > reverse_iterator
Span(Span &&other) noexcept=default
constexpr size_type size_bytes() const noexcept
constexpr Span(const std::array< U, N > &arr) noexcept
constexpr reference operator[](size_type idx) const
constexpr Span< element_type, Count > first() const
constexpr Span< element_type, dynamic_extent > first(size_type Count) const
std::reverse_iterator< const_iterator > const_reverse_iterator
constexpr Span(std::array< U, N > &arr) noexcept
Span & operator=(const Span &other) noexcept=default
constexpr Span(element_type(&arr)[N]) noexcept
constexpr Span(std::vector< U, ALLOC > &vec)
constexpr iterator end() const noexcept
constexpr iterator begin() const noexcept
constexpr size_t dynamic_extent