mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-14 20:31:25 +07:00
min/max for vector components
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user