min/max for vector components

This commit is contained in:
BlackMATov
2020-11-26 00:01:27 +07:00
parent 7805d57ba7
commit db848a7964
2 changed files with 25 additions and 0 deletions

View File

@@ -49,6 +49,14 @@ namespace vmath_hpp::detail
{
return ((init = f(std::move(init), b[Is], c[Is])), ...);
}
template < typename A, std::size_t Size, typename F, std::size_t I, std::size_t... Is >
constexpr auto fold1_impl(F&& f, const vec<A, Size>& a, std::index_sequence<I, Is...>)
-> A
{
A init = a[I];
return ((init = f(std::move(init), a[Is])), ...);
}
}
template < typename A, std::size_t Size, typename F >
@@ -75,6 +83,11 @@ namespace vmath_hpp::detail
constexpr auto fold(F&& f, A init, const vec<B, Size>& b, const vec<C, Size>& c) {
return impl::fold_impl(std::forward<F>(f), std::move(init), b, c, std::make_index_sequence<Size>{});
}
template < typename A, std::size_t Size, typename F >
constexpr auto fold1(F&& f, const vec<A, Size>& a) {
return impl::fold1_impl(std::forward<F>(f), a, std::make_index_sequence<Size>{});
}
}
//
@@ -426,6 +439,11 @@ namespace vmath_hpp
return impl::modf_impl(xs, is, std::make_index_sequence<Size>{});
}
template < typename T, std::size_t Size >
constexpr T min(const vec<T, Size>& xs) {
return fold1([](T acc, T x){ return min(acc, x); }, xs);
}
template < typename T, std::size_t Size >
constexpr vec<T, Size> min(const vec<T, Size>& xs, T y) {
return map([y](T x) { return min(x, y); }, xs);
@@ -436,6 +454,11 @@ namespace vmath_hpp
return zip([](T x, T y) { return min(x, y); }, xs, ys);
}
template < typename T, std::size_t Size >
constexpr T max(const vec<T, Size>& xs) {
return fold1([](T acc, T x){ return max(acc, x); }, xs);
}
template < typename T, std::size_t Size >
constexpr vec<T, Size> max(const vec<T, Size>& xs, T y) {
return map([y](T x) { return max(x, y); }, xs);

View File

@@ -117,9 +117,11 @@ TEST_CASE("vmath/vec_fun") {
REQUIRE(out_i.x == Approx(1.f));
}
STATIC_REQUIRE(min(vec2i(1,2)) == 1);
STATIC_REQUIRE(min(vec2i(1,2), 1) == vec2i(1,1));
STATIC_REQUIRE(min(vec2i(1,1), vec2i(0,2)) == vec2i(0,1));
STATIC_REQUIRE(max(vec2i(1,2)) == 2);
STATIC_REQUIRE(max(vec2i(1,2), 1) == vec2i(1,2));
STATIC_REQUIRE(max(vec2i(1,1), vec2i(0,2)) == vec2i(1,2));