23 struct StoreInterleavedIterator {
24 using difference_type = std::ptrdiff_t;
25 using reference_type = StoreInterleavedIterator&;
27 StoreInterleavedIterator() =
default;
28 StoreInterleavedIterator(scalar_type*
ptr) : ptr_{
ptr} {}
30 std::array<Argon<scalar_type>, stride>& operator*() {
return vecs_; }
32 StoreInterleavedIterator& operator++() {
33 argon::store_interleaved(ptr_, vecs_);
34 ptr_ += lanes * stride;
39 StoreInterleavedIterator operator++(
int) {
40 StoreInterleavedIterator tmp = *
this;
45 StoreInterleavedIterator& operator--() {
46 ptr_ -= lanes * stride;
51 StoreInterleavedIterator operator--(
int) {
52 StoreInterleavedIterator tmp = *
this;
57 difference_type operator-(
const StoreInterleavedIterator& other)
const {
return ptr_ - other.ptr_; }
59 friend bool operator==(
const StoreInterleavedIterator& a,
const StoreInterleavedIterator& b) {
60 return a.ptr_ == b.ptr_;
62 friend bool operator==(
const StoreInterleavedIterator& a,
const scalar_type*
ptr) {
return a.ptr_ ==
ptr; }
63 friend bool operator!=(
const StoreInterleavedIterator& a,
const StoreInterleavedIterator& b) {
64 return a.ptr_ != b.ptr_;
66 friend bool operator!=(
const StoreInterleavedIterator& a,
const scalar_type*
ptr) {
return a.ptr_ !=
ptr; }
67 friend auto operator<=>(
const StoreInterleavedIterator& a,
const StoreInterleavedIterator& b) {
68 return a.ptr_ <=> b.ptr_;
72 std::array<Argon<scalar_type>, stride> vecs_;
85 store_interleaved(R&& r) : start_{&*
std::ranges::begin(r)}, size_{vectorizeable_size(
std::ranges::size(r))} {}