diff --git a/src/libCom/cppStd/epicsAlgorithm.h b/src/libCom/cppStd/epicsAlgorithm.h index b5f43a3de..20850242d 100644 --- a/src/libCom/cppStd/epicsAlgorithm.h +++ b/src/libCom/cppStd/epicsAlgorithm.h @@ -13,18 +13,61 @@ #ifndef __EPICS_ALGORITHM_H__ #define __EPICS_ALGORITHM_H__ -template -inline const T& epicsMax (const T& a, const T& b) -{ - return (a inline const T& epicsMin (const T& a, const T& b) { - return (a +inline const float& epicsMin (const float& a, const float& b) +{ + return (b < a) || isnan(b) ? b : a; +} + +template <> +inline const double& epicsMin (const double& a, const double& b) +{ + return (b < a) || isnan(b) ? b : a; +} + + +// epicsMax + +template +inline const T& epicsMax (const T& a, const T& b) +{ + return (a < b) ? b : a; +} + +// If b is a NaN the above template returns a, but should return NaN. +// These specializations ensure that epicsMax(x,NaN) == NaN + +template <> +inline const float& epicsMax (const float& a, const float& b) +{ + return (a < b) || isnan(b) ? b : a; +} + +template <> +inline const double& epicsMax (const double& a, const double& b) +{ + return (a < b) || isnan(b) ? b : a; +} + + +// epicsSwap + template inline void epicsSwap(T& a, T& b) {