Browse Source

Math: work around missing std::round() in NaCl newlib.

Also test that our implementation behaves the same.
pull/38/head
Vladimír Vondruš 13 years ago
parent
commit
282ee58c62
  1. 11
      src/Math/Functions.h
  2. 9
      src/Math/Test/FunctionsTest.cpp

11
src/Math/Functions.h

@ -251,12 +251,21 @@ template<std::size_t size, class T> Vector<size, T> floor(const Vector<size, T>&
template<class T> inline T round(const T& a);
#else
template<class T> inline typename std::enable_if<std::is_arithmetic<T>::value, T>::type round(T a) {
#ifndef CORRADE_TARGET_NACL_NEWLIB
return std::round(a);
#else
return (a > T(0)) ? std::floor(a + T(0.5)) : std::ceil(a - T(0.5));
#endif
}
template<std::size_t size, class T> Vector<size, T> round(const Vector<size, T>& a) {
Vector<size, T> out;
for(std::size_t i = 0; i != size; ++i)
for(std::size_t i = 0; i != size; ++i) {
#ifndef CORRADE_TARGET_NACL_NEWLIB
out[i] = std::round(a[i]);
#else
out[i] = round(a[i]);
#endif
}
return out;
}
#endif

9
src/Math/Test/FunctionsTest.cpp

@ -167,6 +167,15 @@ void FunctionsTest::floor() {
void FunctionsTest::round() {
CORRADE_COMPARE(Math::round(2.3f), 2.0f);
CORRADE_COMPARE(Math::round(Vector3(2.3f, 0.7f, 1.5f)), Vector3(2.0f, 1.0f, 2.0f));
/* We are working around missing std::round() in NaCl newlib, thus we must
test that the behavior is the same on both implementations */
CORRADE_COMPARE(Math::round(-2.0f), -2.0f);
CORRADE_COMPARE(Math::round(-1.5f), -2.0f);
CORRADE_COMPARE(Math::round(-1.3f), -1.0f);
CORRADE_COMPARE(Math::round(1.3f), 1.0f);
CORRADE_COMPARE(Math::round(1.5f), 2.0f);
CORRADE_COMPARE(Math::round(2.0f), 2.0f);
}
void FunctionsTest::ceil() {

Loading…
Cancel
Save