- Finished unit tests for core math library

- Adjusted formatting
This commit is contained in:
2025-07-02 10:17:35 -04:00
parent 516d9f4977
commit 9010650ceb
16 changed files with 446 additions and 259 deletions

View File

@@ -220,61 +220,27 @@ namespace fennec
/// \name Basic Types
/// @{
///
/// \brief A conditional type
using bool_t = bool;
using bool_t = bool; ///< \brief A conditional type
///
/// \brief A type capable of holding an ascii value
using char_t = char;
using char_t = char; ///< \brief A type capable of holding an ascii value
using schar_t = signed char; ///< \brief A type with the size of a char, capable of holding a signed 8-bit integer
using uchar_t = unsigned char; ///< \brief A type with the size of a char, capable of holding an unsigned 8-bit integer
///
/// \brief A type with the size of a char, capable of holding a signed 8-bit integer
using schar_t = signed char;
using short_t = signed short; ///< \brief A signed short type, capable of holding signed 16-bit integer
using ushort_t = unsigned short; ///< \brief An unsigned short type, capable of holding an unsigned signed 16-bit integer
///
/// \brief A type with the size of a char, capable of holding an unsigned 8-bit integer
using uchar_t = unsigned char;
using int_t = signed int; ///< \brief A signed integer type, size varies by implementation, but typically 32-bit
using uint_t = unsigned int; ///< \brief An unsigned integer type, size varies by implementation, but typically 32-bit
///
/// \brief A signed short type, capable of holding signed 16-bit integer
using short_t = signed short;
using long_t = signed long; ///< \brief A signed integer type, with a size of at least 32-bits
using ulong_t = unsigned long; ///< \brief An unsigned integer type, with a size of at least 32-bits
///
/// \brief An unsigned short type, capable of holding an unsigned signed 16-bit integer
using ushort_t = unsigned short;
using llong_t = signed long long; ///< \brief A signed integer type, with a size of 64-bits
using ullong_t = unsigned long long; ///< \brief An unsigned integer type, with a size of 64-bits
///
/// \brief A signed integer type, size varies by implementation, but typically 32-bit
using int_t = signed int;
using float_t = float; ///< \brief A single-precision floating-point type, typically with a size of 32-bits
using double_t = double; ///< \brief A double-precision floating-point type, typically with a size of 64-bits
///
/// \brief An unsigned integer type, size varies by implementation, but typically 32-bit
using uint_t = unsigned int;
///
/// \brief A signed integer type, with a size of at least 32-bits
using long_t = signed long;
///
/// \brief An unsigned integer type, with a size of at least 32-bits
using ulong_t = unsigned long;
///
/// \brief A signed integer type, with a size of 64-bits
using llong_t = signed long long;
///
/// \brief An unsigned integer type, with a size of 64-bits
using ullong_t = unsigned long long;
///
/// \brief A single-precision floating-point type, typically with a size of 32-bits
using float_t = float;
///
/// \brief A double-point type, typically with a size of 64-bits
using double_t = double;
/// @}
@@ -283,42 +249,17 @@ namespace fennec
/// \name Special Types
/// @{
///
/// \brief Null Pointer Type
using nullptr_t = decltype(nullptr);
///
/// \brief Signed Integer Capable of Holding a Pointer to void
using intptr_t = intptr_t;
using nullptr_t = decltype(nullptr); ///< \brief Null Pointer Type
using intptr_t = intptr_t; ///< \brief Signed Integer Capable of Holding a Pointer to void
using uintptr_t = uintptr_t; ///< \brief Unsigned Integer Capable of Holding a Pointer to void
using intmax_t = __INTMAX_TYPE__; ///< \brief Maximum Width Signed Integer Type
using uintmax_t = __UINTMAX_TYPE__; ///< \brief Maximum Width Unsigned Integer Type
using size_t = __SIZE_TYPE__; ///< \brief Unsigned Integer Type Returned By `sizeof`, `sizeof...`, and `alignof`
using ptrdiff_t = __PTRDIFF_TYPE__; ///< \brief Signed Integer Type Returned by the Subtraction of two Pointers
///
/// \brief Unsigned Integer Capable of Holding a Pointer to void
using uintptr_t = uintptr_t;
///
/// \brief Maximum Width Signed Integer Type
using intmax_t = __INTMAX_TYPE__;
///
/// \brief Maximum Width Unsigned Integer Type
using uintmax_t = __UINTMAX_TYPE__;
///
/// \brief Unsigned Integer Type Returned By `sizeof`, `sizeof...`, and `alignof`
using size_t = __SIZE_TYPE__;
///
/// \brief Signed Integer Type Returned by the Subtraction of two Pointers
using ptrdiff_t = __PTRDIFF_TYPE__;
///
/// \brief undefined class for SFINAE
class undefined_t;
///
/// \brief Void type used for SFINAE
template<typename...>
using void_t = void;
class undefined_t; ///< \brief undefined class for SFINAE
template<typename...> using void_t = void; ///< \brief Void type used for SFINAE
/// @}
}
@@ -334,45 +275,15 @@ namespace fennec
/// \name Sized Integer Types
/// @{
///
/// \brief Signed 8-bit integer
using int8_t = schar_t;
using int8_t = schar_t; ///< \brief Signed 8-bit integer
using int16_t = short_t; ///< \brief Signed 16-bit integer
using int32_t = conditional_t<sizeof(int_t) == 4, int_t, long_t>; ///< \brief Signed 32-bit integer
using int64_t = llong_t; ///< \brief Signed 64-bit integer
///
/// \brief Signed 16-bit integer
using int16_t = short_t;
///
/// \brief Signed 32-bit integer
using int32_t = conditional_t<sizeof(int_t) == 4, int_t, long_t>;
///
/// \brief Signed signed 64-bit integer
using int64_t = llong_t;
/// @}
///
/// \name Sized Unsigned Integer Types
/// @{
///
/// \brief Unsigned 8-bit integer
using uint8_t = uchar_t;
///
/// \brief Unsigned 16-bit integer
using uint16_t = ushort_t;
///
/// \brief Unsigned 32-bit integer
using uint32_t = conditional_t<sizeof(uint_t) == 4, uint_t, ulong_t>;
///
/// \brief Unsigned 64-bit integer
using uint64_t = ullong_t;
using uint8_t = uchar_t; ///< \brief Unsigned 8-bit integer
using uint16_t = ushort_t; ///< \brief Unsigned 16-bit integer
using uint32_t = conditional_t<sizeof(uint_t) == 4, uint_t, ulong_t>; ///< \brief Unsigned 32-bit integer
using uint64_t = ullong_t; ///< \brief Unsigned 64-bit integer
/// @}
@@ -382,13 +293,10 @@ namespace fennec
/// \name Sized Floating-Point Types
/// @{
///
/// \brief A single-precision floating-point scalar
using float32_t = float_t;
using float16_t = _Float16; ///< \brief A half-precision floating-point scalar
using float32_t = _Float32; ///< \brief A single-precision floating-point scalar
using float64_t = _Float64; ///< \brief A double-precision floating-point scalar
///
/// \brief A double-precision floating-point scalar
using float64_t = double_t;
/// @}
}

View File

@@ -284,28 +284,6 @@ namespace fennec
/// @{
// Absolute Value ======================================================================================================
///
/// \brief Returns \f$x\f$ if \f$x \ge 0\f$, otherwise it returns \f$-x\f$
///
/// \returns \f$x\f$ if \f$x \ge 0\f$, otherwise it returns \f$-x\f$. <br> <br>
/// \details We can express this as, <br> <br>
/// \f$\text{abs}(x)=\left|x\right|\f$.<br> <br>
///
/// \param x input value
template<typename genType>
constexpr genType abs(genType x)
{ return ::abs(x); }
// Vector Specializations ----------------------------------------------------------------------------------------------
template<typename genType, size_t...i>
constexpr vector<genType, i...> abs(const vector<genType, i...>& x)
{ return vector<genType, i...>(fennec::abs(x[i]) ...); }
// Sign ================================================================================================================
@@ -328,6 +306,28 @@ template<typename genType, size_t...i>
constexpr vector<genType, i...> sign(const vector<genType, i...>& x)
{ return vector<genType, i...>(fennec::sign(x[i]) ...); }
// Absolute Value ======================================================================================================
///
/// \brief Returns \f$x\f$ if \f$x \ge 0\f$, otherwise it returns \f$-x\f$
///
/// \returns \f$x\f$ if \f$x \ge 0\f$, otherwise it returns \f$-x\f$. <br> <br>
/// \details We can express this as, <br> <br>
/// \f$\text{abs}(x)=\left|x\right|\f$.<br> <br>
///
/// \param x input value
template<typename genType>
constexpr genType abs(genType x)
{ return x * fennec::sign(x); }
// Vector Specializations ----------------------------------------------------------------------------------------------
template<typename genType, size_t...i>
constexpr vector<genType, i...> abs(const vector<genType, i...>& x)
{ return vector<genType, i...>(fennec::abs(x[i]) ...); }
/// @}
@@ -776,6 +776,10 @@ constexpr genType min(genType x, genType y)
// Vector Specializations ----------------------------------------------------------------------------------------------
template<typename genType, size_t...i>
constexpr vector<genType, i...> min(genType x, const vector<genType, i...>& y)
{ return vector<genType, i...>(fennec::min(x, y[i]) ...); }
template<typename genType, size_t...i>
constexpr vector<genType, i...> min(const vector<genType, i...>& x, genType y)
{ return vector<genType, i...>(fennec::min(x[i], y) ...); }
@@ -804,6 +808,10 @@ constexpr genType max(genType x, genType y)
// Vector Specializations ----------------------------------------------------------------------------------------------
template<typename genType, size_t...i>
constexpr vector<genType, i...> max(genType x, const vector<genType, i...>& y)
{ return vector<genType, i...>(fennec::max(x, y[i]) ...); }
template<typename genType, size_t...i>
constexpr vector<genType, i...> max(const vector<genType, i...>& x, genType y)
{ return vector<genType, i...>(fennec::max(x[i], y) ...); }

View File

@@ -178,29 +178,109 @@
/// \copydetails fennec::half_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::three_halves_pi "genType three_halves_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::three_halves_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::third_pi "genType third_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::third_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::two_thirds_pi "genType two_thirds_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::two_thirds_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::four_thirds_pi "genType four_thirds_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::four_thirds_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::five_thirds_pi "genType five_thirds_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::five_thirds_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::quarter_pi "genType quarter_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::quarter_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::three_quarters_pi "genType three_quarters_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::three_quarters_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::five_quarters_pi "genType five_quarters_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::five_quarters_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::seven_quarters_pi "genType seven_quarters_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::seven_quarters_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::fifth_pi "genType fifth_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::fifth_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::two_fifths_pi "genType two_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::two_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::three_fifths_pi "genType three_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::three_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::four_fifths_pi "genType four_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::four_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::six_fifths_pi "genType six_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::six_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::seven_fifths_pi "genType seven_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::seven_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::eight_fifths_pi "genType eight_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::eight_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::eight_fifths_pi "genType eight_fifths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::nine_fifths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::sixth_pi "genType sixth_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::sixth_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::two_thirds_pi "genType two_thirds_pi<genType>()"
/// \ref fennec::five_sixths_pi "genType five_sixths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::two_thirds_pi
/// \copydetails fennec::five_sixths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::seven_sixths_pi "genType seven_sixths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::seven_sixths_pi
///
/// <tr><td width="50%" style="vertical-align: top"> <br>
/// \ref fennec::eleven_sixths_pi "genType eleven_sixths_pi<genType>()"
/// <td width="50%" style="vertical-align: top">
/// \copydetails fennec::eleven_sixths_pi
///
/// <tr><th colspan=2 style="text-align: center;">Reciprocals of π
/// <tr><td width="50%" style="vertical-align: top"> <br>
@@ -494,12 +574,36 @@ template<typename genType> constexpr genType three_pi() { return 9.424777960769
template<typename genType> constexpr genType four_pi() { return 12.56637061435917295385057353311801153678867759750042; } ///< \returns The value of \f$4\pi\f$ with the highest precision for \f$genType\f$
// Fractions of Pi
template<typename genType> constexpr genType half_pi() { return 1.57079632679489661923132169163975144209858469968755; } ///< \returns The value of \f$\frac{\pi}{2}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType third_pi() { return 1.04719755119659774615421446109316762806572313312503; } ///< \returns The value of \f$\frac{\pi}{3}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType quarter_pi() { return 0.78539816339744830961566084581987572104929234984377; } ///< \returns The value of \f$\frac{\pi}{4}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType fifth_pi() { return 0.62831853071795864769252867665590057683943387987502; } ///< \returns The value of \f$\frac{\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType sixth_pi() { return 0.52359877559829887307710723054658381403286156656251; } ///< \returns The value of \f$\frac{\pi}{6}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType two_thirds_pi() { return 2.09439510239319549230842892218633525613144626625007; } ///< \returns The value of \f$\frac{2\pi}{3}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType half_pi() { return 1.57079632679489661923132169163975144209858469968755; } ///< \returns The value of \f$\frac{\pi}{2}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType three_halves_pi() { return 4.71238898038468985769396507491925432629575409906265; } ///< \returns The value of \f$\frac{3\pi}{2}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType third_pi() { return 1.04719755119659774615421446109316762806572313312503; } ///< \returns The value of \f$\frac{\pi}{3}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType two_thirds_pi() { return 2.09439510239319549230842892218633525613144626625007; } ///< \returns The value of \f$\frac{2\pi}{3}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType four_thirds_pi() { return 4.18879020478639098461685784437267051226289253250014; } ///< \returns The value of \f$\frac{4\pi}{3}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType five_thirds_pi() { return 5.23598775598298873077107230546583814032861566562517; } ///< \returns The value of \f$\frac{5\pi}{3}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType quarter_pi() { return 0.78539816339744830961566084581987572104929234984377; } ///< \returns The value of \f$\frac{\pi}{4}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType three_quarters_pi() { return 2.35619449019234492884698253745962716314787704953132; } ///< \returns The value of \f$\frac{3\pi}{4}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType five_quarters_pi() { return 3.92699081698724154807830422909937860524646174921888; } ///< \returns The value of \f$\frac{5\pi}{4}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType seven_quarters_pi() { return 5.49778714378213816730962592073913004734504644890643; } ///< \returns The value of \f$\frac{7\pi}{4}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType fifth_pi() { return 0.62831853071795864769252867665590057683943387987502; } ///< \returns The value of \f$\frac{\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType two_fifths_pi() { return 1.25663706143591729538505735331180115367886775975004; } ///< \returns The value of \f$\frac{2\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType three_fifths_pi() { return 1.88495559215387594307758602996770173051830163962506; } ///< \returns The value of \f$\frac{3\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType four_fifths_pi() { return 2.51327412287183459077011470662360230735773551950008; } ///< \returns The value of \f$\frac{4\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType six_fifths_pi() { return 3.76991118430775188615517205993540346103660327925012; } ///< \returns The value of \f$\frac{6\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType seven_fifths_pi() { return 4.39822971502571053384770073659130403787603715912514; } ///< \returns The value of \f$\frac{7\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType eight_fifths_pi() { return 5.02654824574366918154022941324720461471547103900016; } ///< \returns The value of \f$\frac{8\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType nine_fifths_pi() { return 5.65486677646162782923275808990310519155490491887519; } ///< \returns The value of \f$\frac{9\pi}{5}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType sixth_pi() { return 0.52359877559829887307710723054658381403286156656251; } ///< \returns The value of \f$\frac{\pi}{6}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType five_sixths_pi() { return 2.61799387799149436538553615273291907016430783281258; } ///< \returns The value of \f$\frac{5\pi}{6}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType seven_sixths_pi() { return 3.66519142918809211153975061382608669823003096593762; } ///< \returns The value of \f$\frac{7\pi}{6}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType eleven_sixths_pi() { return 5.75958653158128760384817953601242195436147723218769; } ///< \returns The value of \f$\frac{11\pi}{6}\f$ with the highest precision for \f$genType\f$
// Reciprocals of Pi
template<typename genType> constexpr genType one_over_pi() { return 0.31830988618379067153776752674502872406891929148091; } ///< \returns The value of \f$\frac{1}{\pi}\f$ with the highest precision for \f$genType\f$
@@ -529,6 +633,7 @@ template<typename genType> constexpr genType e_sq() { return 7.38905
template<typename genType> constexpr genType e_cb() { return 20.08553692318766774092852965458171789698790783855415; } ///< \returns The value of \f$e^3\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType sqrt_e() { return 1.64872127070012814684865078781416357165377610071014; } ///< \returns The value of \f$\sqrt{e}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType one_over_sqrt_e() { return 0.60653065971263342360379953499118045344191813548718; } ///< \returns The value of \f$\frac{1}{\sqrt{e}}\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType e_raised_two() { return 7.38905609893065022723042746057500781318031557055184; } ///< \returns The value of \f$e^e\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType e_raised_e() { return 15.15426224147926418976043027262991190552854853685613; } ///< \returns The value of \f$e^e\f$ with the highest precision for \f$genType\f$
template<typename genType> constexpr genType e_raised_neg_e() { return 0.065988035845312537076790187596846424938577048252796; } ///< \returns The value of \f$e^-e\f$ with the highest precision for \f$genType\f$

View File

@@ -270,9 +270,12 @@ constexpr vector<genType, i...> reflect(const vector<genType, i...>& I, const ve
/// \param eta the ratio of indices of refraction
template<typename genType, size_t...i>
constexpr vector<genType, i...> refract(const vector<genType, i...>& I, const vector<genType, i...>& N, genType eta)
{ genType ndi = fennec::dot(N, I);
{
genType ndi = fennec::dot(N, I);
genType k = 1.0 - eta * eta * (1.0 - ndi * ndi);
return fennec::max(0.0, eta * I - N * (eta * ndi + fennec::sqrt(k))); }
if (k < 0) return vector<genType, i...>(0);
return eta * I - N * (eta * ndi + fennec::sqrt(k));
}
}

View File

@@ -208,7 +208,7 @@ constexpr genBType all(const vector<genBType, i...>& x)
/// \returns the component-wise logical complement of \f$x\f$.
/// \param x the boolean vector to inverse
template<typename genBType = bool_t, size_t...i>
constexpr genBType operator not(const vector<genBType, i...>& x)
constexpr vector<genBType, i...> operator not(const vector<genBType, i...>& x)
{ return vector<genBType, i...>((!x[i]) ...); }
}

View File

@@ -144,74 +144,25 @@ template<typename ScalarT> using tvec4 = vec<ScalarT, 4>;
///
/// \brief A two-component boolean \ref fennec_math_vector "vector"
using bvec2 = tvec2<bool_t>;
using bvec2 = tvec2<bool_t>; ///< \brief A two-component boolean \ref fennec_math_vector "vector"
using bvec3 = tvec3<bool_t>; ///< \brief A three-component boolean \ref fennec_math_vector "vector"
using bvec4 = tvec4<bool_t>; ///< \brief A four-component boolean \ref fennec_math_vector "vector"
///
/// \brief A three-component boolean \ref fennec_math_vector "vector"
using bvec3 = tvec3<bool_t>;
using ivec2 = tvec2<int32_t>; ///< \brief A two-component signed integer \ref fennec_math_vector "vector"
using ivec3 = tvec3<int32_t>; ///< \brief A three-component signed integer \ref fennec_math_vector "vector"
using ivec4 = tvec4<int32_t>; ///< \brief A four-component signed integer \ref fennec_math_vector "vector"
///
/// \brief A four-component boolean \ref fennec_math_vector "vector"
using bvec4 = tvec4<bool_t>;
using uvec2 = tvec2<uint32_t>; ///< \brief A two-component unsigned integer \ref fennec_math_vector "vector"
using uvec3 = tvec3<uint32_t>; ///< \brief A three-component unsigned integer \ref fennec_math_vector "vector"
using uvec4 = tvec4<uint32_t>; ///< \brief A four-component unsigned integer \ref fennec_math_vector "vector"
using vec2 = tvec2<float_t>; ///< \brief A two-component single-precision floating-point \ref fennec_math_vector "vector"
using vec3 = tvec3<float_t>; ///< \brief A three-component single-precision floating-point \ref fennec_math_vector "vector"
using vec4 = tvec4<float_t>; ///< \brief A four-component single-precision floating-point \ref fennec_math_vector "vector"
///
/// \brief A two-component signed integer \ref fennec_math_vector "vector"
using ivec2 = tvec2<int32_t>;
///
/// \brief A three-component signed integer \ref fennec_math_vector "vector"
using ivec3 = tvec3<int32_t>;
///
/// \brief A four-component signed integer \ref fennec_math_vector "vector"
using ivec4 = tvec4<int32_t>;
///
/// \brief A two-component unsigned integer \ref fennec_math_vector "vector"
using uvec2 = tvec2<uint32_t>;
///
/// \brief A three-component unsigned integer \ref fennec_math_vector "vector"
using uvec3 = tvec3<uint32_t>;
///
/// \brief A four-component unsigned integer \ref fennec_math_vector "vector"
using uvec4 = tvec4<uint32_t>;
///
/// \brief A two-component single-precision floating-point \ref fennec_math_vector "vector"
using vec2 = tvec2<float32_t>;
///
/// \brief A three-component single-precision floating-point \ref fennec_math_vector "vector"
using vec3 = tvec3<float32_t>;
///
/// \brief A four-component single-precision floating-point \ref fennec_math_vector "vector"
using vec4 = tvec4<float32_t>;
///
/// \brief A two-component double-precision floating-point \ref fennec_math_vector "vector"
using dvec2 = tvec2<float64_t>;
///
/// \brief A three-component double-precision floating-point \ref fennec_math_vector "vector"
using dvec3 = tvec3<float64_t>;
///
/// \brief A four-component double-precision floating-point \ref fennec_math_vector "vector"
using dvec4 = tvec4<float64_t>;
using dvec2 = tvec2<double_t>; ///< \brief A two-component double-precision floating-point \ref fennec_math_vector "vector"
using dvec3 = tvec3<double_t>; ///< \brief A three-component double-precision floating-point \ref fennec_math_vector "vector"
using dvec4 = tvec4<double_t>; ///< \brief A four-component double-precision floating-point \ref fennec_math_vector "vector"