integer_traits.hpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /* boost integer_traits.hpp header file
  2. *
  3. * Copyright Jens Maurer 2000
  4. * Distributed under the Boost Software License, Version 1.0. (See
  5. * accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * $Id: integer_traits.hpp 32576 2006-02-05 10:19:42Z johnmaddock $
  9. *
  10. * Idea by Beman Dawes, Ed Brey, Steve Cleary, and Nathan Myers
  11. */
  12. // See http://www.boost.org/libs/integer for documentation.
  13. #ifndef BOOST_INTEGER_TRAITS_HPP
  14. #define BOOST_INTEGER_TRAITS_HPP
  15. #include <boost/config.hpp>
  16. #include <boost/limits.hpp>
  17. // These are an implementation detail and not part of the interface
  18. #include <limits.h>
  19. // we need wchar.h for WCHAR_MAX/MIN but not all platforms provide it,
  20. // and some may have <wchar.h> but not <cwchar> ...
  21. #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) && (!defined(BOOST_NO_CWCHAR) || defined(sun) || defined(__sun) || defined(__QNX__))
  22. #include <wchar.h>
  23. #endif
  24. namespace boost {
  25. template<class T>
  26. class integer_traits : public std::numeric_limits<T>
  27. {
  28. public:
  29. BOOST_STATIC_CONSTANT(bool, is_integral = false);
  30. };
  31. namespace detail {
  32. template<class T, T min_val, T max_val>
  33. class integer_traits_base
  34. {
  35. public:
  36. BOOST_STATIC_CONSTANT(bool, is_integral = true);
  37. BOOST_STATIC_CONSTANT(T, const_min = min_val);
  38. BOOST_STATIC_CONSTANT(T, const_max = max_val);
  39. };
  40. #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
  41. // A definition is required even for integral static constants
  42. template<class T, T min_val, T max_val>
  43. const bool integer_traits_base<T, min_val, max_val>::is_integral;
  44. template<class T, T min_val, T max_val>
  45. const T integer_traits_base<T, min_val, max_val>::const_min;
  46. template<class T, T min_val, T max_val>
  47. const T integer_traits_base<T, min_val, max_val>::const_max;
  48. #endif
  49. } // namespace detail
  50. template<>
  51. class integer_traits<bool>
  52. : public std::numeric_limits<bool>,
  53. public detail::integer_traits_base<bool, false, true>
  54. { };
  55. template<>
  56. class integer_traits<char>
  57. : public std::numeric_limits<char>,
  58. public detail::integer_traits_base<char, CHAR_MIN, CHAR_MAX>
  59. { };
  60. template<>
  61. class integer_traits<signed char>
  62. : public std::numeric_limits<signed char>,
  63. public detail::integer_traits_base<signed char, SCHAR_MIN, SCHAR_MAX>
  64. { };
  65. template<>
  66. class integer_traits<unsigned char>
  67. : public std::numeric_limits<unsigned char>,
  68. public detail::integer_traits_base<unsigned char, 0, UCHAR_MAX>
  69. { };
  70. #ifndef BOOST_NO_INTRINSIC_WCHAR_T
  71. template<>
  72. class integer_traits<wchar_t>
  73. : public std::numeric_limits<wchar_t>,
  74. // Don't trust WCHAR_MIN and WCHAR_MAX with Mac OS X's native
  75. // library: they are wrong!
  76. #if defined(WCHAR_MIN) && defined(WCHAR_MAX) && !defined(__APPLE__)
  77. public detail::integer_traits_base<wchar_t, WCHAR_MIN, WCHAR_MAX>
  78. #elif defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) || (defined(__BEOS__) && defined(__GNUC__))
  79. // No WCHAR_MIN and WCHAR_MAX, whar_t is short and unsigned:
  80. public detail::integer_traits_base<wchar_t, 0, 0xffff>
  81. #elif (defined(__sgi) && (!defined(__SGI_STL_PORT) || __SGI_STL_PORT < 0x400))\
  82. || (defined __APPLE__)\
  83. || (defined(__OpenBSD__) && defined(__GNUC__))\
  84. || (defined(__NetBSD__) && defined(__GNUC__))\
  85. || (defined(__FreeBSD__) && defined(__GNUC__))\
  86. || (defined(__DragonFly__) && defined(__GNUC__))\
  87. || (defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 3) && !defined(__SGI_STL_PORT))
  88. // No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as int.
  89. // - SGI MIPSpro with native library
  90. // - gcc 3.x on HP-UX
  91. // - Mac OS X with native library
  92. // - gcc on FreeBSD, OpenBSD and NetBSD
  93. public detail::integer_traits_base<wchar_t, INT_MIN, INT_MAX>
  94. #elif defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 2) && !defined(__SGI_STL_PORT)
  95. // No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as unsigned int.
  96. // - gcc 2.95.x on HP-UX
  97. // (also, std::numeric_limits<wchar_t> appears to return the wrong values).
  98. public detail::integer_traits_base<wchar_t, 0, UINT_MAX>
  99. #else
  100. #error No WCHAR_MIN and WCHAR_MAX present, please adjust integer_traits<> for your compiler.
  101. #endif
  102. { };
  103. #endif // BOOST_NO_INTRINSIC_WCHAR_T
  104. template<>
  105. class integer_traits<short>
  106. : public std::numeric_limits<short>,
  107. public detail::integer_traits_base<short, SHRT_MIN, SHRT_MAX>
  108. { };
  109. template<>
  110. class integer_traits<unsigned short>
  111. : public std::numeric_limits<unsigned short>,
  112. public detail::integer_traits_base<unsigned short, 0, USHRT_MAX>
  113. { };
  114. template<>
  115. class integer_traits<int>
  116. : public std::numeric_limits<int>,
  117. public detail::integer_traits_base<int, INT_MIN, INT_MAX>
  118. { };
  119. template<>
  120. class integer_traits<unsigned int>
  121. : public std::numeric_limits<unsigned int>,
  122. public detail::integer_traits_base<unsigned int, 0, UINT_MAX>
  123. { };
  124. template<>
  125. class integer_traits<long>
  126. : public std::numeric_limits<long>,
  127. public detail::integer_traits_base<long, LONG_MIN, LONG_MAX>
  128. { };
  129. template<>
  130. class integer_traits<unsigned long>
  131. : public std::numeric_limits<unsigned long>,
  132. public detail::integer_traits_base<unsigned long, 0, ULONG_MAX>
  133. { };
  134. #if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T)
  135. #if defined(ULLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
  136. template<>
  137. class integer_traits< ::boost::long_long_type>
  138. : public std::numeric_limits< ::boost::long_long_type>,
  139. public detail::integer_traits_base< ::boost::long_long_type, LLONG_MIN, LLONG_MAX>
  140. { };
  141. template<>
  142. class integer_traits< ::boost::ulong_long_type>
  143. : public std::numeric_limits< ::boost::ulong_long_type>,
  144. public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULLONG_MAX>
  145. { };
  146. #elif defined(ULONG_LONG_MAX) && defined(BOOST_HAS_LONG_LONG)
  147. template<>
  148. class integer_traits< ::boost::long_long_type> : public std::numeric_limits< ::boost::long_long_type>, public detail::integer_traits_base< ::boost::long_long_type, LONG_LONG_MIN, LONG_LONG_MAX>{ };
  149. template<>
  150. class integer_traits< ::boost::ulong_long_type>
  151. : public std::numeric_limits< ::boost::ulong_long_type>,
  152. public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULONG_LONG_MAX>
  153. { };
  154. #elif defined(ULONGLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
  155. template<>
  156. class integer_traits< ::boost::long_long_type>
  157. : public std::numeric_limits< ::boost::long_long_type>,
  158. public detail::integer_traits_base< ::boost::long_long_type, LONGLONG_MIN, LONGLONG_MAX>
  159. { };
  160. template<>
  161. class integer_traits< ::boost::ulong_long_type>
  162. : public std::numeric_limits< ::boost::ulong_long_type>,
  163. public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULONGLONG_MAX>
  164. { };
  165. #elif defined(_LLONG_MAX) && defined(_C2) && defined(BOOST_HAS_LONG_LONG)
  166. template<>
  167. class integer_traits< ::boost::long_long_type>
  168. : public std::numeric_limits< ::boost::long_long_type>,
  169. public detail::integer_traits_base< ::boost::long_long_type, -_LLONG_MAX - _C2, _LLONG_MAX>
  170. { };
  171. template<>
  172. class integer_traits< ::boost::ulong_long_type>
  173. : public std::numeric_limits< ::boost::ulong_long_type>,
  174. public detail::integer_traits_base< ::boost::ulong_long_type, 0, _ULLONG_MAX>
  175. { };
  176. #elif defined(BOOST_HAS_LONG_LONG)
  177. //
  178. // we have long long but no constants, this happens for example with gcc in -ansi mode,
  179. // we'll just have to work out the values for ourselves (assumes 2's compliment representation):
  180. //
  181. template<>
  182. class integer_traits< ::boost::long_long_type>
  183. : public std::numeric_limits< ::boost::long_long_type>,
  184. public detail::integer_traits_base< ::boost::long_long_type, (1LL << (sizeof(::boost::long_long_type) - 1)), ~(1LL << (sizeof(::boost::long_long_type) - 1))>
  185. { };
  186. template<>
  187. class integer_traits< ::boost::ulong_long_type>
  188. : public std::numeric_limits< ::boost::ulong_long_type>,
  189. public detail::integer_traits_base< ::boost::ulong_long_type, 0, ~0uLL>
  190. { };
  191. #endif
  192. #endif
  193. } // namespace boost
  194. #endif /* BOOST_INTEGER_TRAITS_HPP */