Browse Source

Math: minmax() for a pointer range.

Thanks @Squareys for unblocking my brain!
pull/193/head
Vladimír Vondruš 9 years ago
parent
commit
eeac7e2868
  1. 33
      src/Magnum/Math/Functions.h
  2. 20
      src/Magnum/Math/Test/FunctionsTest.cpp

33
src/Magnum/Math/Functions.h

@ -332,6 +332,39 @@ template<std::size_t size, class T> std::pair<Vector<size, T>, Vector<size, T>>
}
#endif
namespace Implementation {
template<class T> inline typename std::enable_if<std::is_arithmetic<T>::value, void>::type minmax(T& min, T& max, T value) {
if(value < min)
min = value;
else if(value > max)
max = value;
}
template<std::size_t size, class T> inline void minmax(Vector<size, T>& min, Vector<size, T>& max, const Vector<size, T>& value) {
for(std::size_t i = 0; i != size; ++i)
minmax(min[i], max[i], value[i]);
}
}
/**
@brief Minimum and maximum of a range
If the range is empty, returns default-constructed values.
*/
template<class T> std::pair<T, T> minmax(Corrade::Containers::ArrayView<const T> range) {
if(range.empty()) return {};
T min{range[0]}, max{range[0]};
for(std::size_t i = 1; i != range.size(); ++i)
Implementation::minmax(min, max, range[i]);
return {min, max};
}
/** @overload */
template<class T> inline std::pair<T, T> minmax(std::initializer_list<T> list) {
return minmax(Corrade::Containers::ArrayView<const T>{list.begin(), list.size()});
}
/**
@brief Clamp value

20
src/Magnum/Math/Test/FunctionsTest.cpp

@ -42,6 +42,7 @@ struct FunctionsTest: Corrade::TestSuite::Tester {
void max();
void maxList();
void minmax();
void minmaxList();
void clamp();
void nanPropagation();
@ -86,6 +87,7 @@ FunctionsTest::FunctionsTest() {
&FunctionsTest::max,
&FunctionsTest::maxList,
&FunctionsTest::minmax,
&FunctionsTest::minmaxList,
&FunctionsTest::clamp,
&FunctionsTest::nanPropagation,
@ -171,6 +173,24 @@ void FunctionsTest::minmax() {
CORRADE_COMPARE_AS(Math::minmax(b, a), expectedVector, std::pair<Vector3, Vector3>);
}
void FunctionsTest::minmaxList() {
const auto expected = std::make_pair(-3.0f, 2.0f);
CORRADE_COMPARE(Math::minmax({-1.0f, 2.0f, -3.0f}), expected);
CORRADE_COMPARE(Math::minmax({-1.0f, -3.0f, 2.0f}), expected);
CORRADE_COMPARE(Math::minmax({2.0f, -1.0f, -3.0f}), expected);
CORRADE_COMPARE(Math::minmax({2.0f, -3.0f, -1.0f}), expected);
CORRADE_COMPARE(Math::minmax({-3.0f, 2.0f, -1.0f}), expected);
CORRADE_COMPARE(Math::minmax({-3.0f, -1.0f, 2.0f}), expected);
const std::pair<Vector2, Vector2> expectedVec{Vector2{-3.0f, -2.0f}, Vector2{2.0f, 3.0f}};
CORRADE_COMPARE(Math::minmax({Vector2{-1.0f, 3.0f}, Vector2{2.0f, 1.0f}, Vector2{-3.0f, -2.0f}}), expectedVec);
CORRADE_COMPARE(Math::minmax({Vector2{-1.0f, 1.0f}, Vector2{-3.0f, 3.0f}, Vector2{2.0f, -2.0f}}), expectedVec);
CORRADE_COMPARE(Math::minmax({Vector2{2.0f, -2.0f}, Vector2{-1.0f, 1.0f}, Vector2{-3.0f, 3.0f}}), expectedVec);
CORRADE_COMPARE(Math::minmax({Vector2{2.0f, 1.0f}, Vector2{-3.0f, -2.0f}, Vector2{-1.0f, 3.0f}}), expectedVec);
CORRADE_COMPARE(Math::minmax({Vector2{-3.0f, 3.0f}, Vector2{2.0f, -2.0f}, Vector2{-1.0f, 1.0f}}), expectedVec);
CORRADE_COMPARE(Math::minmax({Vector2{-3.0f, -2.0f}, Vector2{-1.0f, 3.0f}, Vector2{2.0f, 1.0f}}), expectedVec);
}
void FunctionsTest::clamp() {
CORRADE_COMPARE(Math::clamp(0.5f, -1.0f, 5.0f), 0.5f);
CORRADE_COMPARE(Math::clamp(-1.6f, -1.0f, 5.0f), -1.0f);

Loading…
Cancel
Save