MostlyHarmless 0.0.1
 
Loading...
Searching...
No Matches
marvin_StrideView.h
Go to the documentation of this file.
1// ========================================================================================================
2// _______ _______ ______ ___ ___ _______ _______
3// | | | _ | __ \ | |_ _| | |
4// | | | < | |_| |_| |
5// |__|_|__|___|___|___|__|\_____/|_______|__|____|
6//
7// This file is part of the Marvin open source library and is licensed under the terms of the MIT License.
8//
9// ========================================================================================================
10
11#ifndef MARVIN_STRIDED_VIEW
12#define MARVIN_STRIDED_VIEW
13#include <type_traits>
14#include <iterator>
15#include <span>
16#include <vector>
17namespace marvin::containers {
46 template <typename T, size_t Stride>
47 requires(Stride > 0)
48 class StrideView final {
49 public:
53 class iterator final {
54 public:
55 using value_type = T;
56 using difference_type = std::ptrdiff_t;
57 using pointer = T*;
58 using reference = T&;
59 using iterator_category = std::forward_iterator_tag;
60
64 iterator() = delete;
65
70 iterator(pointer ptr) : m_internal(ptr) {
71 }
72
77 operator bool() const {
78 return m_internal;
79 }
80
86 return *m_internal;
87 }
88
94 return m_internal;
95 }
96
102 m_internal += Stride;
103 return *this;
104 }
105
111 auto temp = *this;
112 m_internal += Stride;
113 return temp;
114 }
115
121 m_internal -= Stride;
122 return *this;
123 }
124
130 auto temp = *this;
131 m_internal -= Stride;
132 return temp;
133 }
134
141 const auto stridedN = Stride * n;
142 m_internal += stridedN;
143 return *this;
144 }
145
152 const auto stridedN = Stride * n;
153 m_internal -= stridedN;
154 return *this;
155 }
156
163 friend bool operator==(const iterator& lhs, const iterator& rhs) {
164 return lhs.m_internal == rhs.m_internal;
165 }
166
173 friend bool operator!=(const iterator& lhs, const iterator& rhs) {
174 return !(operator==(lhs, rhs));
175 }
176
183 friend bool operator<(const iterator& lhs, const iterator& rhs) {
184 return lhs.m_internal < rhs.m_internal;
185 }
186
193 friend bool operator>(const iterator& lhs, const iterator& rhs) {
194 return lhs.m_internal > rhs.m_internal;
195 }
196
203 friend bool operator<=(const iterator& lhs, const iterator& rhs) {
204 return lhs.m_internal <= rhs.m_internal;
205 }
206
213 friend bool operator>=(const iterator& lhs, const iterator& rhs) {
214 return lhs.m_internal >= rhs.m_internal;
215 }
216
224 iterator temp = iter;
225 temp += n;
226 return temp;
227 }
228
236 return iter + n;
237 }
238
246 iterator temp = iter;
247 temp -= n;
248 return temp;
249 }
250
257 friend difference_type operator-(const iterator& lhs, const iterator& rhs) {
258 return lhs.m_internal - rhs.m_internal;
259 }
260
261 private:
262 T* m_internal{ nullptr };
263 };
264
269 public:
270 using value_type = T;
271 using difference_type = std::ptrdiff_t;
272 using pointer = T*;
273 using reference = T&;
274 using iterator_category = std::forward_iterator_tag;
275
279 const_iterator() = delete;
280
285 const_iterator(pointer ptr) : m_internal(ptr) {
286 }
287
292 operator bool() const {
293 return m_internal;
294 }
295
300 const T& operator*() const {
301 return *m_internal;
302 }
303
308 const T* operator->() const {
309 return m_internal;
310 }
311
317 m_internal += Stride;
318 return *this;
319 }
320
326 auto temp = *this;
327 m_internal += Stride;
328 return temp;
329 }
330
336 m_internal -= Stride;
337 return *this;
338 }
339
345 auto temp = *this;
346 m_internal -= Stride;
347 return *this;
348 }
349
356 const auto stridedDiff = n * Stride;
357 m_internal += stridedDiff;
358 return *this;
359 }
360
367 const auto stridedDiff = n * Stride;
368 m_internal -= stridedDiff;
369 return *this;
370 }
371
378 friend bool operator==(const const_iterator& lhs, const const_iterator& rhs) {
379 return lhs.m_internal == rhs.m_internal;
380 }
381
388 friend bool operator!=(const const_iterator& lhs, const const_iterator& rhs) {
389 return lhs.m_internal != rhs.m_internal;
390 }
391
398 friend bool operator<(const const_iterator& lhs, const const_iterator& rhs) {
399 return lhs.m_internal < rhs.m_internal;
400 }
401
408 friend bool operator>(const const_iterator& lhs, const const_iterator& rhs) {
409 return lhs.m_internal > rhs.m_internal;
410 }
411
418 friend bool operator<=(const const_iterator& lhs, const const_iterator& rhs) {
419 return lhs.m_internal <= rhs.m_internal;
420 }
421
428 friend bool operator>=(const const_iterator& lhs, const const_iterator& rhs) {
429 return lhs.m_internal >= rhs.m_internal;
430 }
431
439 const_iterator temp = iter;
440 temp += n;
441 return temp;
442 }
443
451 return iter + n;
452 }
453
461 const_iterator temp = iter;
462 temp -= n;
463 return temp;
464 }
465
472 friend const_iterator operator-(const const_iterator& lhs, const const_iterator& rhs) {
473 return lhs.m_internal - rhs.m_internal;
474 }
475
476
477 private:
478 pointer m_internal{ nullptr };
479 };
480
481
487 StrideView(T* data, size_t size) : m_internalView(data, size) {
488 }
489
496 template <std::input_or_output_iterator Iter>
497 requires std::is_same_v<typename Iter::value_type, T>
498 StrideView(Iter begin, Iter end) {
499 // Apple clang don't have a constructor for spans that takes iterators yet...
500 const auto size = static_cast<size_t>(std::distance(begin, end));
501 const auto data = &(*begin);
502 m_internalView = { data, size };
503 }
504
509 explicit StrideView(std::span<T> arrayLike) : m_internalView(arrayLike) {
510 }
511
516 [[nodiscard]] size_t size() const noexcept {
517 const auto stridedSize = m_internalView.size() / Stride;
518 return stridedSize;
519 }
520
527 T& operator[](size_t idx) {
528 const auto stridedIdx = Stride * idx;
529 return m_internalView[stridedIdx];
530 }
531
538 const T& operator[](size_t idx) const {
539 const auto stridedIdx = Stride * idx;
540 return m_internalView[stridedIdx];
541 }
542
548 auto* ptr = &(*m_internalView.begin());
549 return iterator{ ptr };
550 }
551
557 auto* ptr = &(*m_internalView.begin());
558 return const_iterator{ ptr };
559 }
560
566 auto* ptr = &(*m_internalView.begin());
567 return const_iterator{ ptr };
568 }
569
575 auto beginIt = begin();
576 const auto endIndex = static_cast<std::ptrdiff_t>(m_internalView.size() / Stride);
577 auto endIt = beginIt + endIndex;
578 return endIt;
579 }
580
586 auto beginIt = begin();
587 const auto endIndex = static_cast<std::ptrdiff_t>(m_internalView.size() / Stride);
588 auto endIt = beginIt + endIndex;
589 return endIt;
590 }
591
597 auto beginIt = cbegin();
598 const auto endIndex = static_cast<std::ptrdiff_t>(m_internalView.size() / Stride);
599 auto endIt = beginIt + endIndex;
600 return endIt;
601 }
602
607 [[nodiscard]] std::span<T> underlying() {
608 return m_internalView;
609 }
610
611 private:
612 std::span<T> m_internalView{};
613 };
614} // namespace marvin::containers
615
616#endif
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