31#ifndef FENNEC_MATH_VECTOR_H
32#define FENNEC_MATH_VECTOR_H
107#include <fennec/math/detail/_fwd.h>
109#include <fennec/math/vector_base.h>
123template<
typename ScalarT,
size_t SizeV>
131template<
typename ScalarT>
138template<
typename ScalarT>
145template<
typename ScalarT>
181template<
typename ScalarT,
size_t... IndicesV>
requires(is_scalar_v<ScalarT>)
182struct vector : detail::vector_base_type<ScalarT, sizeof...(IndicesV)>
186 static_assert(is_arithmetic_v<ScalarT>);
196 using base_type = detail::vector_base_type<ScalarT,
sizeof...(IndicesV)>;
200 using base_type::data;
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);
262 ((data[IndicesV] = s), ...);
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)), ...);
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)), ...);
310 template<
typename OScalarT,
size_t MoreIndicesStartV,
size_t... MoreIndicesV>
312 ((data[IndicesV] = ScalarT(v[IndicesV])), ...);
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])), ...);
337 explicit constexpr vector(ArgsT&&... args) {
338 vector::_construct<0>(args...);
341 constexpr vector(initializer_list<ScalarT> init) {
343 for (ScalarT x : init) {
348 template<
typename OScalarT>
349 constexpr vector(initializer_list<OScalarT> init) {
351 for (OScalarT x : init) {
352 data[i++] = ScalarT(x);
370 return static_cast<const decay_t&
>(*this);
412 return ((data[IndicesV] = rhs[IndicesV]), ..., *
this);
422 return ((data[IndicesV] =
fennec::move(rhs[IndicesV])), ..., *
this);
440 return ((data[IndicesV] == rhs.data[IndicesV]) && ...);
450 return ((data[IndicesV] != rhs.data[IndicesV]) || ...);
469 return vector_t((lhs + rhs[IndicesV])...);
480 return vector_t((lhs - rhs[IndicesV])...);
491 return vector_t((lhs * rhs[IndicesV])...);
502 return vector_t((lhs / rhs[IndicesV])...);
513 return vector_t((lhs % rhs[IndicesV])...);
531 return vector_t((lhs[IndicesV] + rhs)...);
542 return vector_t((lhs[IndicesV] - rhs)...);
553 return vector_t((lhs[IndicesV] * rhs)...);
564 return vector((lhs[IndicesV] / rhs)...);
575 return vector((lhs[IndicesV] % rhs)...);
593 return ((lhs[IndicesV] += rhs), ..., lhs);
604 return ((lhs[IndicesV] -= rhs), ..., lhs);
615 return ((lhs[IndicesV] *= rhs), ..., lhs);
626 return ((lhs[IndicesV] /= rhs), ..., lhs);
637 return ((lhs[IndicesV] %= rhs), ..., lhs);
654 return vector((-x[IndicesV])...);
665 return vector((lhs[IndicesV] + rhs[IndicesV])...);
676 return vector((lhs[IndicesV] - rhs[IndicesV])...);
687 return vector((lhs[IndicesV] * rhs[IndicesV])...);
696 return vector((lhs[IndicesV] / rhs[IndicesV])...);
707 return vector((lhs[IndicesV] % rhs[IndicesV])...);
725 return ((lhs[IndicesV] += rhs[IndicesV]), ..., lhs);
736 return ((lhs[IndicesV] -= rhs[IndicesV]), ..., lhs);
747 return ((lhs[IndicesV] *= rhs[IndicesV]), ..., lhs);
758 return ((lhs[IndicesV] /= rhs[IndicesV]), ..., lhs);
769 return ((lhs[IndicesV] %= rhs[IndicesV]), ..., lhs);
797 return vector_t((lhs[IndicesV] && rhs)...);
806 return vector_t((lhs[IndicesV] && rhs[IndicesV])...);
817 return vector_t((lhs[IndicesV] || rhs)...);
828 return vector_t((lhs[IndicesV] || rhs[IndicesV])...);
846 return vector_t((lhs[IndicesV] & rhs)...);
857 return vector_t((lhs[IndicesV] & rhs)...);
868 return ((lhs[IndicesV] &= rhs), ..., lhs);
880 return vector_t((lhs[IndicesV] & rhs[IndicesV])...);
891 return ((lhs[IndicesV] &= rhs[IndicesV]), ..., lhs);
903 return vector_t((lhs[IndicesV] | rhs)...);
914 return vector_t((lhs[IndicesV] | rhs)...);
925 return ((lhs[IndicesV] |= rhs), ..., lhs);
937 return vector_t((lhs[IndicesV] | rhs[IndicesV])...);
948 return ((lhs[IndicesV] |= rhs[IndicesV]), ..., lhs);
958 return vector_t((lhs ^ rhs[IndicesV])...);
967 return vector_t((lhs[IndicesV] ^ rhs)...);
976 return ((lhs[IndicesV] ^= rhs), ..., lhs);
986 return vector_t((lhs[IndicesV] ^ rhs[IndicesV])...);
995 return ((lhs[IndicesV] ^= rhs[IndicesV]), ..., lhs);
1005 return vector_t((lhs << rhs[IndicesV])...);
1014 return vector_t((lhs[IndicesV] << rhs)...);
1023 return ((lhs[IndicesV] <<= rhs), ..., lhs);
1032 return vector_t((lhs[IndicesV] << rhs[IndicesV])...);
1041 return ((lhs[IndicesV] <<= rhs[IndicesV]), ..., lhs);
1051 return vector_t((lhs >> rhs[IndicesV])...);
1060 return vector_t((lhs[IndicesV] >> rhs)...);
1069 return ((lhs[IndicesV] >>= rhs), ..., lhs);
1078 return vector_t((lhs[IndicesV] >> rhs[IndicesV])...);
1087 return ((lhs[IndicesV] >>= rhs[IndicesV]), ..., lhs);
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));
1100 if constexpr (
sizeof...(TailT) > 0)
1101 vector::_construct<IndexV + component_count_v<HeadT>>(fennec::forward<TailT>(rest)...);
1104 template<
size_t OffsetV>
1105 constexpr void _insert(
const ScalarT& x) {
1109 template<
size_t OffsetV,
typename OScalarT>
1110 constexpr void _insert(
const OScalarT& x) {
1111 data[OffsetV] = ScalarT(x);
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])), ...);
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) {
1122 ((data[OffsetV + (i++)] =
vec.data[OIndicesV]), ...);
typename conditional< B, TrueT, FalseT >::type conditional_t
Shorthand for typename conditional<ConditionV, TrueT, FalseT>::type
Definition conditional_types.h:90
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
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
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