diff --git a/glm/detail/simd_constexpr/vec.hpp b/glm/detail/simd_constexpr/vec.hpp index c83ba20c..f1324848 100644 --- a/glm/detail/simd_constexpr/vec.hpp +++ b/glm/detail/simd_constexpr/vec.hpp @@ -116,7 +116,31 @@ namespace glm value = detail::is_aligned::value }; - static constexpr length_t length(){return L;} + // -- Component Access -- + static constexpr length_t length(){ return L; } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR decltype(auto) operator[](length_t i) + { + if (std::is_constant_evaluated()) { + static_assert(i <= length()); + } else { + GLM_ASSERT_LENGTH(i, this->length()); + } + switch (i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + case 3: + return w; + } + } + + // -- Data -- #define GLM_N [[no_unique_address]] template @@ -261,5 +285,554 @@ namespace glm return std::bit_cast(a); }() } {} + + // -- Unary arithmetic operators -- + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator=(vec v) + { + *this = vec(v); + return *this; + } + + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec& operator+=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_add::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator+=(vec<1, Tx, Q> v) + { + return (*this = detail::compute_vec_add::value>::call(*this, vec(v.x))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator+=(vec v) + { + return (*this = detail::compute_vec_add::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator-=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_sub::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator-=(vec<1, Tx, Q> v) + { + return (*this = detail::compute_vec_sub::value>::call(*this, vec(v.x))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator-=(vec v) + { + return (*this = detail::compute_vec_sub::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator*=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_mul::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator*=(vec<1, Tx, Q> v) + { + return (*this = detail::compute_vec_mul::value>::call(*this, vec(v.x))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator*=(vec v) + { + return (*this = detail::compute_vec_mul::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator/=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_div::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator/=(vec<1, Tx, Q> v) + { + return (*this = detail::compute_vec_div::value>::call(*this, vec(v.x))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator/=(vec v) + { + return (*this = detail::compute_vec_div::value>::call(*this, vec(v))); + } + + // -- Increment and decrement operators -- + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator++() + { + ++this->x; + ++this->y; + ++this->z; + ++this->w; + return *this; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator--() + { + --this->x; + --this->y; + --this->z; + --this->w; + return *this; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator++(int) + { + vec Result(*this); + ++*this; + return Result; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator--(int) + { + vec Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator%=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_mod::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator%=(vec<1, Tx, Q> v) + { + return (*this = detail::compute_vec_mod::value>::call(*this, vec(v))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator%=(vec v) + { + return (*this = detail::compute_vec_mod::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator&=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator&=(vec<1, Tx, Q> v) + { + return (*this = detail::compute_vec_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator&=(vec v) + { + return (*this = detail::compute_vec_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator|=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator|=(vec<1, Tx, Q> const& v) + { + return (*this = detail::compute_vec_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator|=(vec const& v) + { + return (*this = detail::compute_vec_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator^=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator^=(vec<1, Tx, Q> const& v) + { + return (*this = detail::compute_vec_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator^=(vec const& v) + { + return (*this = detail::compute_vec_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator<<=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator<<=(vec<1, Tx, Q> const& v) + { + return (*this = detail::compute_vec_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator<<=(vec const& v) + { + return (*this = detail::compute_vec_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator>>=(arithmetic auto scalar) + { + return (*this = detail::compute_vec_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(scalar))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator>>=(vec<1, Tx, Q> const& v) + { + return (*this = detail::compute_vec_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec & operator>>=(vec const& v) + { + return (*this = detail::compute_vec_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec(v))); + } + + // -- Unary constant operators -- + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator+() + { + return *this; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator-() + { + return vec(0) -= *this; + } + + // -- Binary arithmetic operators -- + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator+(T scalar) + { + return vec(*this) += scalar; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator+(vec<1, T, Q> const& v2) + { + return vec(*this) += v2; + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator+(T scalar, vec const& v) + { + return vec(v) += scalar; + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator+(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v2) += v1; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator+(vec v2) + { + return vec(*this) += v2; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator-(T scalar) + { + return vec(*this) -= scalar; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator-(vec<1, T, Q> const& v2) + { + return vec(*this) -= v2; + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator-(T scalar, vec const& v) + { + return vec(scalar) -= v; + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator-(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) -= v2; + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator-(vec const& v1, vec const& v2) + { + return vec(v1) -= v2; + } + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator*(T scalar) + { + return vec(*this) *= scalar; + } + + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator*(vec<1, T, Q> const& v2) + { + return vec(*this) *= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator*(T scalar, vec const& v) + { + return vec(v) *= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator*(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v2) *= v1; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator*(vec const& v1, vec const& v2) + { + return vec(v1) *= v2; + } + + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator/(T scalar) + { + return vec(*this) /= scalar; + } + + + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator/(vec<1, T, Q> const& v2) + { + return vec(*this) /= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator/(T scalar, vec const& v) + { + return vec(scalar) /= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator/(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) /= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator/(vec const& v1, vec const& v2) + { + return vec(v1) /= v2; + } + + // -- Binary bit operators -- + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator%(vec const& v, T scalar) + { + return vec(v) %= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator%(vec const& v1, vec<1, T, Q> const& v2) + { + return vec(v1) %= v2.x; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator%(T scalar, vec const& v) + { + return vec(scalar) %= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator%(vec<1, T, Q> const& scalar, vec const& v) + { + return vec(scalar.x) %= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator%(vec const& v1, vec const& v2) + { + return vec(v1) %= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator&(vec const& v, T scalar) + { + return vec(v) &= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator&(vec const& v, vec<1, T, Q> const& scalar) + { + return vec(v) &= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator&(T scalar, vec const& v) + { + return vec(scalar) &= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator&(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) &= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator&(vec const& v1, vec const& v2) + { + return vec(v1) &= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator|(vec const& v, T scalar) + { + return vec(v) |= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator|(vec const& v1, vec<1, T, Q> const& v2) + { + return vec(v1) |= v2.x; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator|(T scalar, vec const& v) + { + return vec(scalar) |= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator|(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) |= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator|(vec const& v1, vec const& v2) + { + return vec(v1) |= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator^(vec const& v, T scalar) + { + return vec(v) ^= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator^(vec const& v1, vec<1, T, Q> const& v2) + { + return vec(v1) ^= v2.x; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator^(T scalar, vec const& v) + { + return vec(scalar) ^= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator^(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) ^= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator^(vec const& v1, vec const& v2) + { + return vec(v1) ^= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator<<(vec const& v, T scalar) + { + return vec(v) <<= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator<<(vec const& v1, vec<1, T, Q> const& v2) + { + return vec(v1) <<= v2.x; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator<<(T scalar, vec const& v) + { + return vec(scalar) <<= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator<<(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) <<= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator<<(vec const& v1, vec const& v2) + { + return vec(v1) <<= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator>>(vec const& v, T scalar) + { + return vec(v) >>= scalar; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator>>(vec const& v1, vec<1, T, Q> const& v2) + { + return vec(v1) >>= v2.x; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator>>(T scalar, vec const& v) + { + return vec(scalar) >>= v; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator>>(vec<1, T, Q> const& v1, vec const& v2) + { + return vec(v1.x) >>= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator>>(vec const& v1, vec const& v2) + { + return vec(v1) >>= v2; + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator~(vec const& v) + { + return detail::compute_vec_bitwise_not<4, T, Q, detail::is_int::value, sizeof(T) * 8, detail::is_aligned::value>::call(v); + } + + // -- Boolean operators -- + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec const& v1, vec const& v2) + { + return detail::compute_vec_equal<4, T, Q, detail::is_int::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec const& v1, vec const& v2) + { + return detail::compute_vec_nequal<4, T, Q, detail::is_int::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator&&(vec const& v1, vec const& v2) + { + return vec(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w); + } + + friend GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec operator||(vec const& v1, vec const& v2) + { + return vec(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w); + } }; } \ No newline at end of file