21#include "argon/argon_full.hpp"
22#include "argon/helpers/size.hpp"
23#include "arm_simd/helpers/vec128.hpp"
25#ifdef __ARM_FEATURE_MVE
31namespace argon::vectorize {
35template <
typename ScalarType>
36struct load : std::ranges::view_interface<load<ScalarType>> {
50 LoadIterator() =
default;
80 LoadIterator tmp = *
this;
95 LoadIterator tmp = *
this;
111 LoadIterator it = *
this;
120 LoadIterator it = *
this;
128 LoadIterator&
operator[](
int n)
const {
return *(*
this + n); }
139 friend LoadIterator
operator+(
const int n,
const LoadIterator& it) {
return it + n; }
142 friend bool operator==(
const LoadIterator& a,
const LoadIterator& b) {
return a.ptr_ == b.ptr_; }
145 friend bool operator==(
const LoadIterator& a,
const ScalarType*
ptr) {
return a.ptr_ ==
ptr; }
148 friend bool operator!=(
const LoadIterator& a,
const LoadIterator& b) {
return a.ptr_ != b.ptr_; }
151 friend bool operator!=(
const LoadIterator& a,
const ScalarType*
ptr) {
return a.ptr_ !=
ptr; }
154 friend auto operator<=>(
const LoadIterator& a,
const LoadIterator& b) {
return a.ptr_ <=> b.ptr_; }
157 const ScalarType* ptr_;
159 static_assert(std::sized_sentinel_for<LoadIterator, LoadIterator>);
160 static_assert(std::bidirectional_iterator<LoadIterator>);
161 static_assert(std::input_iterator<LoadIterator>);
172 const ScalarType*
end() {
return start_ + (size_ *
lanes); }
176 size_t size()
const {
return size_; }
181 template <std::ranges::contiguous_range R>
187 load(
const std::span<ScalarType> span)
188 : start_{span.data()}, size_{
helpers::vectorizeable_size<ScalarType>(span.
size()) /
lanes} {}
191 const ScalarType* start_;
195static_assert(std::ranges::range<load<int32_t>>);
196static_assert(std::ranges::view<load<int32_t>>);
197static_assert(std::movable<load<int32_t>>);
198static_assert(std::ranges::viewable_range<load<int32_t>>);
200template <std::ranges::contiguous_range R>
201load(R&& r) -> load<std::remove_cv_t<std::ranges::range_value_t<R>>>;
203template <
typename ScalarType>
204load(
const std::span<ScalarType>) -> load<std::remove_cv_t<ScalarType>>;
Definition argon_full.hpp:24
Contains helper templates and concepts for type manipulation and compile-time utilities.
Definition helpers.hpp:12
typename ArgonFor< std::remove_cv_t< T > >::type ArgonFor_t
Helper alias to get the Argon type for a given vector type.
Definition argon_for.hpp:45
Lane deconstruction feature.
Definition argon_full.hpp:302
The Iterator type for the range.
Definition load.hpp:44
LoadIterator & operator+=(int n)
Increments the iterator by a number of steps.
Definition load.hpp:64
friend bool operator!=(const LoadIterator &a, const LoadIterator &b)
Compares LoadIterators for inequality.
Definition load.hpp:148
LoadIterator operator+(int n) const
Adds an integer to the iterator and returns a new iterator.
Definition load.hpp:110
Argon< ScalarType > operator*() const
Dereferences the iterator to get the SIMD vector.
Definition load.hpp:59
LoadIterator operator++(int)
Postfix increment operator.
Definition load.hpp:79
friend bool operator==(const LoadIterator &a, const ScalarType *ptr)
Compares LoadIterators for equality.
Definition load.hpp:145
std::bidirectional_iterator_tag iterator_category
The iterator category.
Definition load.hpp:45
LoadIterator & operator-=(int n)
Decrements the iterator by a number of steps.
Definition load.hpp:72
LoadIterator & operator++()
Prefix increment operator.
Definition load.hpp:87
std::ptrdiff_t difference_type
The difference type.
Definition load.hpp:46
friend LoadIterator operator+(const int n, const LoadIterator &it)
Adds an integer to the iterator and returns a new iterator.
Definition load.hpp:139
friend bool operator==(const LoadIterator &a, const LoadIterator &b)
Compares LoadIterators for equality.
Definition load.hpp:142
LoadIterator & operator--()
Prefix decrement operator.
Definition load.hpp:102
friend bool operator!=(const LoadIterator &a, const ScalarType *ptr)
Compares LoadIterators for inequality.
Definition load.hpp:151
LoadIterator operator--(int)
Postfix decrement operator.
Definition load.hpp:94
LoadIterator operator-(int n) const
Subtracts an integer from the iterator and returns a new iterator.
Definition load.hpp:119
difference_type operator-(const LoadIterator &other) const
Calculates the difference between two iterators.
Definition load.hpp:133
helpers::ArgonFor_t< intrinsic_type > value_type
The value type of the iterator.
Definition load.hpp:47
LoadIterator(const ScalarType *ptr)
Constructs a LoadIterator from a pointer to the data.
Definition load.hpp:54
friend auto operator<=>(const LoadIterator &a, const LoadIterator &b)
Compares LoadIterators.
Definition load.hpp:154
LoadIterator & operator[](int n) const
Accesses the element at the given index.
Definition load.hpp:128
const ScalarType * end()
Returns an iterator to the end of the range.
Definition load.hpp:172
size_t size() const
Returns the size of the range.
Definition load.hpp:176
load(R &&r)
Construct a load from a range.
Definition load.hpp:182
static constexpr size_t lanes
The number of lanes in the SIMD vector.
Definition load.hpp:38
const ScalarType * sentinel
The sentinel type for the range.
Definition load.hpp:164
iterator begin()
Returns an iterator to the beginning of the range.
Definition load.hpp:168
load(const std::span< ScalarType > span)
Construct a load from a span.
Definition load.hpp:187
LoadIterator iterator
The iterator type for the range.
Definition load.hpp:163
simd::Vec128_t< ScalarType > intrinsic_type
The SIMD vector type.
Definition load.hpp:37