16 std::conditional_t<std::is_const_v<T>,
const char,
char> *;
18 [[nodiscard]] erased_type erased_ptr()
const {
19 return reinterpret_cast<erased_type
>(m_data);
49 auto p =
reinterpret_cast<erased_type
>(_ptr) + _stride;
50 _ptr =
reinterpret_cast<pointer>(p);
62 static_assert(std::forward_iterator<iterator>);
64 constexpr strided_view() noexcept : m_data(
nullptr), m_size(0), m_stride(0) {}
67 template <std::random_access_iterator It>
69 : m_data(std::to_address(first)), m_size(count), m_stride(
stride_bytes) {}
73 template <std::random_access_iterator It>
77 template <
size_t extent>
80 : m_data(other.data()), m_size(other.size()), m_stride(
stride_bytes) {}
82 template <
size_t extent>
86 template <
size_t array_extent>
87 strided_view(std::type_identity_t<element_type> (&arr)[array_extent],
114 size_t q = m_size / stride_in_T;
115 size_t m = m_size % stride_in_T;
116 return q + ((m > 0) ? 1 : 0);
119 [[nodiscard]]
bool empty() const noexcept {
return size() == 0; }
124 return *
reinterpret_cast<pointer>(erased_ptr() +
129 return *
reinterpret_cast<pointer>(erased_ptr() + m_stride * idx);
134 throw std::out_of_range(
"Access out of range.");
148template <
typename T,
size_t extent>
151template <
typename T,
size_t arr_extent>
Definition StridedView.h:32
iterator(pointer ptr, size_type stride)
Definition StridedView.h:43
reference operator*() const
Definition StridedView.h:45
iterator operator++(int)
Definition StridedView.h:54
std::forward_iterator_tag iterator_concept
Definition StridedView.h:37
bool operator<=>(const iterator &) const =default
pointer operator->() const
Definition StridedView.h:46
strided_view::difference_type difference_type
Definition StridedView.h:39
iterator & operator++()
Definition StridedView.h:48
iterator()
Definition StridedView.h:41
strided_view::value_type value_type
Definition StridedView.h:38
A strided view to data, allowing for type-erased data.
Definition StridedView.h:14
iterator begin() const
Definition StridedView.h:95
strided_view(std::span< element_type, extent > other) noexcept
Definition StridedView.h:83
std::size_t size_type
Definition StridedView.h:25
T element_type
Definition StridedView.h:23
std::remove_cv_t< T > value_type
Definition StridedView.h:24
pointer data() const noexcept
Definition StridedView.h:138
reference operator[](size_type idx) const noexcept
Definition StridedView.h:128
const T * const_pointer
Definition StridedView.h:28
strided_view(It first, size_type count) noexcept
Build a view from an iterator and given element count. The stride is assumed to be sizeof(T),...
Definition StridedView.h:74
bool empty() const noexcept
Definition StridedView.h:119
strided_view(std::type_identity_t< element_type >(&arr)[array_extent], size_t stride_bytes=sizeof(element_type)) noexcept
Definition StridedView.h:87
reference back() const noexcept
Definition StridedView.h:123
std::ptrdiff_t difference_type
Definition StridedView.h:26
iterator cbegin() const
Definition StridedView.h:103
size_t max_index() const
Definition StridedView.h:112
strided_view(std::span< element_type, extent > other, size_type stride_bytes) noexcept
Definition StridedView.h:78
size_type stride_bytes() const noexcept
Stride in bytes between two elements of the view.
Definition StridedView.h:110
element_type & reference
Definition StridedView.h:29
iterator cend() const
Definition StridedView.h:104
size_type size() const noexcept
Size (number of elements) of the view.
Definition StridedView.h:107
reference at(size_type idx) const
Definition StridedView.h:132
iterator end() const
Definition StridedView.h:97
const element_type & const_reference
Definition StridedView.h:30
constexpr strided_view() noexcept
Definition StridedView.h:64
reference front() const noexcept
Definition StridedView.h:121
~strided_view() noexcept=default
T * pointer
Definition StridedView.h:27
strided_view(It first, size_type count, size_type stride_bytes) noexcept
Build a view from an iterator given the size and stride.
Definition StridedView.h:68
strided_view(T *first, size_t, size_t) -> strided_view< T >