From 31ce072f39513277a70d1d3611814cdc0a261635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 3 May 2013 13:49:32 +0200 Subject: [PATCH] Math: added initializer list overloads for min() and max(). Hopefully including doesn't do much harm to compilation time. --- src/Math/Functions.h | 33 +++++++++++++++++++++++++++++++-- src/Math/Test/FunctionsTest.cpp | 18 ++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Math/Functions.h b/src/Math/Functions.h index fec132599..09a1a130a 100644 --- a/src/Math/Functions.h +++ b/src/Math/Functions.h @@ -26,6 +26,7 @@ #include #include +#include /* for std::min(std::initializer_list) */ #include #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 inline T min(T a, T b); @@ -141,11 +141,25 @@ template inline Vector min(const Vector inline T min(std::initializer_list list); +#else +template inline typename std::enable_if::value, T>::type min(std::initializer_list list) { + return std::min(std::move(list)); +} +template inline Vector min(std::initializer_list> list) { + Vector 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 inline T max(const T& a, const T& b); @@ -161,6 +175,21 @@ template Vector max(const Vector& a } #endif +/** @overload */ +#ifdef DOXYGEN_GENERATING_OUTPUT +template inline T max(std::initializer_list list); +#else +template inline typename std::enable_if::value, T>::type max(std::initializer_list list) { + return std::max(std::move(list)); +} +template inline Vector max(std::initializer_list> list) { + Vector out(*list.begin()); + for(auto it = list.begin()+1; it != list.end(); ++it) + out = max(out, *it); + return out; +} +#endif + /** @brief Sign diff --git a/src/Math/Test/FunctionsTest.cpp b/src/Math/Test/FunctionsTest.cpp index 25e519f92..3f48d5ff3 100644 --- a/src/Math/Test/FunctionsTest.cpp +++ b/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 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);