fennec
Loading...
Searching...
No Matches
vector.h
Go to the documentation of this file.
1// =====================================================================================================================
2// fennec, a free and open source game engine
3// Copyright © 2025 Medusa Slockbower
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program. If not, see <https://www.gnu.org/licenses/>.
17// =====================================================================================================================
18
30
31#ifndef FENNEC_MATH_VECTOR_H
32#define FENNEC_MATH_VECTOR_H
33
105
107#include <fennec/math/detail/_fwd.h>
108
109#include <fennec/math/vector_base.h>
111
114#include <fennec/lang/utility.h>
115
116namespace fennec
117{
118
123template<typename ScalarT, size_t SizeV>
124using vec = decltype(detail::_gen_vector<vector, ScalarT>(make_index_metasequence<SizeV>{}));
125
126
131template<typename ScalarT>
133
138template<typename ScalarT>
140
145template<typename ScalarT>
147
148
152
156
160
167
174
175
181template<typename ScalarT, size_t... IndicesV> requires(is_scalar_v<ScalarT>)
182struct vector : detail::vector_base_type<ScalarT, sizeof...(IndicesV)>
183{
184// Assertions ==========================================================================================================
185
186 static_assert(is_arithmetic_v<ScalarT>);
187
188
189// Forward Defs ========================================================================================================
190
193
196 using base_type = detail::vector_base_type<ScalarT, sizeof...(IndicesV)>;
197
200 using base_type::data;
201
204 using scalar_t = ScalarT;
205
209
210 // Size Aliases
211 static constexpr size_t dimension = sizeof...(IndicesV);
212 static constexpr size_t num_components = sizeof...(IndicesV);
213 static constexpr size_t size = sizeof...(IndicesV);
214 static constexpr size_t N = sizeof...(IndicesV);
215
218
220
221
222// Constructors ========================================================================================================
223
226
231 constexpr vector() {
232 data = { 0 };
233 }
234
235
241 constexpr vector(const vector_t& x) {
242 data = x.data;
243 }
244
245
251 constexpr vector(vector_t&& x) noexcept {
252 data = fennec::move(x.data);
253 }
254
255
261 explicit constexpr vector(scalar_t s) {
262 ((data[IndicesV] = s), ...);
263 }
264
265
271 explicit constexpr vector(int_t s) requires(not is_same_v<ScalarT, int_t>) {
272 if constexpr (N == 1) data[0] = ScalarT(s);
273 else ((data[IndicesV] = ScalarT(s)), ...);
274 }
275
276
282 explicit constexpr vector(double_t s) requires(not is_same_v<ScalarT, double_t>) {
283 if constexpr (N == 1) data[0] = ScalarT(s);
284 else ((data[IndicesV] = ScalarT(s)), ...);
285 }
286
287
288 // This is not in the GLSL spec, I don't remember writing it, and it's behaviour is strange.
295 //template<typename OScalarT>
296 //explicit constexpr vector(const vector<OScalarT, IndicesV...>& v)
297 //: data() {
298 // ((data[IndicesV] = ScalarT(v[IndicesV])), ...);
299 //}
300
301
310 template<typename OScalarT, size_t MoreIndicesStartV, size_t... MoreIndicesV>
312 ((data[IndicesV] = ScalarT(v[IndicesV])), ...);
313 }
314
315
324 template<typename SwizzleDataT, typename SwizzleScalarT, size_t... SwizzleIndicesV>
325 explicit constexpr vector(const detail::swizzle_storage<SwizzleDataT, SwizzleScalarT, SwizzleIndicesV...>& swizzle) {
326 ((data[IndicesV] = ScalarT(swizzle[IndicesV])), ...);
327 }
328
329
336 template<typename... ArgsT> requires(total_component_count_v<ArgsT...> == N)
337 explicit constexpr vector(ArgsT&&... args) {
338 vector::_construct<0>(args...);
339 }
340
341 constexpr vector(initializer_list<ScalarT> init) {
342 size_t i = 0;
343 for (ScalarT x : init) {
344 data[i++] = x;
345 }
346 }
347
348 template<typename OScalarT>
349 constexpr vector(initializer_list<OScalarT> init) {
350 size_t i = 0;
351 for (OScalarT x : init) {
352 data[i++] = ScalarT(x);
353 }
354 }
355
357
358
359// Public Member Functions =============================================================================================
360
363
370 return static_cast<const decay_t&>(*this);
371 }
372
374
375
376// Access operators ====================================================================================================
377
380
383 constexpr scalar_t& operator[](size_t i) {
384 return data[i];
385 }
386
393 constexpr scalar_t operator[](size_t i) const {
394 return data[i];
395 }
396
398
399
400// Assignment operators ================================================================================================
401
404
411 constexpr vector_t& operator=(const vector_t& rhs) {
412 return ((data[IndicesV] = rhs[IndicesV]), ..., *this);
413 }
414
421 constexpr vector_t& operator=(vector_t&& rhs) noexcept {
422 return ((data[IndicesV] = fennec::move(rhs[IndicesV])), ..., *this);
423 }
424
426
427
428// Comparison Operators ================================================================================================
429
432
439 constexpr bool_t operator==(const vector_t& rhs) const {
440 return ((data[IndicesV] == rhs.data[IndicesV]) && ...);
441 }
442
449 constexpr bool_t operator!=(const vector_t& rhs) const {
450 return ((data[IndicesV] != rhs.data[IndicesV]) || ...);
451 }
452
454
455
456// Scalar-Vector Arithmetic operators ==================================================================================
457
460
468 constexpr friend vector_t operator+(scalar_t lhs, const vector_t& rhs) {
469 return vector_t((lhs + rhs[IndicesV])...);
470 }
471
479 constexpr friend vector_t operator-(scalar_t lhs, const vector_t& rhs) {
480 return vector_t((lhs - rhs[IndicesV])...);
481 }
482
490 constexpr friend vector_t operator*(scalar_t lhs, const vector_t& rhs) {
491 return vector_t((lhs * rhs[IndicesV])...);
492 }
493
501 constexpr friend vector_t operator/(scalar_t lhs, const vector_t& rhs) {
502 return vector_t((lhs / rhs[IndicesV])...);
503 }
504
512 constexpr friend vector_t operator%(scalar_t lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
513 return vector_t((lhs % rhs[IndicesV])...);
514 }
515
517
518// Vector-Scalar Arithmetic operators ==================================================================================
519
522
530 constexpr friend vector_t operator+(const vector_t& lhs, scalar_t rhs) {
531 return vector_t((lhs[IndicesV] + rhs)...);
532 }
533
541 constexpr friend vector_t operator-(const vector_t& lhs, scalar_t rhs) {
542 return vector_t((lhs[IndicesV] - rhs)...);
543 }
544
552 constexpr friend vector_t operator*(const vector_t& lhs, scalar_t rhs) {
553 return vector_t((lhs[IndicesV] * rhs)...);
554 }
555
563 constexpr friend vector_t operator/(const vector_t& lhs, scalar_t rhs) {
564 return vector((lhs[IndicesV] / rhs)...);
565 }
566
574 constexpr friend vector_t operator%(const vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
575 return vector((lhs[IndicesV] % rhs)...);
576 }
577
579
580// Vector-Scalar Arithmetic Assignment operators =======================================================================
581
584
592 constexpr friend vector_t& operator+=(vector_t& lhs, scalar_t rhs) {
593 return ((lhs[IndicesV] += rhs), ..., lhs);
594 }
595
603 constexpr friend vector_t& operator-=(vector_t& lhs, scalar_t rhs) {
604 return ((lhs[IndicesV] -= rhs), ..., lhs);
605 }
606
614 constexpr friend vector_t& operator*=(vector_t& lhs, scalar_t rhs) {
615 return ((lhs[IndicesV] *= rhs), ..., lhs);
616 }
617
625 constexpr friend vector_t& operator/=(vector_t& lhs, scalar_t rhs) {
626 return ((lhs[IndicesV] /= rhs), ..., lhs);
627 }
628
636 constexpr friend vector_t& operator%=(vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
637 return ((lhs[IndicesV] %= rhs), ..., lhs);
638 }
639
641
642// Vector-Vector Arithmetic operators ==================================================================================
643
646
653 constexpr friend vector_t operator-(const vector_t& x) {
654 return vector((-x[IndicesV])...);
655 }
656
664 constexpr friend vector_t operator+(const vector_t& lhs, const vector_t& rhs) {
665 return vector((lhs[IndicesV] + rhs[IndicesV])...);
666 }
667
675 constexpr friend vector_t operator-(const vector_t& lhs, const vector_t& rhs) {
676 return vector((lhs[IndicesV] - rhs[IndicesV])...);
677 }
678
686 constexpr friend vector_t operator*(const vector_t& lhs, const vector_t& rhs) {
687 return vector((lhs[IndicesV] * rhs[IndicesV])...);
688 }
689
695 constexpr friend vector_t operator/(const vector_t& lhs, const vector_t& rhs) {
696 return vector((lhs[IndicesV] / rhs[IndicesV])...);
697 }
698
706 constexpr friend vector_t operator%(const vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
707 return vector((lhs[IndicesV] % rhs[IndicesV])...);
708 }
709
711
712// Vector-Vector Arithmetic Assignment operators =======================================================================
713
716
724 constexpr friend vector_t& operator+=(vector_t& lhs, const vector_t& rhs) {
725 return ((lhs[IndicesV] += rhs[IndicesV]), ..., lhs);
726 }
727
735 constexpr friend vector_t& operator-=(vector_t& lhs, const vector_t& rhs) {
736 return ((lhs[IndicesV] -= rhs[IndicesV]), ..., lhs);
737 }
738
746 constexpr friend vector_t& operator*=(vector_t& lhs, const vector_t& rhs) {
747 return ((lhs[IndicesV] *= rhs[IndicesV]), ..., lhs);
748 }
749
757 constexpr friend vector_t& operator/=(vector_t& lhs, const vector_t& rhs) {
758 return ((lhs[IndicesV] /= rhs[IndicesV]), ..., lhs);
759 }
760
768 constexpr friend vector_t& operator%=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
769 return ((lhs[IndicesV] %= rhs[IndicesV]), ..., lhs);
770 }
771
773
774// Boolean Operators ===================================================================================================
775
778
785 constexpr friend vector_t operator!(const vector_t& x) {
786 return vector_t(!x[IndicesV]...);
787 }
788
796 constexpr friend vector_t operator&&(const vector_t& lhs, scalar_t rhs) requires(is_bool_v<scalar_t>) {
797 return vector_t((lhs[IndicesV] && rhs)...);
798 }
799
805 constexpr friend vector_t operator&&(const vector_t& lhs, const vector_t& rhs) requires(is_bool_v<scalar_t>) {
806 return vector_t((lhs[IndicesV] && rhs[IndicesV])...);
807 }
808
816 constexpr friend vector_t operator||(const vector_t& lhs, scalar_t rhs) requires(is_bool_v<scalar_t>) {
817 return vector_t((lhs[IndicesV] || rhs)...);
818 }
819
827 constexpr friend vector_t operator||(const vector_t& lhs, const vector_t& rhs) requires(is_bool_v<scalar_t>) {
828 return vector_t((lhs[IndicesV] || rhs[IndicesV])...);
829 }
830
832
833// Bitwise Operators ===================================================================================================
834
837
845 constexpr friend vector_t operator&(scalar_t rhs, const vector_t& lhs) requires(is_integral_v<scalar_t>) {
846 return vector_t((lhs[IndicesV] & rhs)...);
847 }
848
856 constexpr friend vector_t operator&(const vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
857 return vector_t((lhs[IndicesV] & rhs)...);
858 }
859
867 constexpr friend vector_t operator&=(vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
868 return ((lhs[IndicesV] &= rhs), ..., lhs);
869 }
870
878 constexpr friend vector_t operator&(const vector_t& lhs, const vector_t& rhs) requires(is_integral_v<
879 scalar_t>) {
880 return vector_t((lhs[IndicesV] & rhs[IndicesV])...);
881 }
882
890 constexpr friend vector_t operator&=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
891 return ((lhs[IndicesV] &= rhs[IndicesV]), ..., lhs);
892 }
893
894
902 constexpr friend vector_t operator|(scalar_t rhs, const vector_t& lhs) requires(is_integral_v<scalar_t>) {
903 return vector_t((lhs[IndicesV] | rhs)...);
904 }
905
913 constexpr friend vector_t operator|(const vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
914 return vector_t((lhs[IndicesV] | rhs)...);
915 }
916
924 constexpr friend vector_t operator|=(vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
925 return ((lhs[IndicesV] |= rhs), ..., lhs);
926 }
927
935 constexpr friend vector_t operator|(const vector_t& lhs, const vector_t& rhs) requires(is_integral_v<
936 scalar_t>) {
937 return vector_t((lhs[IndicesV] | rhs[IndicesV])...);
938 }
939
947 constexpr friend vector_t operator|=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
948 return ((lhs[IndicesV] |= rhs[IndicesV]), ..., lhs);
949 }
950
951
957 constexpr friend vector_t operator^(scalar_t lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
958 return vector_t((lhs ^ rhs[IndicesV])...);
959 }
960
966 constexpr friend vector_t operator^(const vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
967 return vector_t((lhs[IndicesV] ^ rhs)...);
968 }
969
975 constexpr friend vector_t operator^=(vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
976 return ((lhs[IndicesV] ^= rhs), ..., lhs);
977 }
978
984 constexpr friend vector_t operator^(const vector_t& lhs, const vector_t& rhs) requires(is_integral_v<
985 scalar_t>) {
986 return vector_t((lhs[IndicesV] ^ rhs[IndicesV])...);
987 }
988
994 constexpr friend vector_t operator^=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
995 return ((lhs[IndicesV] ^= rhs[IndicesV]), ..., lhs);
996 }
997
998
1004 constexpr friend vector_t operator<<(scalar_t lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
1005 return vector_t((lhs << rhs[IndicesV])...);
1006 }
1007
1013 constexpr friend vector_t operator<<(const vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
1014 return vector_t((lhs[IndicesV] << rhs)...);
1015 }
1016
1022 constexpr friend vector_t operator<<=(vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
1023 return ((lhs[IndicesV] <<= rhs), ..., lhs);
1024 }
1025
1031 constexpr friend vector_t operator<<(const vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
1032 return vector_t((lhs[IndicesV] << rhs[IndicesV])...);
1033 }
1034
1040 constexpr friend vector_t operator<<=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
1041 return ((lhs[IndicesV] <<= rhs[IndicesV]), ..., lhs);
1042 }
1043
1044
1050 constexpr friend vector_t operator>>(scalar_t lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
1051 return vector_t((lhs >> rhs[IndicesV])...);
1052 }
1053
1059 constexpr friend vector_t operator>>(const vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
1060 return vector_t((lhs[IndicesV] >> rhs)...);
1061 }
1062
1068 constexpr friend vector_t operator>>=(vector_t& lhs, scalar_t rhs) requires(is_integral_v<scalar_t>) {
1069 return ((lhs[IndicesV] >>= rhs), ..., lhs);
1070 }
1071
1077 constexpr friend vector_t operator>>(const vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
1078 return vector_t((lhs[IndicesV] >> rhs[IndicesV])...);
1079 }
1080
1086 constexpr friend vector_t operator>>=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v<scalar_t>) {
1087 return ((lhs[IndicesV] >>= rhs[IndicesV]), ..., lhs);
1088 }
1089
1091
1092
1093// Helpers =============================================================================================================
1094
1095private:
1096 template<size_t IndexV = 0, typename HeadT, typename... TailT>
1097 constexpr void _construct(HeadT&& head, TailT&&... rest) {
1098 vector::_insert<IndexV>(fennec::forward<HeadT>(head));
1099
1100 if constexpr (sizeof...(TailT) > 0)
1101 vector::_construct<IndexV + component_count_v<HeadT>>(fennec::forward<TailT>(rest)...);
1102 }
1103
1104 template<size_t OffsetV>
1105 constexpr void _insert(const ScalarT& x) {
1106 data[OffsetV] = x;
1107 }
1108
1109 template<size_t OffsetV, typename OScalarT>
1110 constexpr void _insert(const OScalarT& x) {
1111 data[OffsetV] = ScalarT(x);
1112 }
1113
1114 template<size_t OffsetV = 0, typename OScalarT, size_t... OIndicesV>
1115 constexpr void _insert(const vector<OScalarT, OIndicesV...>& vec) {
1116 ((data[OffsetV + OIndicesV] = fennec::forward<OScalarT>(vec[OIndicesV])), ...);
1117 }
1118
1119 template<size_t OffsetV = 0, typename OVectorT, typename ODataT, typename OScalarT, size_t... OIndicesV>
1120 constexpr void _insert(const swizzle<OVectorT, ODataT, OScalarT, OIndicesV...>& vec) {
1121 size_t i = 0;
1122 ((data[OffsetV + (i++)] = vec.data[OIndicesV]), ...);
1123 }
1124};
1125
1126}
1127
1128#endif // FENNEC_MATH_VECTOR_H
Conditional Types
typename conditional< B, TrueT, FalseT >::type conditional_t
Shorthand for typename conditional<ConditionV, TrueT, FalseT>::type
Definition conditional_types.h:90
generate a fennec::index_metasequence
Definition metasequences.h:223
Structure for Handling Vector Swizzling.
Definition swizzle.h:61
Math Vector Type.
Definition vector.h:183
constexpr friend vector_t operator!(const vector_t &x)
unary boolean not operator
Definition vector.h:785
constexpr vector(scalar_t s)
scalar constructor
Definition vector.h:261
constexpr vector(const vector_t &x)
copy constructor
Definition vector.h:241
constexpr friend vector_t operator+(scalar_t lhs, const vector_t &rhs)
scalar - vector addition operator
Definition vector.h:468
constexpr friend vector_t & operator%=(vector_t &lhs, scalar_t rhs)
vector - scalar integer modulus operator
Definition vector.h:636
constexpr friend vector_t operator/(const vector_t &lhs, scalar_t rhs)
vector - scalar division operator
Definition vector.h:563
constexpr friend vector_t operator|(scalar_t rhs, const vector_t &lhs)
scalar - vector bitwise or operator
Definition vector.h:902
constexpr friend vector_t operator<<=(vector_t &lhs, scalar_t rhs)
Definition vector.h:1022
constexpr friend vector_t operator<<=(vector_t &lhs, const vector_t &rhs)
Definition vector.h:1040
constexpr friend vector_t operator&&(const vector_t &lhs, scalar_t rhs)
vector - scalar logical and operator
Definition vector.h:796
constexpr friend vector_t operator>>(const vector_t &lhs, scalar_t rhs)
Definition vector.h:1059
constexpr friend vector_t operator>>(scalar_t lhs, const vector_t &rhs)
Definition vector.h:1050
constexpr friend vector_t & operator-=(vector_t &lhs, scalar_t rhs)
vector - scalar Subtraction operator
Definition vector.h:603
constexpr friend vector_t operator&(scalar_t rhs, const vector_t &lhs)
scalar - vector bitwise and operator
Definition vector.h:845
constexpr friend vector_t & operator+=(vector_t &lhs, const vector_t &rhs)
vector - vector addition operator
Definition vector.h:724
conditional_t< N==1, scalar_t, vector_t > decay_t
Type that the vector should Decay into.
Definition vector.h:217
constexpr vector_t & operator=(const vector_t &rhs)
copy assignment
Definition vector.h:411
constexpr friend vector_t operator/(scalar_t lhs, const vector_t &rhs)
scalar - vector division operator
Definition vector.h:501
constexpr friend vector_t operator||(const vector_t &lhs, scalar_t rhs)
vector - scalar logical or operator
Definition vector.h:816
constexpr friend vector_t operator-(const vector_t &lhs, const vector_t &rhs)
vector - vector subtraction operator
Definition vector.h:675
constexpr friend vector_t operator&(const vector_t &lhs, scalar_t rhs)
vector - scalar bitwise and operator
Definition vector.h:856
constexpr friend vector_t & operator/=(vector_t &lhs, scalar_t rhs)
vector - scalar division operator
Definition vector.h:625
constexpr friend vector_t operator+(const vector_t &lhs, const vector_t &rhs)
vector - vector addition operator
Definition vector.h:664
constexpr scalar_t operator[](size_t i) const
indexed access operator
Definition vector.h:393
constexpr friend vector_t operator*(scalar_t lhs, const vector_t &rhs)
scalar - vector multiplication operator
Definition vector.h:490
ScalarT scalar_t
alias for ScalarT
Definition vector.h:204
constexpr vector(const detail::swizzle_storage< SwizzleDataT, SwizzleScalarT, SwizzleIndicesV... > &swizzle)
swizzle conversion constructor
Definition vector.h:325
constexpr friend vector_t operator&(const vector_t &lhs, const vector_t &rhs)
vector - vector bitwise and operator
Definition vector.h:878
constexpr vector(double_t s)
double conversion scalar
Definition vector.h:282
constexpr friend vector_t operator|(const vector_t &lhs, scalar_t rhs)
vector - scalar bitwise or operator
Definition vector.h:913
constexpr friend vector_t operator|=(vector_t &lhs, scalar_t rhs)
vector - scalar bitwise or assignment operator
Definition vector.h:924
constexpr friend vector_t operator<<(const vector_t &lhs, scalar_t rhs)
Definition vector.h:1013
constexpr friend vector_t operator&=(vector_t &lhs, const vector_t &rhs)
vector - vector bitwise and assignment operator
Definition vector.h:890
constexpr friend vector_t operator&&(const vector_t &lhs, const vector_t &rhs)
vector - vector logical and operator
Definition vector.h:805
constexpr friend vector_t operator>>(const vector_t &lhs, const vector_t &rhs)
Definition vector.h:1077
constexpr friend vector_t operator*(const vector_t &lhs, const vector_t &rhs)
vector - vector multiplication operator
Definition vector.h:686
decay_t decay()
decay implementation
Definition vector.h:369
constexpr friend vector_t operator-(const vector_t &lhs, scalar_t rhs)
vector - scalar subtraction operator
Definition vector.h:541
constexpr vector(const vector< OScalarT, IndicesV..., MoreIndicesStartV, MoreIndicesV... > &v)
vector conversion constructor
Definition vector.h:311
constexpr friend vector_t & operator%=(vector_t &lhs, const vector_t &rhs)
vector - vector integer modulus operator
Definition vector.h:768
constexpr vector()
default constructor, initializes components with 0
Definition vector.h:231
constexpr vector(ArgsT &&... args)
piecewise constructor
Definition vector.h:337
constexpr scalar_t & operator[](size_t i)
Definition vector.h:383
constexpr vector(int_t s)
int conversion scalar
Definition vector.h:271
constexpr friend vector_t & operator*=(vector_t &lhs, const vector_t &rhs)
vector - vector multiplication operator
Definition vector.h:746
constexpr friend vector_t operator>>=(vector_t &lhs, const vector_t &rhs)
Definition vector.h:1086
constexpr bool_t operator!=(const vector_t &rhs) const
vector inequality operator
Definition vector.h:449
constexpr friend vector_t operator%(const vector_t &lhs, const vector_t &rhs)
vector - vector integer modulus operator
Definition vector.h:706
constexpr friend vector_t operator-(const vector_t &x)
negation operator
Definition vector.h:653
constexpr vector_t & operator=(vector_t &&rhs) noexcept
move assignment
Definition vector.h:421
detail::vector_base_type< ScalarT, sizeof...(IndicesV)> base_type
vector base type
Definition vector.h:196
constexpr friend vector_t operator|(const vector_t &lhs, const vector_t &rhs)
vector - vector bitwise or operator
Definition vector.h:935
constexpr vector(vector_t &&x) noexcept
move constructor
Definition vector.h:251
constexpr friend vector_t operator+(const vector_t &lhs, scalar_t rhs)
vector - scalar addition operator
Definition vector.h:530
constexpr friend vector_t & operator+=(vector_t &lhs, scalar_t rhs)
vector - scalar addition operator
Definition vector.h:592
constexpr friend vector_t & operator*=(vector_t &lhs, scalar_t rhs)
vector - scalar multiplication operator
Definition vector.h:614
constexpr friend vector_t operator||(const vector_t &lhs, const vector_t &rhs)
vector - vector logical or operator
Definition vector.h:827
constexpr friend vector_t operator%(const vector_t &lhs, scalar_t rhs)
vector - scalar integer modulus operator
Definition vector.h:574
constexpr friend vector_t operator*(const vector_t &lhs, scalar_t rhs)
vector - scalar multiplication operator
Definition vector.h:552
constexpr friend vector_t & operator/=(vector_t &lhs, const vector_t &rhs)
vector - vector division operator
Definition vector.h:757
constexpr friend vector_t operator&=(vector_t &lhs, scalar_t rhs)
vector - scalar bitwise and assignment operator
Definition vector.h:867
constexpr friend vector_t & operator-=(vector_t &lhs, const vector_t &rhs)
vector - vector subtraction operator
Definition vector.h:735
constexpr friend vector_t operator^=(vector_t &lhs, const vector_t &rhs)
Definition vector.h:994
constexpr friend vector_t operator<<(const vector_t &lhs, const vector_t &rhs)
Definition vector.h:1031
constexpr friend vector_t operator-(scalar_t lhs, const vector_t &rhs)
scalar - vector subtraction operator
Definition vector.h:479
constexpr friend vector_t operator<<(scalar_t lhs, const vector_t &rhs)
Definition vector.h:1004
constexpr friend vector_t operator/(const vector_t &lhs, const vector_t &rhs)
vector - vector division operator
Definition vector.h:695
constexpr friend vector_t operator^=(vector_t &lhs, scalar_t rhs)
Definition vector.h:975
constexpr bool_t operator==(const vector_t &rhs) const
vector equality operator
Definition vector.h:439
constexpr friend vector_t operator%(scalar_t lhs, const vector_t &rhs)
scalar - vector integer modulus operator
Definition vector.h:512
constexpr friend vector_t operator^(scalar_t lhs, const vector_t &rhs)
Definition vector.h:957
constexpr friend vector_t operator^(const vector_t &lhs, scalar_t rhs)
Definition vector.h:966
constexpr friend vector_t operator^(const vector_t &lhs, const vector_t &rhs)
Definition vector.h:984
constexpr friend vector_t operator|=(vector_t &lhs, const vector_t &rhs)
vector - vector bitwise or assignment operator
Definition vector.h:947
constexpr friend vector_t operator>>=(vector_t &lhs, scalar_t rhs)
Definition vector.h:1068
Type Traits
constexpr bool_t is_integral_v
Shorthand for is_integral<T>::value
Definition type_traits.h:504
double double_t
A double-precision floating-point type, typically with a size of 64-bits.
Definition types.h:235
bool bool_t
A conditional type.
Definition types.h:214
signed int int_t
A signed integer type, size varies by implementation, but typically 32-bit.
Definition types.h:225
Utility
constexpr remove_reference_t< T > && move(T &&x) noexcept
produces an x-value type to indicate x may be "moved"
Definition utility.h:92
tvec2< bool_t > bvec2
A two-component boolean vector.
Definition vector.h:149
vec< ScalarT, 4 > tvec4
Shorthand for creating a 4-element fennec::vector, vec<ScalarT, 4>
Definition vector.h:146
tvec2< float_t > vec2
A two-component single-precision floating-point vector.
Definition vector.h:162
tvec3< double_t > dvec3
A three-component double-precision floating-point vector.
Definition vector.h:171
tvec3< bool_t > bvec3
A three-component boolean vector.
Definition vector.h:150
tvec2< double_t > dvec2
A two-component double-precision floating-point vector.
Definition vector.h:169
vec< ScalarT, 2 > tvec2
Shorthand for creating a 2-element fennec::vector, vec<ScalarT, 2>
Definition vector.h:132
tvec2< uint32_t > uvec2
A two-component unsigned integer vector.
Definition vector.h:157
tvec4< double_t > dvec4
A four-component double-precision floating-point vector.
Definition vector.h:173
tvec3< float_t > vec3
A three-component single-precision floating-point vector.
Definition vector.h:164
tvec4< uint32_t > uvec4
A four-component unsigned integer vector.
Definition vector.h:159
vec< ScalarT, 3 > tvec3
Shorthand for creating a 3-element fennec::vector, vec<ScalarT, 3>
Definition vector.h:139
tvec4< bool_t > bvec4
A four-component boolean vector.
Definition vector.h:151
tvec3< int32_t > ivec3
A three-component signed integer vector.
Definition vector.h:154
tvec4< int32_t > ivec4
A four-component signed integer vector.
Definition vector.h:155
decltype(detail::_gen_vector< vector, ScalarT >(make_index_metasequence< SizeV >{})) vec
Main vector template.
Definition vector.h:124
tvec4< float_t > vec4
A four-component single-precision floating-point vector.
Definition vector.h:166
tvec3< uint32_t > uvec3
A three-component unsigned integer vector.
Definition vector.h:158
tvec2< int32_t > ivec2
A two-component signed integer vector.
Definition vector.h:153
constexpr size_t total_component_count_v
shorthand for component_count<T>::value
Definition vector_traits.h:102