Browse Source

Math: added initializer list overloads for min() and max().

Hopefully including <algorithm> doesn't do much harm to compilation
time.
pull/278/head
Vladimír Vondruš 13 years ago
parent
commit
31ce072f39
  1. 33
      src/Math/Functions.h
  2. 18
      src/Math/Test/FunctionsTest.cpp

33
src/Math/Functions.h

@ -26,6 +26,7 @@
#include <cmath>
#include <type_traits>
#include <algorithm> /* for std::min(std::initializer_list) */
#include <limits>
#include "Math/Vector.h"
@ -125,7 +126,6 @@ perform the operations component-wise.
@brief Minimum
@see min(), clamp(), Vector::min()
@todo initializer list versions
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class T> inline T min(T a, T b);
@ -141,11 +141,25 @@ template<std::size_t size, class T> inline Vector<size, T> min(const Vector<size
}
#endif
/** @overload */
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class T> inline T min(std::initializer_list<T> list);
#else
template<class T> inline typename std::enable_if<std::is_arithmetic<T>::value, T>::type min(std::initializer_list<T> list) {
return std::min(std::move(list));
}
template<std::size_t size, class T> inline Vector<size, T> min(std::initializer_list<Vector<size, T>> list) {
Vector<size, T> out(*list.begin());
for(auto it = list.begin()+1; it != list.end(); ++it)
out = min(out, *it);
return out;
}
#endif
/**
@brief Maximum
@see max(), clamp(), Vector::max()
@todo initializer list versions
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class T> inline T max(const T& a, const T& b);
@ -161,6 +175,21 @@ template<std::size_t size, class T> Vector<size, T> max(const Vector<size, T>& a
}
#endif
/** @overload */
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class T> inline T max(std::initializer_list<T> list);
#else
template<class T> inline typename std::enable_if<std::is_arithmetic<T>::value, T>::type max(std::initializer_list<T> list) {
return std::max(std::move(list));
}
template<std::size_t size, class T> inline Vector<size, T> max(std::initializer_list<Vector<size, T>> list) {
Vector<size, T> out(*list.begin());
for(auto it = list.begin()+1; it != list.end(); ++it)
out = max(out, *it);
return out;
}
#endif
/**
@brief Sign

18
src/Math/Test/FunctionsTest.cpp

@ -34,7 +34,9 @@ class FunctionsTest: public Corrade::TestSuite::Tester {
FunctionsTest();
void min();
void minList();
void max();
void maxList();
void sign();
void abs();
void sqrt();
@ -68,7 +70,9 @@ typedef Math::Vector3<Int> Vector3i;
FunctionsTest::FunctionsTest() {
addTests({&FunctionsTest::min,
&FunctionsTest::minList,
&FunctionsTest::max,
&FunctionsTest::maxList,
&FunctionsTest::sign,
&FunctionsTest::abs,
&FunctionsTest::sqrt,
@ -97,11 +101,25 @@ void FunctionsTest::min() {
CORRADE_COMPARE(Math::min(Vector3i(5, -3, 2), Vector3i(9, -5, 18)), Vector3i(5, -5, 2));
}
void FunctionsTest::minList() {
CORRADE_COMPARE(Math::min({5, -2, 9}), -2);
CORRADE_COMPARE(Math::min({Vector3i(5, -3, 2),
Vector3i(-2, 14, 7),
Vector3i(9, -5, 18)}), Vector3i(-2, -5, 2));
}
void FunctionsTest::max() {
CORRADE_COMPARE(Math::max(5, 9), 9);
CORRADE_COMPARE(Math::max(Vector3i(5, -3, 2), Vector3i(9, -5, 18)), Vector3i(9, -3, 18));
}
void FunctionsTest::maxList() {
CORRADE_COMPARE(Math::max({5, -2, 9}), 9);
CORRADE_COMPARE(Math::max({Vector3i(5, -3, 2),
Vector3i(-2, 14, 7),
Vector3i(9, -5, 18)}), Vector3i(9, 14, 18));
}
void FunctionsTest::sign() {
CORRADE_COMPARE(Math::sign(3516), 1);
CORRADE_COMPARE(Math::sign(0.0f), 0.0f);

Loading…
Cancel
Save