remove algorithm and functional deps

This commit is contained in:
BlackMATov
2020-11-29 00:41:02 +07:00
parent d78b898159
commit bf09ef3f7d
6 changed files with 44 additions and 26 deletions

View File

@@ -229,13 +229,13 @@ namespace vmath_hpp
template < typename T > template < typename T >
[[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, T> [[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, T>
constexpr min(T x, T y) noexcept { constexpr min(T x, T y) noexcept {
return std::min(x, y); return x < y ? x : y;
} }
template < typename T > template < typename T >
[[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, T> [[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, T>
constexpr max(T x, T y) noexcept { constexpr max(T x, T y) noexcept {
return std::max(x, y); return x < y ? y : x;
} }
template < typename T > template < typename T >
@@ -287,8 +287,6 @@ namespace vmath_hpp
return std::isfinite(x); return std::isfinite(x);
} }
//
template < typename T > template < typename T >
[[nodiscard]] std::enable_if_t<std::is_floating_point_v<T>, T> [[nodiscard]] std::enable_if_t<std::is_floating_point_v<T>, T>
fma(T x, T y, T z) noexcept { fma(T x, T y, T z) noexcept {

View File

@@ -9,8 +9,6 @@
#include <cmath> #include <cmath>
#include <cstddef> #include <cstddef>
#include <algorithm>
#include <functional>
#include <stdexcept> #include <stdexcept>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>

View File

@@ -103,7 +103,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr mat<T, Size> operator-(const mat<T, Size>& xs) { [[nodiscard]] constexpr mat<T, Size> operator-(const mat<T, Size>& xs) {
return map(std::negate<>(), xs); return map([](const vec<T, Size>& x){ return -x; }, xs);
} }
// operator+ // operator+
@@ -120,7 +120,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr mat<T, Size> operator+(const mat<T, Size>& xs, const mat<T, Size>& ys) { [[nodiscard]] constexpr mat<T, Size> operator+(const mat<T, Size>& xs, const mat<T, Size>& ys) {
return zip(std::plus<>(), xs, ys); return zip([](const vec<T, Size>& x, const vec<T, Size>& y){ return x + y; }, xs, ys);
} }
// operator+= // operator+=
@@ -149,7 +149,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr mat<T, Size> operator-(const mat<T, Size>& xs, const mat<T, Size>& ys) { [[nodiscard]] constexpr mat<T, Size> operator-(const mat<T, Size>& xs, const mat<T, Size>& ys) {
return zip(std::minus<>(), xs, ys); return zip([](const vec<T, Size>& x, const vec<T, Size>& y){ return x - y; }, xs, ys);
} }
// operator-= // operator-=
@@ -281,7 +281,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr mat<T, Size> operator/(const mat<T, Size>& xs, const mat<T, Size>& ys) { [[nodiscard]] constexpr mat<T, Size> operator/(const mat<T, Size>& xs, const mat<T, Size>& ys) {
return zip(std::divides<>(), xs, ys); return zip([](const vec<T, Size>& x, const vec<T, Size>& y){ return x / y; }, xs, ys);
} }
// operator/= // operator/=

View File

@@ -100,7 +100,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr vec<T, Size> operator-(const vec<T, Size>& xs) { [[nodiscard]] constexpr vec<T, Size> operator-(const vec<T, Size>& xs) {
return map(std::negate<>(), xs); return map([](T x){ return -x; }, xs);
} }
// operator+ // operator+
@@ -117,7 +117,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr vec<T, Size> operator+(const vec<T, Size>& xs, const vec<T, Size>& ys) { [[nodiscard]] constexpr vec<T, Size> operator+(const vec<T, Size>& xs, const vec<T, Size>& ys) {
return zip(std::plus<>(), xs, ys); return zip([](T x, T y){ return x + y; }, xs, ys);
} }
// operator+= // operator+=
@@ -146,7 +146,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr vec<T, Size> operator-(const vec<T, Size>& xs, const vec<T, Size>& ys) { [[nodiscard]] constexpr vec<T, Size> operator-(const vec<T, Size>& xs, const vec<T, Size>& ys) {
return zip(std::minus<>(), xs, ys); return zip([](T x, T y){ return x - y; }, xs, ys);
} }
// operator-= // operator-=
@@ -175,7 +175,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr vec<T, Size> operator*(const vec<T, Size>& xs, const vec<T, Size>& ys) { [[nodiscard]] constexpr vec<T, Size> operator*(const vec<T, Size>& xs, const vec<T, Size>& ys) {
return zip(std::multiplies<>(), xs, ys); return zip([](T x, T y){ return x * y; }, xs, ys);
} }
// operator*= // operator*=
@@ -204,7 +204,7 @@ namespace vmath_hpp
template < typename T, std::size_t Size > template < typename T, std::size_t Size >
[[nodiscard]] constexpr vec<T, Size> operator/(const vec<T, Size>& xs, const vec<T, Size>& ys) { [[nodiscard]] constexpr vec<T, Size> operator/(const vec<T, Size>& xs, const vec<T, Size>& ys) {
return zip(std::divides<>(), xs, ys); return zip([](T x, T y){ return x / y; }, xs, ys);
} }
// operator/= // operator/=

View File

@@ -191,14 +191,14 @@ TEST_CASE("vmath/mat_fun") {
STATIC_REQUIRE(inverse(float4x4(0.5)) == float4x4(2.f)); STATIC_REQUIRE(inverse(float4x4(0.5)) == float4x4(2.f));
{ {
constexpr float4x4 m1 = translate(float3{1.f,2.f,3.f}); constexpr float4x4 m1 = translate(float3(1.f, 2.f, 3.f));
constexpr float4x4 inv_m1 = inverse(m1); constexpr float4x4 inv_m1 = inverse(m1);
constexpr float4x4 ref_m1 = translate(float3{-1.f,-2.f,-3.f}); constexpr float4x4 ref_m1 = translate(float3(-1.f, -2.f, -3.f));
STATIC_REQUIRE(inv_m1 == approx4x4(ref_m1)); STATIC_REQUIRE(inv_m1 == approx4x4(ref_m1));
} }
{ {
const float3 axis = normalize(float3{1.f,2.f,3.f}); const float3 axis = normalize(float3(1.f, 2.f, 3.f));
const float4x4 m1 = rotate(0.5f,axis); const float4x4 m1 = rotate(0.5f,axis);
const float4x4 inv_m1 = inverse(m1); const float4x4 inv_m1 = inverse(m1);
const float4x4 ref_m1 = rotate(-0.5f,axis); const float4x4 ref_m1 = rotate(-0.5f,axis);
@@ -206,7 +206,7 @@ TEST_CASE("vmath/mat_fun") {
} }
{ {
const float3 axis = normalize(float3{1.f,2.f,3.f}); const float3 axis = normalize(float3(1.f, 2.f, 3.f));
const float3x3 m1 = float3x3(rotate(0.5f,axis)); const float3x3 m1 = float3x3(rotate(0.5f,axis));
const float3x3 inv_m1 = inverse(m1); const float3x3 inv_m1 = inverse(m1);
const float3x3 ref_m1 = float3x3(rotate(-0.5f,axis)); const float3x3 ref_m1 = float3x3(rotate(-0.5f,axis));
@@ -214,7 +214,7 @@ TEST_CASE("vmath/mat_fun") {
} }
{ {
const float3 axis = normalize(float3{0.f,0.f,3.f}); const float3 axis = normalize(float3(0.f, 0.f, 3.f));
const float2x2 m1 = float2x2(rotate(0.5f,axis)); const float2x2 m1 = float2x2(rotate(0.5f,axis));
const float2x2 inv_m1 = inverse(m1); const float2x2 inv_m1 = inverse(m1);
const float2x2 ref_m1 = float2x2(rotate(-0.5f,axis)); const float2x2 ref_m1 = float2x2(rotate(-0.5f,axis));

View File

@@ -10,7 +10,7 @@
#include <vmath.hpp/vmath_mat.hpp> #include <vmath.hpp/vmath_mat.hpp>
#include <vmath.hpp/vmath_mat_fun.hpp> #include <vmath.hpp/vmath_mat_fun.hpp>
#include <limits> #include <cfloat>
#define STATIC_REQUIRE(...)\ #define STATIC_REQUIRE(...)\
static_assert(__VA_ARGS__, #__VA_ARGS__);\ static_assert(__VA_ARGS__, #__VA_ARGS__);\
@@ -25,7 +25,29 @@ namespace vmath_tests
using namespace vmath_hpp; using namespace vmath_hpp;
template < typename T > template < typename T >
inline constexpr T epsilon = std::numeric_limits<T>::epsilon() * 100; struct approx_epsilon;
template <>
struct approx_epsilon<int> {
static constexpr int value = 0;
};
template <>
struct approx_epsilon<float> {
static constexpr float value = FLT_EPSILON * 100;
};
template <>
struct approx_epsilon<double> {
static constexpr float value = DBL_EPSILON * 100;
};
template < typename T >
inline constexpr T approx_epsilon_v = approx_epsilon<T>::value;
//
//
//
template < typename T > template < typename T >
struct approx { struct approx {
@@ -103,22 +125,22 @@ namespace vmath_tests
template < typename T > template < typename T >
constexpr bool operator==(const T& l, const approx<T>& r) { constexpr bool operator==(const T& l, const approx<T>& r) {
return equal_to(l, r.value, epsilon<T>); return equal_to(l, r.value, approx_epsilon_v<T>);
} }
template < typename T > template < typename T >
constexpr bool operator==(const vec<T, 2>& l, const approx2<T>& r) { constexpr bool operator==(const vec<T, 2>& l, const approx2<T>& r) {
return all(equal_to(l, r.value, epsilon<T>)); return all(equal_to(l, r.value, approx_epsilon_v<T>));
} }
template < typename T > template < typename T >
constexpr bool operator==(const vec<T, 3>& l, const approx3<T>& r) { constexpr bool operator==(const vec<T, 3>& l, const approx3<T>& r) {
return all(equal_to(l, r.value, epsilon<T>)); return all(equal_to(l, r.value, approx_epsilon_v<T>));
} }
template < typename T > template < typename T >
constexpr bool operator==(const vec<T, 4>& l, const approx4<T>& r) { constexpr bool operator==(const vec<T, 4>& l, const approx4<T>& r) {
return all(equal_to(l, r.value, epsilon<T>)); return all(equal_to(l, r.value, approx_epsilon_v<T>));
} }
template < typename T > template < typename T >