Iros
 
Loading...
Searching...
No Matches
vec.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/meta/compare.h"
10#include "di/meta/core.h"
11#include "di/meta/operations.h"
12#include "di/types/integers.h"
14#include "di/util/forward.h"
17
19namespace detail {
20 struct NoopMixin {};
21
22 template<typename T>
23 struct MixinHelper : meta::TypeConstant<NoopMixin> {};
24
25 template<typename T>
26 requires(requires { typename T::Mixin; })
27 struct MixinHelper<T> : meta::TypeConstant<typename T::Mixin> {};
28
29 template<typename T>
31
32 template<typename T>
33 concept Tag = requires {
34 typename T::Type;
35 typename Constexpr<T::extent>;
36 } && concepts::SameAs<decltype(T::extent), usize const>;
37
38 template<Tag T>
39 constexpr inline auto extent = T::extent;
40
41 template<typename T>
42 struct SignedTHelper : meta::TypeConstant<meta::MakeSigned<meta::Type<T>>> {};
43
44 template<typename T>
45 requires(requires { typename T::SignedT; })
46 struct SignedTHelper<T> : meta::TypeConstant<typename T::SignedT> {};
47
48 template<Tag T>
50}
51
52template<detail::Tag Tag>
53class Vec
54 : public detail::Mixin<Tag>
55 , public util::AddMemberGet<Vec<Tag>> {
56private:
57 using T = meta::Type<Tag>;
58 using SignedT = detail::SignedT<Tag>;
59 constexpr static auto extent = detail::extent<Tag>;
60
61 using Storage = di::Array<T, extent>;
62
63public:
66 = default;
67
68 template<concepts::ConvertibleTo<T>... Ts>
69 requires(sizeof...(Ts) == extent)
70 constexpr Vec(Ts&&... values) : m_values { T(di::forward<Ts>(values))... } {}
71
72 constexpr auto values() -> Storage& { return m_values; }
73 constexpr auto values() const -> Storage const& { return m_values; }
74
75 constexpr auto begin() { return values().begin(); }
76 constexpr auto begin() const { return values().begin(); }
77
78 constexpr auto end() { return values().end(); }
79 constexpr auto end() const { return values().end(); }
80
81 constexpr auto operator+=(Vec const& other) -> Vec& {
82 for (auto [a, b] : di::zip(*this, other)) {
83 a += b;
84 }
85 return *this;
86 }
87 constexpr auto operator+=(T const& value) -> Vec& {
88 for (auto& x : *this) {
89 x += value;
90 }
91 return *this;
92 }
93 constexpr auto operator+=(SignedT const& value) -> Vec& requires(!di::SameAs<SignedT, T>) {
94 for (auto& x : *this) {
95 x += value;
96 }
97 return *this;
98 }
99
100 constexpr auto operator-=(Vec const& other) -> Vec& {
101 for (auto [a, b] : di::zip(*this, other)) {
102 a -= b;
103 }
104 return *this;
105 }
106 constexpr auto operator-=(T const& value) -> Vec& {
107 for (auto& x : *this) {
108 x -= value;
109 }
110 return *this;
111 }
112 constexpr auto operator-=(SignedT const& value) -> Vec& requires(!di::SameAs<SignedT, T>) {
113 for (auto& x : *this) {
114 x -= value;
115 }
116 return *this;
117 }
118
119 constexpr auto operator*=(T const& value) -> Vec& {
120 for (auto& x : *this) {
121 x *= value;
122 }
123 return *this;
124 }
125
126 constexpr auto operator/=(T const& value) -> Vec& {
127 for (auto& x : *this) {
128 x /= value;
129 }
130 return *this;
131 }
132
133 constexpr friend auto operator==(Vec const& a, Vec const& b) -> bool
135 {
136 return a.values() == b.values();
137 }
138 constexpr friend auto operator<=>(Vec const& a, Vec const& b)
140 {
141 return a.values() <=> b.values();
142 }
143
144private:
145 constexpr friend auto operator+(Vec const& a, Vec const& b) -> Vec
146 requires(concepts::Copyable<T>)
147 {
148 auto result = a;
149 result += b;
150 return result;
151 }
152 constexpr friend auto operator+(Vec const& a, T const& b) -> Vec
153 requires(concepts::Copyable<T>)
154 {
155 auto result = a;
156 result += b;
157 return result;
158 }
159 constexpr friend auto operator+(Vec const& a, SignedT const& b) -> Vec
160 requires(concepts::Copyable<T> && !di::SameAs<T, SignedT>)
161 {
162 auto result = a;
163 result += b;
164 return result;
165 }
166 constexpr friend auto operator+(T const& b, Vec const& a) -> Vec
167 requires(concepts::Copyable<T>)
168 {
169 auto result = a;
170 result += b;
171 return result;
172 }
173 constexpr friend auto operator+(SignedT const& b, Vec const& a) -> Vec
174 requires(concepts::Copyable<T> && !di::SameAs<T, SignedT>)
175 {
176 auto result = a;
177 result += b;
178 return result;
179 }
180
181 constexpr friend auto operator-(Vec const& a, Vec const& b) -> Vec
182 requires(concepts::Copyable<T>)
183 {
184 auto result = a;
185 result -= b;
186 return result;
187 }
188 constexpr friend auto operator-(Vec const& a, T const& b) -> Vec
189 requires(concepts::Copyable<T>)
190 {
191 auto result = a;
192 result -= b;
193 return result;
194 }
195 constexpr friend auto operator-(Vec const& a, SignedT const& b) -> Vec
196 requires(concepts::Copyable<T> && !di::SameAs<T, SignedT>)
197 {
198 auto result = a;
199 result -= b;
200 return result;
201 }
202 constexpr friend auto operator-(T const& b, Vec const& a) -> Vec
203 requires(concepts::Copyable<T>)
204 {
205 auto result = a;
206 result -= b;
207 return result;
208 }
209 constexpr friend auto operator-(SignedT const& b, Vec const& a) -> Vec
210 requires(concepts::Copyable<T> && !di::SameAs<T, SignedT>)
211 {
212 auto result = a;
213 result -= b;
214 return result;
215 }
216
217 constexpr friend auto operator*(Vec const& a, T const& b) -> Vec {
218 auto result = a;
219 a *= b;
220 return a;
221 }
222 constexpr friend auto operator*(T const& b, Vec& a) -> Vec {
223 auto result = a;
224 a *= b;
225 return a;
226 }
227
228 constexpr friend auto operator/(Vec const& a, T const& b) -> Vec {
229 auto result = a;
230 a /= b;
231 return a;
232 }
233 constexpr friend auto operator/(T const& b, Vec& a) -> Vec {
234 auto result = a;
235 a /= b;
236 return a;
237 }
238
239 auto tag_invoke(di::Tag<di::size>, Vec const& self) { return self.values().size(); }
240
241 constexpr friend auto tag_invoke(di::Tag<vocab::tuple_size>, di::InPlaceType<Vec>) { return extent; }
242
243 template<usize index>
244 requires(index < extent)
249
250 template<usize index>
251 requires(index < extent)
256
257 template<concepts::DecaySameAs<Vec> Self, usize index>
258 requires(index < extent)
259 constexpr friend auto tag_invoke(di::Tag<util::get_in_place>, Constexpr<index>, Self&& self) -> decltype(auto) {
260 return di::forward_like<Self>(self.values()[index]);
261 }
262
263 di::Array<T, extent> m_values {};
264};
265}
Definition vec.h:55
constexpr friend auto operator+(Vec const &a, T const &b) -> Vec requires(concepts::Copyable< T >)
Definition vec.h:152
constexpr friend auto operator*(T const &b, Vec &a) -> Vec
Definition vec.h:222
constexpr auto values() const -> Storage const &
Definition vec.h:73
constexpr friend auto operator-(Vec const &a, T const &b) -> Vec requires(concepts::Copyable< T >)
Definition vec.h:188
constexpr auto operator/=(T const &value) -> Vec &
Definition vec.h:126
constexpr auto operator+=(SignedT const &value) -> Vec &requires(!di::SameAs< SignedT, T >)
Definition vec.h:93
constexpr auto operator-=(Vec const &other) -> Vec &
Definition vec.h:100
constexpr friend auto operator+(T const &b, Vec const &a) -> Vec requires(concepts::Copyable< T >)
Definition vec.h:166
constexpr friend auto operator-(SignedT const &b, Vec const &a) -> Vec requires(concepts::Copyable< T > &&!di::SameAs< T, SignedT >)
Definition vec.h:209
constexpr auto operator+=(T const &value) -> Vec &
Definition vec.h:87
constexpr friend auto tag_invoke(di::Tag< vocab::tuple_element >, di::InPlaceType< Vec const >, Constexpr< index >) -> InPlaceType< T const >
Definition vec.h:252
constexpr friend auto operator==(Vec const &a, Vec const &b) -> bool requires(concepts::EqualityComparable< T >)
Definition vec.h:133
constexpr friend auto operator+(SignedT const &b, Vec const &a) -> Vec requires(concepts::Copyable< T > &&!di::SameAs< T, SignedT >)
Definition vec.h:173
constexpr auto begin() const
Definition vec.h:76
constexpr auto operator*=(T const &value) -> Vec &
Definition vec.h:119
constexpr auto operator+=(Vec const &other) -> Vec &
Definition vec.h:81
constexpr auto operator-=(SignedT const &value) -> Vec &requires(!di::SameAs< SignedT, T >)
Definition vec.h:112
constexpr friend auto operator+(Vec const &a, SignedT const &b) -> Vec requires(concepts::Copyable< T > &&!di::SameAs< T, SignedT >)
Definition vec.h:159
constexpr auto begin()
Definition vec.h:75
constexpr auto end()
Definition vec.h:78
constexpr friend auto tag_invoke(di::Tag< util::get_in_place >, Constexpr< index >, Self &&self) -> decltype(auto)
Definition vec.h:259
constexpr friend auto operator-(Vec const &a, SignedT const &b) -> Vec requires(concepts::Copyable< T > &&!di::SameAs< T, SignedT >)
Definition vec.h:195
constexpr friend auto operator*(Vec const &a, T const &b) -> Vec
Definition vec.h:217
constexpr friend auto tag_invoke(di::Tag< vocab::tuple_size >, di::InPlaceType< Vec >)
Definition vec.h:241
constexpr friend auto operator-(T const &b, Vec const &a) -> Vec requires(concepts::Copyable< T >)
Definition vec.h:202
constexpr friend auto operator/(T const &b, Vec &a) -> Vec
Definition vec.h:233
constexpr friend auto operator+(Vec const &a, Vec const &b) -> Vec requires(concepts::Copyable< T >)
Definition vec.h:145
constexpr friend auto tag_invoke(di::Tag< vocab::tuple_element >, di::InPlaceType< Vec >, Constexpr< index >) -> InPlaceType< T >
Definition vec.h:245
constexpr friend auto operator-(Vec const &a, Vec const &b) -> Vec requires(concepts::Copyable< T >)
Definition vec.h:181
constexpr Vec(Ts &&... values)
Definition vec.h:70
constexpr auto values() -> Storage &
Definition vec.h:72
constexpr auto end() const
Definition vec.h:79
constexpr friend auto operator/(Vec const &a, T const &b) -> Vec
Definition vec.h:228
constexpr friend auto operator<=>(Vec const &a, Vec const &b)
Definition vec.h:138
constexpr auto operator-=(T const &value) -> Vec &
Definition vec.h:106
Definition operations.h:40
Definition operations.h:27
Definition compare.h:82
Definition core.h:114
Definition compare.h:91
Definition vec.h:19
meta::Type< SignedTHelper< T > > SignedT
Definition vec.h:49
constexpr auto extent
Definition vec.h:39
meta::Type< MixinHelper< T > > Mixin
Definition vec.h:30
Definition vec.h:18
Definition merge_interfaces.h:6
T::Type Type
Definition core.h:26
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
A wrapper for a constexpr value.
Definition core.h:77
Definition core.h:18
Definition in_place_type.h:5
Definition add_member_get.h:10
Definition span_fixed_size.h:37