diff --git a/range.cpp b/range.cpp index a07623c5..240af69d 100644 --- a/range.cpp +++ b/range.cpp @@ -177,10 +177,16 @@ range::operator ==(const range &rhs) const template const range -range::UNLIMITED (numeric_limits ::is_integer ? numeric_limits ::min () : - -numeric_limits ::infinity (), - numeric_limits ::is_integer ? numeric_limits ::max () : - numeric_limits ::infinity ()); +range::UNLIMITED (numeric_limits::has_infinity ? -numeric_limits::infinity () : + numeric_limits::lowest (), + numeric_limits::has_infinity ? numeric_limits::infinity () : + numeric_limits::max ()); + +template +const range +range::MAX (numeric_limits::lowest (), + numeric_limits::max ()); + template const range diff --git a/range.hpp b/range.hpp index 4c76e99e..396a2dc0 100644 --- a/range.hpp +++ b/range.hpp @@ -73,9 +73,10 @@ namespace util { { return !(*this == rhs); } /// A range which is guaranteed to contain all elements type T - static const range UNLIMITED; + static const range UNLIMITED; + static const range MAX; /// A range which only contains elements between 0 and 1 inclusive - static const range UNIT; + static const range UNIT; void sanity (void) const; }; diff --git a/test/range.cpp b/test/range.cpp index 78d98213..275ec61e 100644 --- a/test/range.cpp +++ b/test/range.cpp @@ -9,25 +9,38 @@ using namespace util; int main (int, char **) { + // Check some simple cases close to the edges of a unit range. Tests float rounding. CHECK_HARD ( range::UNIT.contains ( 0.0)); CHECK_HARD ( range::UNIT.contains ( 0.5)); CHECK_HARD ( range::UNIT.contains ( 1.0)); + CHECK_HARD ( range::UNIT.contains (std::numeric_limits::min ())); CHECK_HARD (!range::UNIT.contains (-0.00001)); CHECK_HARD (!range::UNIT.contains ( 1.00001)); + // Check edge cases of unit with integer values CHECK_HARD ( range::UNIT.contains (0)); CHECK_HARD ( range::UNIT.contains (1)); CHECK_HARD (!range::UNIT.contains (2)); CHECK_HARD (!range::UNIT.contains (numeric_limits ::max ())); + // Check the inclusivity of UNLIMITED with special floating values CHECK_HARD ( range::UNLIMITED.contains (0.0)); CHECK_HARD ( range::UNLIMITED.contains (+numeric_limits::infinity ())); CHECK_HARD ( range::UNLIMITED.contains (-numeric_limits::infinity ())); CHECK_HARD (!range::UNLIMITED.contains ( numeric_limits::quiet_NaN ())); + // Check the inclusivity of UNLIMITED with some large numbers CHECK_HARD ( range::UNLIMITED.contains (numeric_limits::min())); CHECK_HARD ( range::UNLIMITED.contains (numeric_limits::max())); + // Check inclusivity of MAX + CHECK_HARD (!range::MAX.contains ( numeric_limits::infinity ())); + CHECK_HARD (!range::MAX.contains (-numeric_limits::infinity ())); + + CHECK_HARD ( range::MAX.contains (numeric_limits::min())); + CHECK_HARD ( range::MAX.contains (numeric_limits::max())); + + // Check that expansion via NaN is a noop { range initial_nan (numeric_limits::quiet_NaN (), numeric_limits::quiet_NaN ());