diff --git a/src/Magnum/Math/Functions.h b/src/Magnum/Math/Functions.h index 9c1b1f3c2..fd634ebdc 100644 --- a/src/Magnum/Math/Functions.h +++ b/src/Magnum/Math/Functions.h @@ -272,13 +272,11 @@ template inline Vector pow(const Vector inline T min(T value, T min); #else -template inline typename std::enable_if::value, T>::type min(T value, T min) { - return std::min(value, min); -} +/* min() for scalars defined in Vector.h */ template inline Vector min(const Vector& value, const Vector& min) { Vector out{NoInit}; for(std::size_t i = 0; i != size; ++i) - out[i] = std::min(value[i], min[i]); + out[i] = Math::min(value[i], min[i]); return out; } #endif @@ -287,7 +285,7 @@ template inline Vector min(const Vector inline Vector min(const Vector& value, T min) { Vector out{NoInit}; for(std::size_t i = 0; i != size; ++i) - out[i] = std::min(value[i], min); + out[i] = Math::min(value[i], min); return out; } @@ -324,13 +322,11 @@ template inline T min(const T(&array)[size]) { #ifdef DOXYGEN_GENERATING_OUTPUT template inline T max(T value, T max); #else -template inline typename std::enable_if::value, T>::type max(T value, T max) { - return std::max(value, max); -} +/* max() for scalars defined in Vector.h */ template Vector max(const Vector& value, const Vector& max) { Vector out{NoInit}; for(std::size_t i = 0; i != size; ++i) - out[i] = std::max(value[i], max[i]); + out[i] = Math::max(value[i], max[i]); return out; } #endif @@ -339,7 +335,7 @@ template Vector max(const Vector& v template inline Vector max(const Vector& value, T max) { Vector out{NoInit}; for(std::size_t i = 0; i != size; ++i) - out[i] = std::max(value[i], max); + out[i] = Math::max(value[i], max); return out; } @@ -442,7 +438,7 @@ set to @p max. Equivalent to: template inline T clamp(const T& value, const T& min, const T& max); #else template inline typename std::enable_if::value, T>::type clamp(T value, T min, T max) { - return std::min(std::max(value, min), max); + return Math::min(Math::max(value, min), max); } template inline Vector clamp(const Vector& value, const Vector& min, const Vector& max) { Vector out{NoInit}; diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index b42067d5e..6211cfa37 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -30,9 +30,6 @@ */ #include -#ifdef _MSC_VER -#include /* std::max() */ -#endif #include #ifndef CORRADE_NO_DEBUG #include @@ -45,6 +42,17 @@ namespace Magnum { namespace Math { +#ifndef DOXYGEN_GENERATING_OUTPUT +/* Documented in Functions.h, defined here because Vector needs them */ +template constexpr typename std::enable_if::value, T>::type min(T a, T b) { + return b < a ? b : a; +} + +template constexpr typename std::enable_if::value, T>::type max(T a, T b) { + return a < b ? b : a; +} +#endif + namespace Implementation { template struct VectorConverter; /* Needed by DualQuaternion and Functions.h (to avoid dependency between them) */ @@ -1383,7 +1391,7 @@ template inline T Vector::min() const { T out(_data[0]); for(std::size_t i = 1; i != size; ++i) - out = std::min(out, _data[i]); + out = Math::min(out, _data[i]); return out; } @@ -1392,7 +1400,7 @@ template inline T Vector::max() const { T out(_data[0]); for(std::size_t i = 1; i != size; ++i) - out = std::max(out, _data[i]); + out = Math::max(out, _data[i]); return out; }