mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-15 04:35:25 +07:00
equal_to with epsilon
This commit is contained in:
@@ -67,10 +67,20 @@ namespace vmath_hpp
|
||||
|
||||
namespace vmath_hpp
|
||||
{
|
||||
using ::std::abs;
|
||||
template < typename T >
|
||||
std::enable_if_t<std::is_unsigned_v<T>, T>
|
||||
constexpr abs(T x) noexcept {
|
||||
return x;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
T sign(T x) noexcept {
|
||||
std::enable_if_t<std::is_signed_v<T>, T>
|
||||
constexpr abs(T x) noexcept {
|
||||
return x >= T(0) ? x : -x;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr T sign(T x) noexcept {
|
||||
return static_cast<T>((T(0) < x) - (x < T(0)));
|
||||
}
|
||||
|
||||
@@ -216,11 +226,21 @@ namespace vmath_hpp
|
||||
return x == y;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool equal_to(const T& x, const T& y, const T& epsilon) {
|
||||
return abs(x - y) <= epsilon;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool not_equal_to(const T& x, const T& y) {
|
||||
return x != y;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool not_equal_to(const T& x, const T& y, const T& epsilon) {
|
||||
return abs(x - y) > epsilon;
|
||||
}
|
||||
|
||||
constexpr bool any(bool x) noexcept {
|
||||
return x;
|
||||
}
|
||||
|
||||
@@ -640,46 +640,56 @@ namespace vmath_hpp
|
||||
{
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> less(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return zip(std::less<>(), xs, ys);
|
||||
return zip([](T x, T y){ return less(x, y); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> less_equal(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return zip(std::less_equal<>(), xs, ys);
|
||||
return zip([](T x, T y){ return less_equal(x, y); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> greater(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return zip(std::greater<>(), xs, ys);
|
||||
return zip([](T x, T y){ return greater(x, y); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> greater_equal(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return zip(std::greater_equal<>(), xs, ys);
|
||||
return zip([](T x, T y){ return greater_equal(x, y); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> equal_to(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return zip(std::equal_to<>(), xs, ys);
|
||||
return zip([](T x, T y){ return equal_to(x, y); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> equal_to(const vec<T, Size>& xs, const vec<T, Size>& ys, const T& epsilon) {
|
||||
return zip([epsilon](T x, T y){ return equal_to(x, y, epsilon); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> not_equal_to(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return zip(std::not_equal_to<>(), xs, ys);
|
||||
return zip([](T x, T y){ return not_equal_to(x, y); }, xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr vec<bool, Size> not_equal_to(const vec<T, Size>& xs, const vec<T, Size>& ys, const T& epsilon) {
|
||||
return zip([epsilon](T x, T y){ return not_equal_to(x, y, epsilon); }, xs, ys);
|
||||
}
|
||||
|
||||
template < std::size_t Size >
|
||||
constexpr bool any(const vec<bool, Size>& xs) {
|
||||
return fold(std::logical_or<>(), false, xs);
|
||||
return fold([](bool x, bool y){ return x || y; }, false, xs);
|
||||
}
|
||||
|
||||
template < std::size_t Size >
|
||||
constexpr bool all(const vec<bool, Size>& xs) {
|
||||
return fold(std::logical_and<>(), true, xs);
|
||||
return fold([](bool x, bool y){ return x && y; }, true, xs);
|
||||
}
|
||||
|
||||
template < std::size_t Size >
|
||||
constexpr vec<bool, Size> not_(const vec<bool, Size>& xs) {
|
||||
return map(std::logical_not<>(), xs);
|
||||
return map([](bool x){ return not_(x); }, xs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,11 +144,17 @@ TEST_CASE("vmath/fun") {
|
||||
STATIC_REQUIRE_FALSE(greater(1, 1));
|
||||
STATIC_REQUIRE(greater_equal(1, 1));
|
||||
|
||||
STATIC_REQUIRE_FALSE(equal_to(0, 1));
|
||||
STATIC_REQUIRE(equal_to(1, 1));
|
||||
STATIC_REQUIRE_FALSE(equal_to(0, 1));
|
||||
STATIC_REQUIRE_FALSE(equal_to(0, 1, 0));
|
||||
STATIC_REQUIRE(equal_to(0, 1, 1));
|
||||
|
||||
STATIC_REQUIRE(not_equal_to(0, 1));
|
||||
STATIC_REQUIRE(not_equal_to(0, 1, 0));
|
||||
STATIC_REQUIRE_FALSE(not_equal_to(0, 1, 1));
|
||||
STATIC_REQUIRE_FALSE(not_equal_to(1, 1));
|
||||
STATIC_REQUIRE_FALSE(not_equal_to(1, 1, 0));
|
||||
STATIC_REQUIRE_FALSE(not_equal_to(1, 1, 1));
|
||||
|
||||
STATIC_REQUIRE_FALSE(any(false));
|
||||
STATIC_REQUIRE(any(true));
|
||||
|
||||
@@ -189,7 +189,14 @@ TEST_CASE("vmath/vec_fun") {
|
||||
STATIC_REQUIRE(greater_equal(int3(1,1,1), int3(0,1,2)) == bool3(true, true, false));
|
||||
|
||||
STATIC_REQUIRE(equal_to(int3(1,1,1), int3(0,1,2)) == bool3(false, true, false));
|
||||
STATIC_REQUIRE(equal_to(int4(1,1,1,1), int4(0,1,2,3), 0) == bool4(false, true, false, false));
|
||||
STATIC_REQUIRE(equal_to(int4(1,1,1,1), int4(0,1,2,3), 1) == bool4(true, true, true, false));
|
||||
STATIC_REQUIRE(equal_to(int4(1,1,1,1), int4(0,1,2,3), 2) == bool4(true, true, true, true));
|
||||
|
||||
STATIC_REQUIRE(not_equal_to(int3(1,1,1), int3(0,1,2)) == bool3(true, false, true));
|
||||
STATIC_REQUIRE(not_equal_to(int4(1,1,1,1), int4(0,1,2,3), 0) == bool4(true, false, true, true));
|
||||
STATIC_REQUIRE(not_equal_to(int4(1,1,1,1), int4(0,1,2,3), 1) == bool4(false, false, false, true));
|
||||
STATIC_REQUIRE(not_equal_to(int4(1,1,1,1), int4(0,1,2,3), 2) == bool4(false, false, false, false));
|
||||
|
||||
STATIC_REQUIRE_FALSE(any(bool2(false, false)));
|
||||
STATIC_REQUIRE(any(bool2(true, false)));
|
||||
|
||||
Reference in New Issue
Block a user