From addf799040e8f0cefbe42ca1a22787802a969077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Fri, 6 Sep 2019 13:08:44 +0200 Subject: [PATCH] Workaround missing std::nextafter in uClibc Luckily, the rest of C++11 features seem to be supported... Closes #1739 --- docs/configuration.md | 3 ++- .../internal/catch_compiler_capabilities.h | 8 ++++++ include/internal/catch_matchers_floating.cpp | 25 +++++++++++++++++++ include/internal/catch_matchers_floating.h | 3 --- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 8726415a4e..8f0f9d008e 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -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. diff --git a/include/internal/catch_compiler_capabilities.h b/include/internal/catch_compiler_capabilities.h index 7934e7fae6..3460c81482 100644 --- a/include/internal/catch_compiler_capabilities.h +++ b/include/internal/catch_compiler_capabilities.h @@ -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... @@ -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 diff --git a/include/internal/catch_matchers_floating.cpp b/include/internal/catch_matchers_floating.cpp index d001b751cb..69a451c09e 100644 --- a/include/internal/catch_matchers_floating.cpp +++ b/include/internal/catch_matchers_floating.cpp @@ -11,13 +11,16 @@ #include "catch_to_string.hpp" #include "catch_tostring.h" +#include #include #include #include #include +#include #include #include + namespace Catch { namespace Matchers { namespace Floating { @@ -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 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; } diff --git a/include/internal/catch_matchers_floating.h b/include/internal/catch_matchers_floating.h index ee077526b6..3c1ceb072b 100644 --- a/include/internal/catch_matchers_floating.h +++ b/include/internal/catch_matchers_floating.h @@ -9,9 +9,6 @@ #include "catch_matchers.h" -#include -#include - namespace Catch { namespace Matchers {