From 37fba8faadf2e9949b9954080bfe50c87545e63b Mon Sep 17 00:00:00 2001 From: Medusa Slockbower Date: Thu, 26 Jun 2025 09:34:23 -0400 Subject: [PATCH] - Finished Vector Tests (test_vector.h) --- include/fennec/lang/integer.h | 24 +++---- include/fennec/math/vector.h | 30 ++++++-- test/tests/math/test_vector.h | 132 +++++++++++++++++++++++++++++++--- 3 files changed, 158 insertions(+), 28 deletions(-) diff --git a/include/fennec/lang/integer.h b/include/fennec/lang/integer.h index 954eedc..3694370 100644 --- a/include/fennec/lang/integer.h +++ b/include/fennec/lang/integer.h @@ -61,15 +61,15 @@ #define CHAR_MIN 0xffffff80 #define CHAR_MAX 0x7f -#define WCHAR_IS_SIGNED false +#define WCHAR_IS_SIGNED true #define WCHAR_ROUNDS 0x0 -#define WCHAR_RADIX_DIG 0x10 -#define WCHAR_DIG 0x4 +#define WCHAR_RADIX_DIG 0x1f +#define WCHAR_DIG 0x9 #define WCHAR_DECIMAL_DIG 0x0 #define WCHAR_RADIX 0x2 #define WCHAR_TRAPS 0xtrue -#define WCHAR_MIN 0x0 -#define WCHAR_MAX 0xffff +#define WCHAR_MIN 0x80000000 +#define WCHAR_MAX 0x7fffffff #define SCHAR_ROUNDS 0x0 #define SCHAR_RADIX_DIG 0x7 @@ -126,22 +126,22 @@ #define UINT_MAX 0xffffffff #define LONG_ROUNDS 0x0 -#define LONG_RADIX_DIG 0x1f -#define LONG_DIG 0x9 +#define LONG_RADIX_DIG 0x3f +#define LONG_DIG 0x12 #define LONG_DECIMAL_DIG 0x0 #define LONG_RADIX 0x2 #define LONG_TRAPS 0xtrue -#define LONG_MIN 0x80000000 -#define LONG_MAX 0x7fffffff +#define LONG_MIN 0x8000000000000000 +#define LONG_MAX 0x7fffffffffffffff #define ULONG_ROUNDS 0x0 -#define ULONG_RADIX_DIG 0x20 -#define ULONG_DIG 0x9 +#define ULONG_RADIX_DIG 0x40 +#define ULONG_DIG 0x13 #define ULONG_DECIMAL_DIG 0x0 #define ULONG_RADIX 0x2 #define ULONG_TRAPS 0xtrue #define ULONG_MIN 0x0 -#define ULONG_MAX 0xffffffff +#define ULONG_MAX 0xffffffffffffffff #define LLONG_ROUNDS 0x0 #define LLONG_RADIX_DIG 0x3f diff --git a/include/fennec/math/vector.h b/include/fennec/math/vector.h index cdb3d9a..b527a3b 100644 --- a/include/fennec/math/vector.h +++ b/include/fennec/math/vector.h @@ -848,7 +848,7 @@ struct vector : detail::vector_base_type /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i|rhs_i\f$ constexpr friend vector_t operator|(scalar_t rhs, const vector_t& lhs) requires(is_integral_v) - { return vector_t((lhs & rhs[IndicesV]) ...); } + { return vector_t((lhs[IndicesV] | rhs) ...); } /// /// \brief \ref fennec_math_vector "vector" - \ref fennec_math_scalar "scalar" bitwise or operator @@ -888,7 +888,7 @@ struct vector : detail::vector_base_type /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i|rhs_i\f$ constexpr friend vector_t operator|=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v) - { return ((lhs[IndicesV] |= rhs), ..., lhs); } + { return ((lhs[IndicesV] |= rhs[IndicesV]), ..., lhs); } @@ -897,7 +897,7 @@ struct vector : detail::vector_base_type /// \param lhs Left Hand Side of the Expression /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i\^rhs_i\f$ - constexpr friend vector_t operator^(scalar_t rhs, const vector_t& lhs) requires(is_integral_v) + constexpr friend vector_t operator^(scalar_t lhs, const vector_t& rhs) requires(is_integral_v) { return vector_t((lhs ^ rhs[IndicesV]) ...); } /// @@ -930,12 +930,20 @@ struct vector : detail::vector_base_type /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i\^rhs_i\f$ constexpr friend vector_t operator^=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v) - { return ((lhs[IndicesV] ^= rhs), ..., lhs); } + { return ((lhs[IndicesV] ^= rhs[IndicesV]), ..., lhs); } /// - /// \ref fennec_math_vector "vector" - \ref fennec_math_scalar "scalar" bitwise or operator + /// \ref fennec_math_scalar "scalar" - \ref fennec_math_vector "vector" bitwise left-shift operator + /// \param lhs Left Hand Side of the Expression + /// \param rhs Right Hand Side of the Expression + /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i<) + { return vector_t((lhs << rhs[IndicesV]) ...); } + + /// + /// \ref fennec_math_vector "vector" - \ref fennec_math_scalar "scalar" bitwise left-shift operator /// \param lhs Left Hand Side of the Expression /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i< /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i<<=rhs_i\f$ constexpr friend vector_t operator<<=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v) - { return ((lhs[IndicesV] <<= rhs), ..., lhs); } + { return ((lhs[IndicesV] <<= rhs[IndicesV]), ..., lhs); } + /// + /// \ref fennec_math_scalar "scalar" - \ref fennec_math_vector "vector" bitwise or operator + /// \param lhs Left Hand Side of the Expression + /// \param rhs Right Hand Side of the Expression + /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i>>rhs_i\f$ + constexpr friend vector_t operator>>(scalar_t lhs, const vector_t& rhs) requires(is_integral_v) + { return vector_t((lhs >> rhs[IndicesV]) ...); } + /// /// \ref fennec_math_vector "vector" - \ref fennec_math_scalar "scalar" bitwise or operator /// \param lhs Left Hand Side of the Expression @@ -998,7 +1014,7 @@ struct vector : detail::vector_base_type /// \param rhs Right Hand Side of the Expression /// \returns A \ref fennec_math_vector "vector" \a v such that, \f$v_i=lhs_i>>=rhs_i\f$ constexpr friend vector_t operator>>=(vector_t& lhs, const vector_t& rhs) requires(is_integral_v) - { return ((lhs[IndicesV] >>= rhs), ..., lhs); } + { return ((lhs[IndicesV] >>= rhs[IndicesV]), ..., lhs); } /// @} diff --git a/test/tests/math/test_vector.h b/test/tests/math/test_vector.h index 2abf919..2d271bd 100644 --- a/test/tests/math/test_vector.h +++ b/test/tests/math/test_vector.h @@ -429,9 +429,9 @@ inline void fennec_test_math_vector() - fennec_test_section("boolean operations"); + fennec_test_section("bitwise operations"); - fennec_test_spacer(1); + fennec_test_spacer(1); // bitwise and ============================================================================== fennec_test_run(0b0101 & ivec2(0b0001, 0b0010), ivec2(0b0001, 0b0000)); fennec_test_run(0b0101 & ivec3(0b0001, 0b0010, 0b0011), ivec3(0b0001, 0b0000, 0b0001)); @@ -462,18 +462,132 @@ inline void fennec_test_math_vector() fennec_test_run(([]() -> ivec4 { ivec4 v(0b0001, 0b0010, 0b0011, 0b0100); return v &= ivec4(0b1000, 0b0100, 0b1100, 0b0010); }()), ivec4(0b0000)); - fennec_test_spacer(2); + fennec_test_spacer(2); // bitwise or =============================================================================== - fennec_test_run(ivec2(0b0001, 0b0010) & ivec2(0b1000, 0b0100), ivec2(0b0000)); - fennec_test_run(ivec3(0b0001, 0b0010, 0b0011) & ivec3(0b1000, 0b0100, 0b1100), ivec3(0b0000)); - fennec_test_run(ivec4(0b0001, 0b0010, 0b0011, 0b0100) & ivec4(0b1000, 0b0100, 0b1100, 0b0010), ivec4(0b0000)); + fennec_test_run(0b0101 | ivec2(0b0001, 0b0010), ivec2(0b0101, 0b0111)); + fennec_test_run(0b0101 | ivec3(0b0001, 0b0010, 0b0011), ivec3(0b0101, 0b0111, 0b0111)); + fennec_test_run(0b0101 | ivec4(0b0001, 0b0010, 0b0011, 0b0100), ivec4(0b0101, 0b0111, 0b0111, 0b0101)); fennec_test_spacer(1); - fennec_test_run(([]() -> ivec2 { ivec2 v(0b0001, 0b0010); return v &= ivec2(0b1000, 0b0100); }()), ivec2(0b0000)); - fennec_test_run(([]() -> ivec3 { ivec3 v(0b0001, 0b0010, 0b0011); return v &= ivec3(0b1000, 0b0100, 0b1100); }()), ivec3(0b0000)); - fennec_test_run(([]() -> ivec4 { ivec4 v(0b0001, 0b0010, 0b0011, 0b0100); return v &= ivec4(0b1000, 0b0100, 0b1100, 0b0010); }()), ivec4(0b0000)); + fennec_test_run(ivec2(0b0001, 0b0010) | 0b0101, ivec2(0b0101, 0b0111)); + fennec_test_run(ivec3(0b0001, 0b0010, 0b0011) | 0b0101, ivec3(0b0101, 0b0111, 0b0111)); + fennec_test_run(ivec4(0b0001, 0b0010, 0b0011, 0b0100) | 0b0101, ivec4(0b0101, 0b0111, 0b0111, 0b0101)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0b0001, 0b0010); return v |= 0b0101; }()), ivec2(0b0101, 0b0111)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0b0001, 0b0010, 0b0011); return v |= 0b0101; }()), ivec3(0b0101, 0b0111, 0b0111)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0b0001, 0b0010, 0b0011, 0b0100); return v |= 0b0101; }()), ivec4(0b0101, 0b0111, 0b0111, 0b0101)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0b0001, 0b0010) | ivec2(0b1000, 0b0100), ivec2(0b1001, 0b0110)); + fennec_test_run(ivec3(0b0001, 0b0010, 0b0011) | ivec3(0b1000, 0b0100, 0b1100), ivec3(0b1001, 0b0110, 0b1111)); + fennec_test_run(ivec4(0b0001, 0b0010, 0b0011, 0b0100) | ivec4(0b1000, 0b0100, 0b1100, 0b0010), ivec4(0b1001, 0b0110, 0b1111, 0b0110)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0b0001, 0b0010); return v |= ivec2(0b1000, 0b0100); }()), ivec2(0b1001, 0b0110)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0b0001, 0b0010, 0b0011); return v |= ivec3(0b1000, 0b0100, 0b1100); }()), ivec3(0b1001, 0b0110, 0b1111)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0b0001, 0b0010, 0b0011, 0b0100); return v |= ivec4(0b1000, 0b0100, 0b1100, 0b0010); }()), ivec4(0b1001, 0b0110, 0b1111, 0b0110)); + + + fennec_test_spacer(2); // bitwise xor ============================================================================== + + + fennec_test_run(0b0101 ^ ivec2(0b0001, 0b0010), ivec2(0b0100, 0b0111)); + fennec_test_run(0b0101 ^ ivec3(0b0001, 0b0010, 0b0011), ivec3(0b0100, 0b0111, 0b0110)); + fennec_test_run(0b0101 ^ ivec4(0b0001, 0b0010, 0b0011, 0b0100), ivec4(0b0100, 0b0111, 0b0110, 0b0001)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0b0001, 0b0010) ^ 0b0101, ivec2(0b0100, 0b0111)); + fennec_test_run(ivec3(0b0001, 0b0010, 0b0011) ^ 0b0101, ivec3(0b0100, 0b0111, 0b0110)); + fennec_test_run(ivec4(0b0001, 0b0010, 0b0011, 0b0100) ^ 0b0101, ivec4(0b0100, 0b0111, 0b0110, 0b0001)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0b0001, 0b0010); return v ^= 0b0101; }()), ivec2(0b0100, 0b0111)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0b0001, 0b0010, 0b0011); return v ^= 0b0101; }()), ivec3(0b0100, 0b0111, 0b0110)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0b0001, 0b0010, 0b0011, 0b0100); return v ^= 0b0101; }()), ivec4(0b0100, 0b0111, 0b0110, 0b0001)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0b0001, 0b0010) ^ ivec2(0b1000, 0b0100), ivec2(0b1001, 0b0110)); + fennec_test_run(ivec3(0b0001, 0b0010, 0b0011) ^ ivec3(0b1000, 0b0100, 0b1100), ivec3(0b1001, 0b0110, 0b1111)); + fennec_test_run(ivec4(0b0001, 0b0010, 0b0011, 0b0100) ^ ivec4(0b1000, 0b0100, 0b1100, 0b0010), ivec4(0b1001, 0b0110, 0b1111, 0b0110)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0b0001, 0b0010); return v ^= ivec2(0b1000, 0b0100); }()), ivec2(0b1001, 0b0110)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0b0001, 0b0010, 0b0011); return v ^= ivec3(0b1000, 0b0100, 0b1100); }()), ivec3(0b1001, 0b0110, 0b1111)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0b0001, 0b0010, 0b0011, 0b0100); return v ^= ivec4(0b1000, 0b0100, 0b1100, 0b0010); }()), ivec4(0b1001, 0b0110, 0b1111, 0b0110)); + + + fennec_test_spacer(2); // Left Shift =============================================================================== + + + fennec_test_run(0x6D40A3C3 << ivec2(4, 8), ivec2(0xD40A3C30, 0x40A3C300)); + fennec_test_run(0x6D40A3C3 << ivec3(4, 8, 12), ivec3(0xD40A3C30, 0x40A3C300, 0x0A3C3000)); + fennec_test_run(0x6D40A3C3 << ivec4(4, 8, 12, 16), ivec4(0xD40A3C30, 0x40A3C300, 0x0A3C3000, 0xA3C30000)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0x1E, 0xF3) << 4, ivec2(0x1E0, 0xF30)); + fennec_test_run(ivec3(0x1E, 0xF3, 0x27) << 4, ivec3(0x1E0, 0xF30, 0x270)); + fennec_test_run(ivec4(0x1E, 0xF3, 0x27, 0x7C) << 4, ivec4(0x1E0, 0xF30, 0x270, 0x7C0)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0x1E, 0xF3); return v <<= 4; }()), ivec2(0x1E0, 0xF30)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0x1E, 0xF3, 0x27); return v <<= 4; }()), ivec3(0x1E0, 0xF30, 0x270)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0x1E, 0xF3, 0x27, 0x7C); return v <<= 4; }()), ivec4(0x1E0, 0xF30, 0x270, 0x7C0)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0x1E, 0xF3) << ivec2(4, 8), ivec2(0x1E0, 0xF300)); + fennec_test_run(ivec3(0x1E, 0xF3, 0x27) << ivec3(4, 8, 12), ivec3(0x1E0, 0xF300, 0x27000)); + fennec_test_run(ivec4(0x1E, 0xF3, 0x27, 0x7C) << ivec4(4, 8, 12, 16), ivec4(0x1E0, 0xF300, 0x27000, 0x7C0000)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0x1E, 0xF3); return v <<= ivec2(4, 8); }()), ivec2(0x1E0, 0xF300)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0x1E, 0xF3, 0x27); return v <<= ivec3(4, 8, 12); }()), ivec3(0x1E0, 0xF300, 0x27000)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0x1E, 0xF3, 0x27, 0x7C); return v <<= ivec4(4, 8, 12, 16); }()), ivec4(0x1E0, 0xF300, 0x27000, 0x7C0000)); + + + fennec_test_spacer(2); // Right Shift =============================================================================== + + + fennec_test_run(0x6D40A3C3 >> ivec2(4, 8), ivec2(0x06D40A3C, 0x006D40A3)); + fennec_test_run(0x6D40A3C3 >> ivec3(4, 8, 12), ivec3(0x06D40A3C, 0x006D40A3, 0x0006D40A)); + fennec_test_run(0x6D40A3C3 >> ivec4(4, 8, 12, 16), ivec4(0x06D40A3C, 0x006D40A3, 0x0006D40A, 0x00006D40)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0x1E, 0xF3) >> 4, ivec2(0x1, 0xF)); + fennec_test_run(ivec3(0x1E, 0xF3, 0x27) >> 4, ivec3(0x1, 0xF, 0x2)); + fennec_test_run(ivec4(0x1E, 0xF3, 0x27, 0x7C) >> 4, ivec4(0x1, 0xF, 0x2, 0x7)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0x1E, 0xF3); return v >>= 4; }()), ivec2(0x1, 0xF)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0x1E, 0xF3, 0x27); return v >>= 4; }()), ivec3(0x1, 0xF, 0x2)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0x1E, 0xF3, 0x27, 0x7C); return v >>= 4; }()), ivec4(0x1, 0xF, 0x2, 0x7)); + + fennec_test_spacer(1); + + fennec_test_run(ivec2(0x2A1E, 0x7BF3) >> ivec2(4, 8), ivec2(0x2A1, 0x7B)); + fennec_test_run(ivec3(0x2A1E, 0x7BF3, 0x3927) >> ivec3(4, 8, 12), ivec3(0x2A1, 0x7B, 0x3)); + fennec_test_run(ivec4(0x2A1E, 0x7BF3, 0x3927, 0x237C) >> ivec4(4, 8, 12, 16), ivec4(0x2A1, 0x7B, 0x3, 0x0)); + + fennec_test_spacer(1); + + fennec_test_run(([]() -> ivec2 { ivec2 v(0x2A1E, 0x7BF3); return v >>= ivec2(4, 8); }()), ivec2(0x2A1, 0x7B)); + fennec_test_run(([]() -> ivec3 { ivec3 v(0x2A1E, 0x7BF3, 0x3927); return v >>= ivec3(4, 8, 12); }()), ivec3(0x2A1, 0x7B, 0x3)); + fennec_test_run(([]() -> ivec4 { ivec4 v(0x2A1E, 0x7BF3, 0x3927, 0x237C); return v >>= ivec4(4, 8, 12, 16); }()), ivec4(0x2A1, 0x7B, 0x3, 0x0)); }