Air-Trap 1.0.0
A multiplayer R-Type clone game engine built with C++23 and ECS architecture
Loading...
Searching...
No Matches
VecBase.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** R-Type
4** File description:
5** VecBase.hpp, CRTP base vector class declaration
6*/
7
8/*
9** MIT License
10**
11** Copyright (c) 2025 Robin Toillon
12**
13** Permission is hereby granted, free of charge, to any person obtaining
14** a copy of this software and associated documentation files (the
15** "Software"), to deal in the Software without restriction, including
16** without limitation the rights to use, copy, modify, merge, publish,
17** distribute, sublicense, and/or sell copies of the Software, and to
18** permit persons to whom the Software is furnished to do so, subject to
19** the following conditions:
20**
21** The above copyright notice and this permission notice shall be
22** included in all copies or substantial portions of the Software.
23**
24** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31*/
32
39#ifndef RTYPE_VECBASE_HPP_
40 #define RTYPE_VECBASE_HPP_
41
43
44 #include <cmath>
45 #include <iostream>
46
47namespace rtp::details
48{
49
59 template <Numeric T, std::size_t N>
60 struct VecBase {
61 using RealT = std::conditional_t<std::is_integral_v<T>, double, T>;
62
63 template <typename Self>
64 [[nodiscard]]
65 constexpr auto squaredDistance(this const Self &self,
66 const std::remove_cvref_t<Self> &other) noexcept
67 -> T;
68
69 template <typename Self>
70 [[nodiscard]]
71 constexpr auto distance(this const Self &self,
72 const std::remove_cvref_t<Self> &other) noexcept
73 -> RealT;
74
75 template <typename Self>
76 [[nodiscard]]
77 constexpr auto squaredLength(this const Self &self) noexcept -> T;
78
79 template <typename Self>
80 [[nodiscard]]
81 constexpr auto length(this const Self &self) noexcept -> RealT;
82
83 template <typename Self>
84 [[nodiscard]]
85 constexpr auto normalize(this Self &self) noexcept -> Self &
86 requires std::floating_point<T>;
87
88 template <typename Self>
89 [[nodiscard]]
90 constexpr auto normalized(this const Self &self) noexcept
91 -> std::remove_cvref_t<Self>
92 requires std::floating_point<T>;
93
94 template <typename Self>
95 [[nodiscard]]
96 constexpr auto dot(this const Self &self,
97 const std::remove_cvref_t<Self> &other) noexcept
98 -> T;
99
100 template <typename Self>
101 [[nodiscard]]
102 constexpr auto project(this const Self &self,
103 const std::remove_cvref_t<Self> &other) noexcept
104 -> std::remove_cvref_t<Self>
105 requires std::floating_point<T>;
106
108 // Vector & Vector operations (Member Operators)
110
111 template <typename Self>
112 constexpr auto &operator+=(this Self &self,
113 const std::remove_cvref_t<Self> &other) noexcept;
114
115 template <typename Self>
116 constexpr auto &operator-=(this Self &self,
117 const std::remove_cvref_t<Self> &other) noexcept;
118
119 template <typename Self>
120 constexpr auto &operator*=(this Self &self,
121 const std::remove_cvref_t<Self> &other) noexcept;
122
123 template <typename Self>
124 constexpr auto &operator/=(this Self &self,
125 const std::remove_cvref_t<Self> &other) noexcept;
126
128 // Vector & Scalar operations (Member Operators)
130
131 template <typename Self>
132 constexpr auto &operator+=(this Self &self, T scalar) noexcept;
133
134 template <typename Self>
135 constexpr auto &operator-=(this Self &self, T scalar) noexcept;
136
137 template <typename Self>
138 constexpr auto &operator*=(this Self &self, T scalar) noexcept;
139
140 template <typename Self>
141 constexpr auto &operator/=(this Self &self, T scalar) noexcept;
142
144 // Vector & Vector operations (Friend Operators)
146
147 template <typename ConcreteVec>
148 [[nodiscard]]
149 friend constexpr auto operator+(ConcreteVec lhs,
150 const ConcreteVec &rhs) noexcept
151 -> ConcreteVec
152 requires std::derived_from<ConcreteVec, VecBase>
153 {
154 lhs += rhs;
155 return lhs;
156 }
157
158 template <typename ConcreteVec>
159 [[nodiscard]]
160 friend constexpr auto operator-(ConcreteVec lhs,
161 const ConcreteVec &rhs) noexcept
162 -> ConcreteVec
163 requires std::derived_from<ConcreteVec, VecBase>
164 {
165 lhs -= rhs;
166 return lhs;
167 }
168
169 template <typename ConcreteVec>
170 [[nodiscard]]
171 friend constexpr auto operator*(ConcreteVec lhs,
172 const ConcreteVec &rhs) noexcept
173 -> ConcreteVec
174 requires std::derived_from<ConcreteVec, VecBase>
175 {
176 lhs *= rhs;
177 return lhs;
178 }
179
180 template <typename ConcreteVec>
181 [[nodiscard]]
182 friend constexpr auto operator/(ConcreteVec lhs,
183 const ConcreteVec &rhs) noexcept
184 -> ConcreteVec
185 requires std::derived_from<ConcreteVec, VecBase>
186 {
187 lhs /= rhs;
188 return lhs;
189 }
190
192 // Vector & Scalar operations (Friend Operators)
194
195 template <typename ConcreteVec>
196 [[nodiscard]]
197 friend constexpr auto operator+(ConcreteVec lhs, T scalar) noexcept
198 -> ConcreteVec
199 requires std::derived_from<ConcreteVec, VecBase>
200 {
201 lhs += scalar;
202 return lhs;
203 }
204
205 template <typename ConcreteVec>
206 [[nodiscard]]
207 friend constexpr auto operator-(ConcreteVec lhs, T scalar) noexcept
208 -> ConcreteVec
209 requires std::derived_from<ConcreteVec, VecBase>
210 {
211 lhs -= scalar;
212 return lhs;
213 }
214
215 template <typename ConcreteVec>
216 [[nodiscard]]
217 friend constexpr auto operator*(ConcreteVec lhs, T scalar) noexcept
218 -> ConcreteVec
219 requires std::derived_from<ConcreteVec, VecBase>
220 {
221 lhs *= scalar;
222 return lhs;
223 }
224
225 template <typename ConcreteVec>
226 [[nodiscard]]
227 friend constexpr auto operator/(ConcreteVec lhs, T scalar) noexcept
228 -> ConcreteVec
229 requires std::derived_from<ConcreteVec, VecBase>
230 {
231 lhs /= scalar;
232 return lhs;
233 }
234
236 // Scalar & Vector operations (Friend Operators)
238
239 template <typename ConcreteVec>
240 [[nodiscard]]
241 friend constexpr auto operator+(T scalar, ConcreteVec rhs) noexcept
242 -> ConcreteVec
243 requires std::derived_from<ConcreteVec, VecBase>
244 {
245 rhs += scalar;
246 return rhs;
247 }
248
249 template <typename ConcreteVec>
250 [[nodiscard]]
251 friend constexpr auto operator*(T scalar, ConcreteVec rhs) noexcept
252 -> ConcreteVec
253 requires std::derived_from<ConcreteVec, VecBase>
254 {
255 rhs *= scalar;
256 return rhs;
257 }
258
259 template <typename ConcreteVec>
260 [[nodiscard]]
261 friend constexpr auto operator-(T scalar, ConcreteVec rhs) noexcept
262 -> ConcreteVec
263 requires std::derived_from<ConcreteVec, VecBase>
264 {
265 for (std::size_t i = 0; i < N; ++i)
266 rhs[i] = scalar - rhs[i];
267 return rhs;
268 }
269
270 template <typename ConcreteVec>
271 [[nodiscard]]
272 friend constexpr auto operator/(T scalar,
273 const ConcreteVec &rhs) noexcept
274 -> ConcreteVec
275 requires std::derived_from<ConcreteVec, VecBase>
276 {
277 ConcreteVec result;
278 for (std::size_t i = 0; i < N; ++i)
279 result[i] = scalar / rhs[i];
280 return result;
281 }
282
284 // Negation
286
287 template <typename ConcreteVec>
288 [[nodiscard]]
289 friend constexpr auto operator-(ConcreteVec lhs) noexcept
290 -> ConcreteVec
291 requires std::derived_from<ConcreteVec, VecBase>
292 {
293 for (std::size_t i = 0; i < N; ++i)
294 lhs[i] = -lhs[i];
295 return lhs;
296 }
297
299 // IO
301
302 template <typename ConcreteVec>
303 friend std::ostream &operator<<(std::ostream &os,
304 const ConcreteVec &v)
305 requires std::derived_from<ConcreteVec, VecBase>
306 {
307 os << "(";
308 for (std::size_t i = 0; i < N - 1; ++i)
309 os << v[i] << ", ";
310 os << v[N - 1];
311 os << ")";
312 return os;
313 }
314 };
315}
316
317 #include "VecBase.tpp"
318
319#endif /* !RTYPE_VECBASE_HPP_ */
Definition of the Numeric concept.
CRTP base class for vectors.
Definition VecBase.hpp:60
constexpr auto dot(this const Self &self, const std::remove_cvref_t< Self > &other) noexcept -> T
constexpr auto & operator/=(this Self &self, const std::remove_cvref_t< Self > &other) noexcept
friend constexpr auto operator+(ConcreteVec lhs, const ConcreteVec &rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:149
constexpr auto & operator-=(this Self &self, T scalar) noexcept
constexpr auto length(this const Self &self) noexcept -> RealT
friend constexpr auto operator+(T scalar, ConcreteVec rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:241
friend constexpr auto operator*(ConcreteVec lhs, T scalar) noexcept -> ConcreteVec
Definition VecBase.hpp:217
constexpr auto & operator-=(this Self &self, const std::remove_cvref_t< Self > &other) noexcept
constexpr auto & operator+=(this Self &self, const std::remove_cvref_t< Self > &other) noexcept
friend constexpr auto operator/(ConcreteVec lhs, T scalar) noexcept -> ConcreteVec
Definition VecBase.hpp:227
friend std::ostream & operator<<(std::ostream &os, const ConcreteVec &v)
Definition VecBase.hpp:303
friend constexpr auto operator+(ConcreteVec lhs, T scalar) noexcept -> ConcreteVec
Definition VecBase.hpp:197
constexpr auto & operator*=(this Self &self, T scalar) noexcept
friend constexpr auto operator-(ConcreteVec lhs, const ConcreteVec &rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:160
constexpr auto project(this const Self &self, const std::remove_cvref_t< Self > &other) noexcept -> std::remove_cvref_t< Self >
constexpr auto & operator+=(this Self &self, T scalar) noexcept
friend constexpr auto operator-(ConcreteVec lhs) noexcept -> ConcreteVec
Definition VecBase.hpp:289
friend constexpr auto operator/(T scalar, const ConcreteVec &rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:272
std::conditional_t< std::is_integral_v< T >, double, T > RealT
Definition VecBase.hpp:61
constexpr auto & operator/=(this Self &self, T scalar) noexcept
constexpr auto distance(this const Self &self, const std::remove_cvref_t< Self > &other) noexcept -> RealT
friend constexpr auto operator-(T scalar, ConcreteVec rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:261
constexpr auto squaredDistance(this const Self &self, const std::remove_cvref_t< Self > &other) noexcept -> T
constexpr auto & operator*=(this Self &self, const std::remove_cvref_t< Self > &other) noexcept
constexpr auto normalize(this Self &self) noexcept -> Self &
friend constexpr auto operator-(ConcreteVec lhs, T scalar) noexcept -> ConcreteVec
Definition VecBase.hpp:207
friend constexpr auto operator/(ConcreteVec lhs, const ConcreteVec &rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:182
friend constexpr auto operator*(ConcreteVec lhs, const ConcreteVec &rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:171
friend constexpr auto operator*(T scalar, ConcreteVec rhs) noexcept -> ConcreteVec
Definition VecBase.hpp:251
constexpr auto normalized(this const Self &self) noexcept -> std::remove_cvref_t< Self >
constexpr auto squaredLength(this const Self &self) noexcept -> T