mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-15 04:35:25 +07:00
CI: fix clang compilation
This commit is contained in:
@@ -22,41 +22,41 @@ namespace
|
||||
constexpr float pi_4 = radians(45.f);
|
||||
}
|
||||
|
||||
TEST_CASE("vmath/ext") {
|
||||
SECTION("units") {
|
||||
STATIC_REQUIRE(zero2<int> == int2(0,0));
|
||||
STATIC_REQUIRE(zero3<int> == int3(0,0,0));
|
||||
STATIC_REQUIRE(zero4<int> == int4(0,0,0,0));
|
||||
TEST_CASE("vmath/ext/units") {
|
||||
STATIC_REQUIRE(zero2<int> == int2(0,0));
|
||||
STATIC_REQUIRE(zero3<int> == int3(0,0,0));
|
||||
STATIC_REQUIRE(zero4<int> == int4(0,0,0,0));
|
||||
|
||||
STATIC_REQUIRE(unit2<int> == int2(1,1));
|
||||
STATIC_REQUIRE(unit2_x<int> == int2(1,0));
|
||||
STATIC_REQUIRE(unit2_y<int> == int2(0,1));
|
||||
STATIC_REQUIRE(unit2<int> == int2(1,1));
|
||||
STATIC_REQUIRE(unit2_x<int> == int2(1,0));
|
||||
STATIC_REQUIRE(unit2_y<int> == int2(0,1));
|
||||
|
||||
STATIC_REQUIRE(unit3<int> == int3(1,1,1));
|
||||
STATIC_REQUIRE(unit3_x<int> == int3(1,0,0));
|
||||
STATIC_REQUIRE(unit3_y<int> == int3(0,1,0));
|
||||
STATIC_REQUIRE(unit3_z<int> == int3(0,0,1));
|
||||
STATIC_REQUIRE(unit3<int> == int3(1,1,1));
|
||||
STATIC_REQUIRE(unit3_x<int> == int3(1,0,0));
|
||||
STATIC_REQUIRE(unit3_y<int> == int3(0,1,0));
|
||||
STATIC_REQUIRE(unit3_z<int> == int3(0,0,1));
|
||||
|
||||
STATIC_REQUIRE(unit4<int> == int4(1,1,1,1));
|
||||
STATIC_REQUIRE(unit4_x<int> == int4(1,0,0,0));
|
||||
STATIC_REQUIRE(unit4_y<int> == int4(0,1,0,0));
|
||||
STATIC_REQUIRE(unit4_z<int> == int4(0,0,1,0));
|
||||
STATIC_REQUIRE(unit4_w<int> == int4(0,0,0,1));
|
||||
STATIC_REQUIRE(unit4<int> == int4(1,1,1,1));
|
||||
STATIC_REQUIRE(unit4_x<int> == int4(1,0,0,0));
|
||||
STATIC_REQUIRE(unit4_y<int> == int4(0,1,0,0));
|
||||
STATIC_REQUIRE(unit4_z<int> == int4(0,0,1,0));
|
||||
STATIC_REQUIRE(unit4_w<int> == int4(0,0,0,1));
|
||||
|
||||
STATIC_REQUIRE(zero2x2<int> == int2x2(0,0,0,0));
|
||||
STATIC_REQUIRE(zero3x3<int> == int3x3(0,0,0,0,0,0,0,0,0));
|
||||
STATIC_REQUIRE(zero4x4<int> == int4x4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
|
||||
STATIC_REQUIRE(zero2x2<int> == int2x2(0,0,0,0));
|
||||
STATIC_REQUIRE(zero3x3<int> == int3x3(0,0,0,0,0,0,0,0,0));
|
||||
STATIC_REQUIRE(zero4x4<int> == int4x4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
|
||||
|
||||
STATIC_REQUIRE(unit2x2<int> == int2x2(1,1,1,1));
|
||||
STATIC_REQUIRE(unit3x3<int> == int3x3(1,1,1,1,1,1,1,1,1));
|
||||
STATIC_REQUIRE(unit4x4<int> == int4x4(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1));
|
||||
STATIC_REQUIRE(unit2x2<int> == int2x2(1,1,1,1));
|
||||
STATIC_REQUIRE(unit3x3<int> == int3x3(1,1,1,1,1,1,1,1,1));
|
||||
STATIC_REQUIRE(unit4x4<int> == int4x4(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1));
|
||||
|
||||
STATIC_REQUIRE(identity2x2<int> == int2x2());
|
||||
STATIC_REQUIRE(identity3x3<int> == int3x3());
|
||||
STATIC_REQUIRE(identity4x4<int> == int4x4());
|
||||
}
|
||||
STATIC_REQUIRE(identity2x2<int> == int2x2());
|
||||
STATIC_REQUIRE(identity3x3<int> == int3x3());
|
||||
STATIC_REQUIRE(identity4x4<int> == int4x4());
|
||||
}
|
||||
|
||||
SECTION("vector hash") {
|
||||
TEST_CASE("vmath/ext/hash") {
|
||||
SECTION("vector") {
|
||||
REQUIRE(std::hash<int2>{}({1,2}) == std::hash<int2>{}({1,2}));
|
||||
REQUIRE_FALSE(std::hash<int2>{}({1,2}) == std::hash<int2>{}({2,1}));
|
||||
|
||||
@@ -94,7 +94,7 @@ TEST_CASE("vmath/ext") {
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("matrix hash") {
|
||||
SECTION("matrix") {
|
||||
REQUIRE(std::hash<int2x2>{}({1,2,3,4}) == std::hash<int2x2>{}({1,2,3,4}));
|
||||
REQUIRE_FALSE(std::hash<int2x2>{}({1,2,3,4}) == std::hash<int2x2>{}({1,2,4,3}));
|
||||
|
||||
@@ -126,7 +126,7 @@ TEST_CASE("vmath/ext") {
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("quaternion hash") {
|
||||
SECTION("quaternion") {
|
||||
REQUIRE(std::hash<fqua>{}({1,2,3,4}) == std::hash<fqua>{}({1,2,3,4}));
|
||||
REQUIRE_FALSE(std::hash<fqua>{}({1,2,3,4}) == std::hash<fqua>{}({3,2,1,4}));
|
||||
|
||||
@@ -157,30 +157,29 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(s[qua(2,3,4,5)] == 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("vmath/ext/cast") {
|
||||
SECTION("cast_to") {
|
||||
{
|
||||
constexpr auto i = cast_to<int>(1.5f);
|
||||
STATIC_REQUIRE(i == 1);
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(i), const int>);
|
||||
}
|
||||
{
|
||||
constexpr auto v = cast_to<int>(float2{1.5f});
|
||||
STATIC_REQUIRE(v == int2(1));
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(v)::component_type, int>);
|
||||
}
|
||||
{
|
||||
constexpr auto m = cast_to<int>(float2x2{1.5f});
|
||||
STATIC_REQUIRE(m == int2x2(1));
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(m)::row_type, int2>);
|
||||
}
|
||||
{
|
||||
constexpr auto v = cast_to<int>(fqua{1.5f, 2.2f, 3.6f, 4.5f});
|
||||
STATIC_REQUIRE(v == qua(1,2,3,4));
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(v)::component_type, int>);
|
||||
}
|
||||
}
|
||||
constexpr auto i = cast_to<int>(1.5f);
|
||||
STATIC_REQUIRE(i == 1);
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(i), const int>);
|
||||
|
||||
constexpr auto v = cast_to<int>(float2(1.5f));
|
||||
STATIC_REQUIRE(v == int2(1));
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(v)::component_type, int>);
|
||||
|
||||
constexpr auto m = cast_to<int>(float2x2(1.5f));
|
||||
STATIC_REQUIRE(m == int2x2(1));
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(m)::row_type, int2>);
|
||||
|
||||
constexpr auto q = cast_to<int>(fqua(1.5f, 2.2f, 3.6f, 4.5f));
|
||||
STATIC_REQUIRE(q == qua(1,2,3,4));
|
||||
STATIC_REQUIRE(std::is_same_v<decltype(q)::component_type, int>);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("vmath/ext/access") {
|
||||
SECTION("component") {
|
||||
STATIC_REQUIRE(component(int2{1,2}, 0) == 1);
|
||||
STATIC_REQUIRE(component(int2{1,2}, 1) == 2);
|
||||
@@ -214,8 +213,10 @@ TEST_CASE("vmath/ext") {
|
||||
STATIC_REQUIRE(imag(qua{1,2,3,4}) == vec{1,2,3});
|
||||
STATIC_REQUIRE(imag(qua{1,2,3,4}, {4,3,2}) == qua{4,3,2,4});
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("matrix translate") {
|
||||
TEST_CASE("vmath/ext/matrix_transform") {
|
||||
SECTION("translate") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(float2{1.f,2.f}) == uapprox3(3.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(translate(float2{1.f,2.f}), float2{1.f,2.f}) == uapprox3(4.f,7.f,1.f));
|
||||
|
||||
@@ -223,7 +224,7 @@ TEST_CASE("vmath/ext") {
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(translate(float3{1.f,2.f,3.f}), float3{1.f,2.f,3.f}) == uapprox4(4.f,7.f,10.f,1.f));
|
||||
}
|
||||
|
||||
SECTION("matrix rotate") {
|
||||
SECTION("rotate") {
|
||||
REQUIRE(float4(0.f,1.f,0.f,1.f) * rotate_x(pi_2) == uapprox4(0.f,0.f,1.f,1.f));
|
||||
REQUIRE(float4(0.f,0.f,1.f,1.f) * rotate_y(pi_2) == uapprox4(1.f,0.f,0.f,1.f));
|
||||
REQUIRE(float4(1.f,0.f,0.f,1.f) * rotate_z(pi_2) == uapprox4(0.f,1.f,0.f,1.f));
|
||||
@@ -243,7 +244,7 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(qrotate(pi_2,float3{0.f,0.f,1.f})),qrotate(pi_2,float3{0.f,0.f,1.f})) == uapprox4(-2.f,-3.f,4.f,1.f));
|
||||
}
|
||||
|
||||
SECTION("matrix scale") {
|
||||
SECTION("scale") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(float2{2.f,3.f}) == uapprox3(4.f,9.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == uapprox4(4.f,9.f,16.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == uapprox4(4.f,9.f,16.f,1.f));
|
||||
@@ -253,7 +254,7 @@ TEST_CASE("vmath/ext") {
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), float3{2.f,3.f,4.f}) == uapprox4(8.f,18.f,32.f,1.f));
|
||||
}
|
||||
|
||||
SECTION("matrix shear") {
|
||||
SECTION("shear") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(0.f) == uapprox3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(1.f) == uapprox3(5.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(2.f) == uapprox3(8.f,3.f,1.f));
|
||||
@@ -271,7 +272,14 @@ TEST_CASE("vmath/ext") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(shear(float2(0.f,1.f)),float2(0.f,1.f)) == uapprox3(2.f,7.f,1.f));
|
||||
}
|
||||
|
||||
SECTION("matrix orthographic") {
|
||||
SECTION("matrix look_at") {
|
||||
(void)look_at_lh(float3(1,2,3), float3(0,0,0), float3(0,2,0));
|
||||
(void)look_at_rh(float3(1,2,3), float3(0,0,0), float3(0,2,0));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("vmath/ext/matrix_projections") {
|
||||
SECTION("orthographic") {
|
||||
REQUIRE(all(approx(
|
||||
orthographic_lh(800.f, 600.f, 5.f, 10.f),
|
||||
scale(1.f,1.f,-1.f) * orthographic_rh(800.f, 600.f, 5.f, 10.f))));
|
||||
@@ -282,7 +290,7 @@ TEST_CASE("vmath/ext") {
|
||||
}
|
||||
|
||||
|
||||
SECTION("matrix perspective") {
|
||||
SECTION("perspective") {
|
||||
REQUIRE(all(approx(
|
||||
perspective_lh(800.f, 600.f, 5.f, 10.f),
|
||||
scale(1.f,1.f,-1.f) * perspective_rh(800.f, 600.f, 5.f, 10.f))));
|
||||
@@ -295,13 +303,10 @@ TEST_CASE("vmath/ext") {
|
||||
perspective_lh(100.f, 800.f, 50.f, 600.f, 5.f, 10.f),
|
||||
scale(1.f,1.f,-1.f) * perspective_rh(100.f, 800.f, 50.f, 600.f, 5.f, 10.f))));
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("matrix look_at") {
|
||||
(void)look_at_lh(float3(1,2,3), float3(0,0,0), float3(0,2,0));
|
||||
(void)look_at_rh(float3(1,2,3), float3(0,0,0), float3(0,2,0));
|
||||
}
|
||||
|
||||
SECTION("vector angle") {
|
||||
TEST_CASE("vmath/ext/vector_transform") {
|
||||
SECTION("angle") {
|
||||
REQUIRE(angle(float2(2.f,0.f), float2(0.f,1.f)) == uapprox(radians(90.f)));
|
||||
REQUIRE(angle(float2(0.f,3.f), float2(1.f,0.f)) == uapprox(radians(90.f)));
|
||||
REQUIRE(angle(float2(0.5f,0.f), float2(-1.f,0.f)) == uapprox(radians(180.f)));
|
||||
@@ -310,7 +315,7 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(angle(float3(0.f,0.f,3.f), float3(0.f,1.f,0.f)) == uapprox(radians(90.f)));
|
||||
}
|
||||
|
||||
SECTION("vector rotate") {
|
||||
SECTION("rotate") {
|
||||
REQUIRE(rotate(float2(2.f,0.f), radians(90.f)) == uapprox2(0.f,2.f));
|
||||
REQUIRE(rotate(float2(1.5f,0.f), radians(-90.f)) == uapprox2(0.f,-1.5f));
|
||||
|
||||
@@ -329,17 +334,19 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(rotate(float4(1.5f,0.f,0.f,2.f), radians(90.f), float3(0,0,1)) == uapprox4(0.f,1.5f,0.f,2.f));
|
||||
}
|
||||
|
||||
SECTION("vector project") {
|
||||
SECTION("project") {
|
||||
STATIC_REQUIRE(project(float2(2.f, 2.f), float2(0.f, 1.f)) == uapprox2(0.f, 2.f));
|
||||
STATIC_REQUIRE(project(float3(2.f, 2.f, 2.f), float3(0.f, 0.f, 1.f)) == uapprox3(0.f, 0.f, 2.f));
|
||||
}
|
||||
|
||||
SECTION("vector perpendicular") {
|
||||
SECTION("perpendicular") {
|
||||
STATIC_REQUIRE(perpendicular(float2(2.f, 2.f), float2(0.f, 1.f)) == uapprox2(2.f, 0.f));
|
||||
STATIC_REQUIRE(perpendicular(float3(2.f, 2.f, 2.f), float3(0.f, 0.f, 1.f)) == uapprox3(2.f, 2.f, 0.f));
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("quaternion/qrotate(m)") {
|
||||
TEST_CASE("vmath/ext/quaternion_transform") {
|
||||
SECTION("qrotate(m)") {
|
||||
REQUIRE(all(approx(
|
||||
vec{4.f,3.f,2.f,1.f} * rotate(qrotate(float3x3(rotate(0.f, vec{1.f,2.f,3.f})))),
|
||||
vec{4.f,3.f,2.f,1.f} * rotate(0.f, vec{1.f,2.f,3.f}), 0.001f)));
|
||||
@@ -351,7 +358,7 @@ TEST_CASE("vmath/ext") {
|
||||
vec{4.f,3.f,2.f,1.f} * rotate(radians(-190.5f), vec{1.f,2.f,3.f}), 0.001f)));
|
||||
}
|
||||
|
||||
SECTION("quaternion/qrotate(q, m)") {
|
||||
SECTION("qrotate(q, m)") {
|
||||
REQUIRE(all(approx(
|
||||
vec{4.f,3.f,2.f} * qrotate(
|
||||
qrotate(float3x3(rotate(0.f, vec{1.f,2.f,3.f}))),
|
||||
@@ -361,7 +368,7 @@ TEST_CASE("vmath/ext") {
|
||||
float3x3(rotate(0.f, vec{3.f,2.f,1.f})))));
|
||||
}
|
||||
|
||||
SECTION("quaternion/qrotate(from, to)") {
|
||||
SECTION("qrotate(from, to)") {
|
||||
REQUIRE(+unit3_x<float> * qrotate(-unit3_x<float>, +unit3_x<float>) == uapprox3(-unit3_x<float>));
|
||||
REQUIRE(-unit3_y<float> * qrotate(+unit3_y<float>, -unit3_y<float>) == uapprox3(+unit3_y<float>));
|
||||
REQUIRE(+unit3_z<float> * qrotate(-unit3_z<float>, +unit3_z<float>) == uapprox3(-unit3_z<float>));
|
||||
@@ -369,7 +376,7 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(vec{-2.f,1.f,3.f} * qrotate(vec{-2.f,1.f,3.f}, vec{1.f,2.f,3.f}) == uapprox3(1.f,2.f,3.f));
|
||||
}
|
||||
|
||||
SECTION("quaternion/qrotate(q, from, to)") {
|
||||
SECTION("qrotate(q, from, to)") {
|
||||
REQUIRE(vec{1.f,2.f,3.f} *
|
||||
inverse(qrotate(float3x3(rotate(radians(12.f), {2.f,2.f,2.f})))) *
|
||||
qrotate(
|
||||
@@ -378,7 +385,7 @@ TEST_CASE("vmath/ext") {
|
||||
vec{-2.f,1.f,3.f}) == uapprox3(vec{-2.f,1.f,3.f}));
|
||||
}
|
||||
|
||||
SECTION("quaternion/qrotate(angle, axis)") {
|
||||
SECTION("qrotate(angle, axis)") {
|
||||
REQUIRE(all(approx(
|
||||
rotate(12.3f, float3(1.f,2.f,3.f)),
|
||||
rotate(qrotate(12.3f, float3(1.f,2.f,3.f)) * 2.f))));
|
||||
@@ -395,7 +402,7 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(qrotate_z(12.3f) == qrotate(12.3f, unit3_z<float> * 2.f));
|
||||
}
|
||||
|
||||
SECTION("quaternion/qrotate(q, angle, axis)") {
|
||||
SECTION("qrotate(q, angle, axis)") {
|
||||
REQUIRE(float3(0.f,1.f,0.f) * qrotate_x(qrotate_x(pi_4),pi_4) == uapprox3(0.f,0.f,1.f));
|
||||
REQUIRE(float3(0.f,0.f,1.f) * qrotate_y(qrotate_y(pi_4),pi_4) == uapprox3(1.f,0.f,0.f));
|
||||
REQUIRE(float3(1.f,0.f,0.f) * qrotate_z(qrotate_z(pi_4),pi_4) == uapprox3(0.f,1.f,0.f));
|
||||
@@ -404,7 +411,7 @@ TEST_CASE("vmath/ext") {
|
||||
REQUIRE(float3(2.f,3.f,4.f) * qrotate(qrotate(pi_2,float3{0.f,0.f,1.f}),pi_2,float3{0.f,0.f,1.f}) == uapprox3(-2.f,-3.f,4.f));
|
||||
}
|
||||
|
||||
SECTION("quaternion/qlook_at") {
|
||||
SECTION("qlook_at") {
|
||||
REQUIRE(all(approx(
|
||||
qlook_at_lh(float3(1.f,2.f,3.f), float3(0,1,0)),
|
||||
qrotate(float3x3(look_at_lh(float3(), float3(1.f,2.f,3.f), float3(0,1,0)))))));
|
||||
|
||||
@@ -262,8 +262,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
constexpr float4x4 rm1 = inverse(m1);
|
||||
STATIC_REQUIRE(all(approx(
|
||||
unit4_z<float> * m1 * rm1,
|
||||
unit4_z<float>,
|
||||
uapprox_epsilon_v<float>)));
|
||||
unit4_z<float>)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -272,8 +271,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
const float4x4 rm2 = inverse(m2);
|
||||
REQUIRE(all(approx(
|
||||
unit4_z<float> * m2 * rm2,
|
||||
unit4_z<float>,
|
||||
uapprox_epsilon_v<float>)));
|
||||
unit4_z<float>)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -282,8 +280,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
const float3x3 rm3 = inverse(m3);
|
||||
REQUIRE(all(approx(
|
||||
unit3_z<float> * m3 * rm3,
|
||||
unit3_z<float>,
|
||||
uapprox_epsilon_v<float>)));
|
||||
unit3_z<float>)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -292,8 +289,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
const float2x2 rm4 = inverse(m4);
|
||||
REQUIRE(all(approx(
|
||||
unit2_y<float> * m4 * rm4,
|
||||
unit2_y<float>,
|
||||
uapprox_epsilon_v<float>)));
|
||||
unit2_y<float>)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,45 +6,23 @@
|
||||
|
||||
#include <vmath.hpp/vmath.hpp>
|
||||
|
||||
#include <cfloat>
|
||||
|
||||
namespace vmath_tests
|
||||
{
|
||||
using namespace vmath_hpp;
|
||||
|
||||
template < typename T >
|
||||
struct uapprox_epsilon;
|
||||
|
||||
template <>
|
||||
struct uapprox_epsilon<int> {
|
||||
static constexpr int value = 0;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct uapprox_epsilon<float> {
|
||||
static constexpr float value = FLT_EPSILON * 100;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct uapprox_epsilon<double> {
|
||||
static constexpr float value = DBL_EPSILON * 100;
|
||||
struct uapprox_base {
|
||||
T epsilon = T(10) * std::numeric_limits<T>::epsilon();
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
inline constexpr T uapprox_epsilon_v = uapprox_epsilon<T>::value;
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
template < typename T >
|
||||
struct uapprox {
|
||||
struct uapprox : uapprox_base<T> {
|
||||
T value;
|
||||
explicit constexpr uapprox(T v) : value(v) {}
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct uapprox2 {
|
||||
struct uapprox2 : uapprox_base<T> {
|
||||
vec<T, 2> value;
|
||||
constexpr explicit uapprox2(T v) : value(v) {}
|
||||
constexpr explicit uapprox2(T x, T y) : value(x, y) {}
|
||||
@@ -52,7 +30,7 @@ namespace vmath_tests
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct uapprox3 {
|
||||
struct uapprox3 : uapprox_base<T> {
|
||||
vec<T, 3> value;
|
||||
constexpr explicit uapprox3(T v) : value(v) {}
|
||||
constexpr explicit uapprox3(T x, T y, T z) : value(x, y, z) {}
|
||||
@@ -60,7 +38,7 @@ namespace vmath_tests
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct uapprox4 {
|
||||
struct uapprox4 : uapprox_base<T> {
|
||||
vec<T, 4> value;
|
||||
constexpr explicit uapprox4(T v) : value(v) {}
|
||||
constexpr explicit uapprox4(T x, T y, T z, T w) : value(x, y, z, w) {}
|
||||
@@ -73,21 +51,21 @@ namespace vmath_tests
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const T& l, const uapprox<T>& r) {
|
||||
return approx(l, r.value, uapprox_epsilon_v<T>);
|
||||
return approx(l, r.value, r.epsilon);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const vec<T, 2>& l, const uapprox2<T>& r) {
|
||||
return all(approx(l, r.value, uapprox_epsilon_v<T>));
|
||||
return all(approx(l, r.value,r.epsilon));
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const vec<T, 3>& l, const uapprox3<T>& r) {
|
||||
return all(approx(l, r.value, uapprox_epsilon_v<T>));
|
||||
return all(approx(l, r.value, r.epsilon));
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const vec<T, 4>& l, const uapprox4<T>& r) {
|
||||
return all(approx(l, r.value, uapprox_epsilon_v<T>));
|
||||
return all(approx(l, r.value, r.epsilon));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user