diff --git a/libuavcan/include/uavcan/marshal/float_spec.hpp b/libuavcan/include/uavcan/marshal/float_spec.hpp index 2ee680f184..b77328f44a 100644 --- a/libuavcan/include/uavcan/marshal/float_spec.hpp +++ b/libuavcan/include/uavcan/marshal/float_spec.hpp @@ -16,9 +16,7 @@ #ifndef UAVCAN_CPP_VERSION # error UAVCAN_CPP_VERSION #endif -#if UAVCAN_CPP_VERSION < UAVCAN_CPP11 -# include // Needed for isfinite() -#else +#if UAVCAN_CPP_VERSION >= UAVCAN_CPP11 # include // Assuming that in C++11 mode all standard headers are available #endif @@ -169,8 +167,7 @@ public: private: static inline void saturate(StorageType& value) { - using namespace std; - if ((IsExactRepresentation == 0) && isfinite(value)) + if ((IsExactRepresentation == 0) && isFinite(value)) { if (value > max()) { @@ -189,8 +186,7 @@ private: static inline void truncate(StorageType& value) { - using namespace std; - if ((IsExactRepresentation == 0) && isfinite(value)) + if ((IsExactRepresentation == 0) && isFinite(value)) { if (value > max()) { diff --git a/libuavcan/include/uavcan/util/templates.hpp b/libuavcan/include/uavcan/util/templates.hpp index e25102790d..e2572ff3d3 100644 --- a/libuavcan/include/uavcan/util/templates.hpp +++ b/libuavcan/include/uavcan/util/templates.hpp @@ -470,6 +470,20 @@ inline bool isInfinity(T arg) #endif } +/** + * Replacement for std::isfinite(). + * Note that direct float comparison (==, !=) is intentionally avoided. + */ +template +inline bool isFinite(T arg) +{ +#if UAVCAN_CPP_VERSION >= UAVCAN_CPP11 + return std::isfinite(arg); +#else + return !isNaN(arg) && !isInfinity(arg); +#endif +} + /** * Replacement for std::signbit(). * Note that direct float comparison (==, !=) is intentionally avoided.