Skip to content

Commit

Permalink
Workaround missing std::nextafter in uClibc
Browse files Browse the repository at this point in the history
Luckily, the rest of C++11 features seem to be supported...

Closes #1739
  • Loading branch information
horenmar committed Sep 6, 2019
1 parent 155274f commit addf799
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
3 changes: 2 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,9 @@ by using `_NO_` in the macro, e.g. `CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS`.
CATCH_CONFIG_ENABLE_BENCHMARKING // Enables the integrated benchmarking features (has a significant effect on compilation speed)
CATCH_CONFIG_USE_ASYNC // Force parallel statistical processing of samples during benchmarking
CATCH_CONFIG_ANDROID_LOGWRITE // Use android's logging system for debug output
CATCH_CONFIG_GLOBAL_NEXTAFTER // Use nextafter{,f,l} instead of std::nextafter

> `CATCH_CONFIG_ANDROID_LOGWRITE` was [introduced](https://github.com/catchorg/Catch2/issues/1743) in Catch X.Y.Z
> `CATCH_CONFIG_ANDROID_LOGWRITE` and `CATCH_CONFIG_GLOBAL_NEXTAFTER` were [introduced](https://github.com/catchorg/Catch2/issues/1743) in Catch X.Y.Z
Currently Catch enables `CATCH_CONFIG_WINDOWS_SEH` only when compiled with MSVC, because some versions of MinGW do not have the necessary Win32 API support.

Expand Down
8 changes: 8 additions & 0 deletions include/internal/catch_compiler_capabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@
#define CATCH_CONFIG_COLOUR_NONE
#endif

#if defined(__UCLIBC__)
#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
#endif

////////////////////////////////////////////////////////////////////////////////
// Check if string_view is available and usable
// The check is split apart to work around v140 (VS2015) preprocessor issue...
Expand Down Expand Up @@ -306,6 +310,10 @@
# define CATCH_CONFIG_ANDROID_LOGWRITE
#endif

#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
# define CATCH_CONFIG_GLOBAL_NEXTAFTER
#endif

#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS
Expand Down
25 changes: 25 additions & 0 deletions include/internal/catch_matchers_floating.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
#include "catch_to_string.hpp"
#include "catch_tostring.h"

#include <cmath>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <sstream>
#include <type_traits>
#include <iomanip>
#include <limits>


namespace Catch {
namespace Matchers {
namespace Floating {
Expand Down Expand Up @@ -77,10 +80,32 @@ bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) {
return ulpDiff <= maxUlpDiff;
}

#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)

namespace Catch {
float nextafter(float x, float y) {
return ::nextafterf(x, y);
}

double nextafter(double x, double y) {
return ::nextafter(x, y);
}

long double nextafter(long double x, long double y) {
return ::nextafterl(x, y);
}
} // end namespace Catch

#endif

template <typename FP>
FP step(FP start, FP direction, int steps) {
for (int i = 0; i < steps; ++i) {
#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
start = Catch::nextafter(start, direction);
#else
start = std::nextafter(start, direction);
#endif
}
return start;
}
Expand Down
3 changes: 0 additions & 3 deletions include/internal/catch_matchers_floating.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@

#include "catch_matchers.h"

#include <type_traits>
#include <cmath>

namespace Catch {
namespace Matchers {

Expand Down

0 comments on commit addf799

Please sign in to comment.