1 #ifndef ZSERIO_SPAN_H_INC 2 #define ZSERIO_SPAN_H_INC 17 constexpr std::size_t
dynamic_extent = std::numeric_limits<std::size_t>::max();
22 template <
typename T, std::
size_t Extent>
25 SpanStorage() =
default;
27 SpanStorage(T* data, std::size_t) :
32 static constexpr std::size_t m_size = Extent;
36 struct SpanStorage<T, dynamic_extent>
38 SpanStorage() =
default;
40 SpanStorage(T* data, std::size_t size) :
41 m_data(data), m_size(size)
45 std::size_t m_size = 0;
56 template <
typename T, std::
size_t Extent = dynamic_extent>
62 using size_type = std::size_t;
72 static constexpr size_type extent = Extent;
77 template <size_type ext = Extent,
78 typename std::enable_if<(ext == 0 || ext == dynamic_extent), int>::type = 0>
90 m_storage(first, count)
101 m_storage(first, static_cast<size_t>(last - first))
109 template <size_type N, size_type ext = Extent,
110 typename std::enable_if<(ext == dynamic_extent || ext == N), int>::type = 0>
120 template <
typename U, size_type N, size_type ext = Extent,
121 typename std::enable_if<(ext == dynamic_extent || ext == N) &&
122 std::is_convertible<U(*)[], T(*)[]>::value,
int>::type = 0>
123 constexpr
Span(std::array<U, N>& arr) noexcept :
124 m_storage(arr.data(), arr.size())
132 template <
typename U, size_type N, size_type ext = Extent,
133 typename std::enable_if<(ext == dynamic_extent || ext == N) &&
134 std::is_convertible<
const U(*)[], T(*)[]>::value,
int>::type = 0>
135 constexpr
Span(
const std::array<U, N>& arr) noexcept :
136 m_storage(arr.data(), arr.size())
144 template <
typename U,
typename ALLOC, size_type ext = Extent,
146 std::is_convertible<U(*)[], T(*)[]>::value,
int>::type = 0>
147 constexpr
Span(std::vector<U, ALLOC>& vec) :
148 m_storage(vec.data(), vec.size())
156 template <
typename U,
typename ALLOC, size_type ext = Extent,
158 std::is_convertible<
const U(*)[], T(*)[]>::value,
int>::type = 0>
159 constexpr
Span(
const std::vector<U, ALLOC>& vec) :
160 m_storage(vec.data(), vec.size())
168 template <
typename U, size_type N,
169 typename std::enable_if<(Extent == N || Extent ==
dynamic_extent) &&
170 std::is_convertible<U(*)[], T(*)[]>::value,
int>::type = 0>
172 m_storage(s.data(), s.size())
181 Span(
const Span& other) noexcept =
default;
182 Span& operator=(
const Span& other) noexcept =
default;
184 Span(
Span&& other) noexcept =
default;
185 Span& operator=(
Span&& other) noexcept =
default;
207 return data() + size();
247 return data()[size() - 1];
268 return m_storage.m_data;
276 constexpr size_type
size() const noexcept
278 return m_storage.m_size;
296 constexpr
bool empty() const noexcept
306 template <
size_type Count>
309 static_assert(Count <= Extent,
"Requested number of characters out of range.");
329 template <
size_type Count>
332 static_assert(Count <= Extent,
"Requested number of characters out of range.");
347 template <
size_type Offset,
size_type Count>
349 Span<T, Count != dynamic_extent ? Count : (Extent != dynamic_extent ? Extent - Offset
359 typename std::enable_if<Count == dynamic_extent, int>::type = 0>
362 static_assert((Extent == dynamic_extent) || (Offset <= Extent),
363 "Requested number of characters out of range.");
367 template <size_type Offset, size_type Count,
368 typename std::enable_if<Count != dynamic_extent, int>::type = 0>
371 static_assert((Extent == dynamic_extent) || (Offset <= Extent && Offset + Count <= Extent),
372 "Requested number of characters out of range.");
385 size_type Count = dynamic_extent)
const 388 Count == dynamic_extent ? size() - Offset : Count );
392 detail::SpanStorage<T, Extent> m_storage;
397 #endif // ZSERIO_SPAN_H_INC constexpr std::size_t dynamic_extent
constexpr Span< element_type, dynamic_extent > subspan(size_type Offset, size_type Count=dynamic_extent) const
const const zserio::BasicStringView * const_pointer
std::reverse_iterator< const_iterator > const_reverse_iterator
std::ptrdiff_t difference_type
constexpr reference front() const
typename std::remove_cv< const zserio::BasicStringView >::type value_type
constexpr Span(pointer first, size_type count)
constexpr Span(std::array< U, N > &arr) noexcept
constexpr Span< element_type, Count > last() const
constexpr Span(const Span< U, N > &s) noexcept
constexpr reference back() const
constexpr Span(const std::array< U, N > &arr) noexcept
constexpr bool empty() const noexcept
std::reverse_iterator< iterator > reverse_iterator
constexpr Span(const std::vector< U, ALLOC > &vec)
const_pointer const_iterator
constexpr reverse_iterator rend() const noexcept
constexpr size_type size() const noexcept
constexpr Span(pointer first, pointer last)
constexpr Span() noexcept
constexpr reference operator[](size_type idx) const
constexpr SubspanReturnType< Offset, Count > subspan() const
constexpr Span< element_type, dynamic_extent > first(size_type Count) const
constexpr pointer data() const noexcept
constexpr Span< element_type, Count > first() const
constexpr iterator begin() const noexcept
constexpr size_type size_bytes() const noexcept
constexpr reverse_iterator rbegin() const noexcept
constexpr Span(std::vector< U, ALLOC > &vec)
constexpr Span< element_type, dynamic_extent > last(size_type Count) const
constexpr iterator end() const noexcept
constexpr Span(element_type(&arr)[N]) noexcept