Argon 0.1.0
Loading...
Searching...
No Matches
store.hpp
1#pragma once
2#include <iterator>
3#include <ranges>
4#include "argon.hpp"
5#include "argon/argon_full.hpp"
6#include "arm_simd/helpers/vec128.hpp"
7
8#ifdef __ARM_FEATURE_MVE
9#define simd mve
10#else
11#define simd neon
12#endif
13
14namespace argon::vectorize {
15
16template <typename ScalarType>
17struct store : std::ranges::view_interface<store<ScalarType>> {
18 using intrinsic_type = simd::Vec128_t<ScalarType>;
19 static constexpr size_t lanes = sizeof(intrinsic_type) / sizeof(ScalarType);
20 static constexpr size_t vectorizeable_size(size_t size) { return size & ~(lanes - 1); }
21
22 public:
23 struct StoreIterator {
24 using iterator_category = std::input_iterator_tag;
25 using difference_type = std::ptrdiff_t;
26 using value_type = Argon<ScalarType>;
27
28 StoreIterator() = default;
29 StoreIterator(ScalarType* ptr) : ptr_{ptr} {}
30
31 Argon<ScalarType>& operator*() { return vec_; }
32 const Argon<ScalarType>& operator*() const { return vec_; }
33
34 StoreIterator& operator+=(int n) {
35 vec_.StoreTo(ptr_);
36 ptr_ += n * lanes;
37 vec_ = {};
38 return *this;
39 }
40
41 StoreIterator& operator-=(int n) {
42 vec_.StoreTo(ptr_);
43 ptr_ -= n * lanes;
44 vec_ = {};
45 return *this;
46 }
47
48 StoreIterator operator++(int) {
49 StoreIterator tmp = *this;
50 ++(*this);
51 return tmp;
52 }
53
54 StoreIterator operator--(int) {
55 StoreIterator tmp = *this;
56 --(*this);
57 return tmp;
58 }
59
60 StoreIterator& operator++() {
61 vec_.StoreTo(ptr_);
62 ptr_ += lanes;
63 vec_ = {};
64 return *this;
65 }
66
67 StoreIterator& operator--() {
68 vec_.StoreTo(ptr_);
69 ptr_ -= lanes;
70 vec_ = {};
71 return *this;
72 }
73
77 StoreIterator operator+(int n) const {
78 StoreIterator it = *this;
79 it += n;
80 return it;
81 }
82
86 StoreIterator operator-(int n) const {
87 StoreIterator it = *this;
88 it -= n;
89 return it;
90 }
91
92 difference_type operator-(const StoreIterator& other) const { return ptr_ - other.ptr_; }
93
98 friend StoreIterator operator+(const int n, const StoreIterator& it) { return it + n; }
99
100 friend bool operator==(const StoreIterator& a, const StoreIterator& b) { return a.ptr_ == b.ptr_; }
101 friend bool operator==(const StoreIterator& a, const ScalarType* ptr) { return a.ptr_ == ptr; }
102 friend bool operator!=(const StoreIterator& a, const StoreIterator& b) { return a.ptr_ != b.ptr_; }
103 friend bool operator!=(const StoreIterator& a, const ScalarType* ptr) { return a.ptr_ != ptr; }
104 friend auto operator<=>(const StoreIterator& a, const StoreIterator& b) { return a.ptr_ <=> b.ptr_; }
105
106 private:
107 Argon<ScalarType> vec_{};
108 ScalarType* ptr_ = nullptr;
109 };
110 static_assert(std::sized_sentinel_for<StoreIterator, StoreIterator>);
111 static_assert(std::output_iterator<StoreIterator, Argon<ScalarType>>);
112
113 using iterator = StoreIterator;
114
115 iterator begin() { return start_; }
116 ScalarType* end() { return start_ + size_; }
117 size_t size() const { return size_ / lanes; }
118
119 template <std::ranges::contiguous_range R>
120 store(R&& r) : start_{&*std::ranges::begin(r)}, size_{vectorizeable_size(std::ranges::size(r))} {}
121
122 private:
123 ScalarType* start_;
124 size_t size_;
125};
126static_assert(std::ranges::range<store<int32_t>>);
127static_assert(std::ranges::view<store<int32_t>>);
128static_assert(std::movable<store<int32_t>>);
129static_assert(std::ranges::viewable_range<store<int32_t>>);
130
131template <std::ranges::contiguous_range R>
133
134template <typename ScalarType>
135store(const std::span<ScalarType>) -> store<ScalarType>;
136
137} // namespace argon::vectorize
138#undef simd
Definition argon_full.hpp:24
Definition ptr.hpp:74
friend StoreIterator operator+(const int n, const StoreIterator &it)
Adds an integer to the iterator and returns a new iterator.
Definition store.hpp:98
StoreIterator operator+(int n) const
Adds an integer to the iterator and returns a new iterator.
Definition store.hpp:77
std::input_iterator_tag iterator_category
The iterator category.
Definition store.hpp:24
StoreIterator operator-(int n) const
Subtracts an integer from the iterator and returns a new iterator.
Definition store.hpp:86
Definition store.hpp:17