11#ifndef MARVIN_STRIDED_VIEW
12#define MARVIN_STRIDED_VIEW
46 template <
typename T,
size_t Str
ide>
77 operator bool()
const {
102 m_internal += Stride;
112 m_internal += Stride;
121 m_internal -= Stride;
131 m_internal -= Stride;
141 const auto stridedN = Stride * n;
142 m_internal += stridedN;
152 const auto stridedN = Stride * n;
153 m_internal -= stridedN;
164 return lhs.m_internal == rhs.m_internal;
184 return lhs.m_internal < rhs.m_internal;
194 return lhs.m_internal > rhs.m_internal;
204 return lhs.m_internal <= rhs.m_internal;
214 return lhs.m_internal >= rhs.m_internal;
258 return lhs.m_internal - rhs.m_internal;
262 T* m_internal{
nullptr };
292 operator bool()
const {
317 m_internal += Stride;
327 m_internal += Stride;
336 m_internal -= Stride;
346 m_internal -= Stride;
356 const auto stridedDiff = n * Stride;
357 m_internal += stridedDiff;
367 const auto stridedDiff = n * Stride;
368 m_internal -= stridedDiff;
379 return lhs.m_internal == rhs.m_internal;
389 return lhs.m_internal != rhs.m_internal;
399 return lhs.m_internal < rhs.m_internal;
409 return lhs.m_internal > rhs.m_internal;
419 return lhs.m_internal <= rhs.m_internal;
429 return lhs.m_internal >= rhs.m_internal;
473 return lhs.m_internal - rhs.m_internal;
478 pointer m_internal{
nullptr };
496 template <std::input_or_output_iterator Iter>
497 requires std::is_same_v<typename Iter::value_type, T>
500 const auto size =
static_cast<size_t>(std::distance(
begin,
end));
501 const auto data = &(*begin);
502 m_internalView = { data,
size };
509 explicit StrideView(std::span<T> arrayLike) : m_internalView(arrayLike) {
516 [[nodiscard]]
size_t size() const noexcept {
517 const auto stridedSize = m_internalView.size() / Stride;
528 const auto stridedIdx = Stride * idx;
529 return m_internalView[stridedIdx];
539 const auto stridedIdx = Stride * idx;
540 return m_internalView[stridedIdx];
548 auto* ptr = &(*m_internalView.begin());
557 auto* ptr = &(*m_internalView.begin());
566 auto* ptr = &(*m_internalView.begin());
575 auto beginIt =
begin();
576 const auto endIndex =
static_cast<std::ptrdiff_t
>(m_internalView.size() / Stride);
577 auto endIt = beginIt + endIndex;
586 auto beginIt =
begin();
587 const auto endIndex =
static_cast<std::ptrdiff_t
>(m_internalView.size() / Stride);
588 auto endIt = beginIt + endIndex;
598 const auto endIndex =
static_cast<std::ptrdiff_t
>(m_internalView.size() / Stride);
599 auto endIt = beginIt + endIndex;
608 return m_internalView;
612 std::span<T> m_internalView{};
Custom const_iterator for a StrideView.
Definition marvin_StrideView.h:268
friend const_iterator operator+(difference_type n, const const_iterator &iter)
Definition marvin_StrideView.h:450
friend bool operator!=(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:388
T & reference
Definition marvin_StrideView.h:273
friend const_iterator operator-(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:472
friend bool operator<(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:398
std::ptrdiff_t difference_type
Definition marvin_StrideView.h:271
T * pointer
Definition marvin_StrideView.h:272
friend bool operator>=(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:428
friend bool operator<=(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:418
const_iterator operator++(int)
Definition marvin_StrideView.h:325
const_iterator & operator-=(difference_type n)
Definition marvin_StrideView.h:366
friend bool operator==(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:378
const_iterator & operator++()
Definition marvin_StrideView.h:316
const_iterator & operator+=(difference_type n)
Definition marvin_StrideView.h:355
const_iterator operator--(int)
Definition marvin_StrideView.h:344
const T & operator*() const
Definition marvin_StrideView.h:300
const_iterator & operator--()
Definition marvin_StrideView.h:335
const T * operator->() const
Definition marvin_StrideView.h:308
const_iterator(pointer ptr)
Definition marvin_StrideView.h:285
T value_type
Definition marvin_StrideView.h:270
friend bool operator>(const const_iterator &lhs, const const_iterator &rhs)
Definition marvin_StrideView.h:408
friend const_iterator operator+(const const_iterator &iter, difference_type n)
Definition marvin_StrideView.h:438
std::forward_iterator_tag iterator_category
Definition marvin_StrideView.h:274
friend const_iterator operator-(const const_iterator &iter, difference_type n)
Definition marvin_StrideView.h:460
Custom iterator for StrideView.
Definition marvin_StrideView.h:53
T * pointer
Definition marvin_StrideView.h:57
friend bool operator==(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:163
friend iterator operator+(const iterator &iter, difference_type n)
Definition marvin_StrideView.h:223
iterator & operator-=(difference_type n)
Definition marvin_StrideView.h:151
iterator & operator+=(difference_type n)
Definition marvin_StrideView.h:140
std::ptrdiff_t difference_type
Definition marvin_StrideView.h:56
friend iterator operator+(difference_type n, const iterator &iter)
Definition marvin_StrideView.h:235
friend difference_type operator-(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:257
iterator & operator--()
Definition marvin_StrideView.h:120
std::forward_iterator_tag iterator_category
Definition marvin_StrideView.h:59
iterator operator--(int)
Definition marvin_StrideView.h:129
iterator(pointer ptr)
Definition marvin_StrideView.h:70
friend bool operator>(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:193
T value_type
Definition marvin_StrideView.h:55
friend bool operator<(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:183
iterator operator++(int)
Definition marvin_StrideView.h:110
friend bool operator<=(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:203
reference operator*() const
Definition marvin_StrideView.h:85
T & reference
Definition marvin_StrideView.h:58
iterator & operator++()
Definition marvin_StrideView.h:101
friend bool operator!=(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:173
pointer operator->() const
Definition marvin_StrideView.h:93
friend iterator operator-(const iterator &iter, difference_type n)
Definition marvin_StrideView.h:245
friend bool operator>=(const iterator &lhs, const iterator &rhs)
Definition marvin_StrideView.h:213
const T & operator[](size_t idx) const
Definition marvin_StrideView.h:538
size_t size() const noexcept
Definition marvin_StrideView.h:516
std::span< T > underlying()
Definition marvin_StrideView.h:607
const_iterator end() const
Definition marvin_StrideView.h:585
StrideView(T *data, size_t size)
Definition marvin_StrideView.h:487
const_iterator cend() const
Definition marvin_StrideView.h:596
StrideView(Iter begin, Iter end)
Definition marvin_StrideView.h:498
T & operator[](size_t idx)
Definition marvin_StrideView.h:527
const_iterator cbegin() const
Definition marvin_StrideView.h:565
const_iterator begin() const
Definition marvin_StrideView.h:556
iterator begin()
Definition marvin_StrideView.h:547
StrideView(std::span< T > arrayLike)
Definition marvin_StrideView.h:509
iterator end()
Definition marvin_StrideView.h:574
Views, wrappers and custom containers.
Definition marvin_BufferView.h:15