limits.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Boost.Units - A C++ library for zero-overhead dimensional analysis and
  2. // unit/quantity manipulation and conversion
  3. //
  4. // Copyright (C) 2003-2008 Matthias Christian Schabel
  5. // Copyright (C) 2007-2008 Steven Watanabe
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See
  8. // accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. #ifndef BOOST_UNITS_LIMITS_HPP
  11. #define BOOST_UNITS_LIMITS_HPP
  12. ///
  13. /// \file
  14. /// \brief specialize std::numeric_limits for units.
  15. ///
  16. #include <limits>
  17. #include <boost/units/units_fwd.hpp>
  18. namespace std {
  19. template<class Unit, class T>
  20. class numeric_limits< ::boost::units::quantity<Unit, T> >
  21. {
  22. public:
  23. typedef ::boost::units::quantity<Unit, T> quantity_type;
  24. static const bool is_specialized = std::numeric_limits<T>::is_specialized;
  25. static quantity_type (min)() { return(quantity_type::from_value((std::numeric_limits<T>::min)())); }
  26. static quantity_type (max)() { return(quantity_type::from_value((std::numeric_limits<T>::max)())); }
  27. static const int digits = std::numeric_limits<T>::digits;
  28. static const int digits10 = std::numeric_limits<T>::digits10;
  29. static const bool is_signed = std::numeric_limits<T>::is_signed;
  30. static const bool is_integer = std::numeric_limits<T>::is_integer;
  31. static const bool is_exact = std::numeric_limits<T>::is_exact;
  32. static const int radix = std::numeric_limits<T>::radix;
  33. static quantity_type epsilon() { return(quantity_type::from_value(std::numeric_limits<T>::epsilon())); }
  34. static quantity_type round_error() { return(quantity_type::from_value(std::numeric_limits<T>::round_error())); }
  35. static const int min_exponent = std::numeric_limits<T>::min_exponent;
  36. static const int min_exponent10 = std::numeric_limits<T>::min_exponent10;
  37. static const int max_exponent = std::numeric_limits<T>::max_exponent;
  38. static const int max_exponent10 = std::numeric_limits<T>::max_exponent10;
  39. static const bool has_infinity = std::numeric_limits<T>::has_infinity;
  40. static const bool has_quiet_NaN = std::numeric_limits<T>::has_quiet_NaN;
  41. static const bool has_signaling_NaN = std::numeric_limits<T>::has_signaling_NaN;
  42. static const bool has_denorm_loss = std::numeric_limits<T>::has_denorm_loss;
  43. static quantity_type infinity() { return(quantity_type::from_value(std::numeric_limits<T>::infinity())); }
  44. static quantity_type quiet_NaN() { return(quantity_type::from_value(std::numeric_limits<T>::quiet_NaN())); }
  45. static quantity_type signaling_NaN() { return(quantity_type::from_value(std::numeric_limits<T>::signaling_NaN())); }
  46. static quantity_type denorm_min() { return(quantity_type::from_value(std::numeric_limits<T>::denorm_min())); }
  47. static const bool is_iec559 = std::numeric_limits<T>::is_iec559;
  48. static const bool is_bounded = std::numeric_limits<T>::is_bounded;
  49. static const bool is_modulo = std::numeric_limits<T>::is_modulo;
  50. static const bool traps = std::numeric_limits<T>::traps;
  51. static const bool tinyness_before = std::numeric_limits<T>::tinyness_before;
  52. #if defined(_STLP_STATIC_CONST_INIT_BUG)
  53. static const int has_denorm = std::numeric_limits<T>::has_denorm;
  54. static const int round_style = std::numeric_limits<T>::round_style;
  55. #else
  56. static const float_denorm_style has_denorm = std::numeric_limits<T>::has_denorm;
  57. static const float_round_style round_style = std::numeric_limits<T>::round_style;
  58. #endif
  59. };
  60. }
  61. #endif // BOOST_UNITS_LIMITS_HPP