23 struct LoadInterleavedIterator {
24 using iterator_category = std::bidirectional_iterator_tag;
25 using difference_type = std::ptrdiff_t;
26 using reference_type = LoadInterleavedIterator&;
27 using value_type = std::array<Argon<ScalarType>, Stride>;
29 LoadInterleavedIterator() =
default;
30 LoadInterleavedIterator(
const ScalarType*
ptr) : ptr_{
ptr} {}
32 std::array<Argon<ScalarType>, Stride> operator*()
const {
36 LoadInterleavedIterator& operator+=(
int n) {
37 ptr_ += n * lanes * Stride;
41 LoadInterleavedIterator& operator-=(
int n) {
42 ptr_ -= n * lanes * Stride;
46 LoadInterleavedIterator operator++(
int) {
47 LoadInterleavedIterator tmp = *
this;
52 LoadInterleavedIterator& operator++() {
53 ptr_ += lanes * Stride;
57 LoadInterleavedIterator operator--(
int) {
58 LoadInterleavedIterator tmp = *
this;
63 LoadInterleavedIterator& operator--() {
64 ptr_ -= lanes * Stride;
68 LoadInterleavedIterator operator+(
int n)
const {
69 LoadInterleavedIterator it = *
this;
74 LoadInterleavedIterator operator-(
int n)
const {
75 LoadInterleavedIterator it = *
this;
80 LoadInterleavedIterator& operator[](
int n)
const {
return *(*
this + n); }
82 difference_type operator-(
const LoadInterleavedIterator& other)
const {
return ptr_ - other.ptr_; }
84 friend bool operator==(
const LoadInterleavedIterator& a,
const LoadInterleavedIterator& b) {
85 return a.ptr_ == b.ptr_;
87 friend bool operator==(
const LoadInterleavedIterator& a,
const ScalarType*
ptr) {
return a.ptr_ ==
ptr; }
88 friend bool operator!=(
const LoadInterleavedIterator& a,
const LoadInterleavedIterator& b) {
89 return a.ptr_ != b.ptr_;
91 friend bool operator!=(
const LoadInterleavedIterator& a,
const ScalarType*
ptr) {
return a.ptr_ !=
ptr; }
92 friend auto operator<=>(
const LoadInterleavedIterator& a,
const LoadInterleavedIterator& b) {
93 return a.ptr_ <=> b.ptr_;
96 friend LoadInterleavedIterator operator+(
const int n,
const LoadInterleavedIterator& it) {
return it + n; }
99 const ScalarType* ptr_;
113 load_interleaved(R&& r) : start_{&*
std::ranges::begin(r)}, size_{vectorizeable_size(
std::ranges::size(r))} {}