File indexing completed on 2025-12-15 10:10:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef BOOST_INTEGER_TRAITS_HPP
0017 #define BOOST_INTEGER_TRAITS_HPP
0018
0019 #include <boost/config.hpp>
0020 #include <boost/limits.hpp>
0021
0022
0023 #include <limits.h>
0024
0025
0026 #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) && (!defined(BOOST_NO_CWCHAR) || defined(sun) || defined(__sun) || defined(__QNX__))
0027 #include <wchar.h>
0028 #endif
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #if defined(__GNUC__) && (__GNUC__ >= 4)
0039 #pragma GCC system_header
0040 #endif
0041
0042 namespace boost {
0043 template<class T>
0044 class integer_traits : public std::numeric_limits<T>
0045 {
0046 public:
0047 BOOST_STATIC_CONSTANT(bool, is_integral = false);
0048 };
0049
0050 namespace detail {
0051 template<class T, T min_val, T max_val>
0052 class integer_traits_base
0053 {
0054 public:
0055 BOOST_STATIC_CONSTANT(bool, is_integral = true);
0056 BOOST_STATIC_CONSTANT(T, const_min = min_val);
0057 BOOST_STATIC_CONSTANT(T, const_max = max_val);
0058 };
0059
0060 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
0061
0062 template<class T, T min_val, T max_val>
0063 const bool integer_traits_base<T, min_val, max_val>::is_integral;
0064
0065 template<class T, T min_val, T max_val>
0066 const T integer_traits_base<T, min_val, max_val>::const_min;
0067
0068 template<class T, T min_val, T max_val>
0069 const T integer_traits_base<T, min_val, max_val>::const_max;
0070 #endif
0071
0072 }
0073
0074 template<>
0075 class integer_traits<bool>
0076 : public std::numeric_limits<bool>,
0077 public detail::integer_traits_base<bool, false, true>
0078 { };
0079
0080 template<>
0081 class integer_traits<char>
0082 : public std::numeric_limits<char>,
0083 public detail::integer_traits_base<char, CHAR_MIN, CHAR_MAX>
0084 { };
0085
0086 template<>
0087 class integer_traits<signed char>
0088 : public std::numeric_limits<signed char>,
0089 public detail::integer_traits_base<signed char, SCHAR_MIN, SCHAR_MAX>
0090 { };
0091
0092 template<>
0093 class integer_traits<unsigned char>
0094 : public std::numeric_limits<unsigned char>,
0095 public detail::integer_traits_base<unsigned char, 0, UCHAR_MAX>
0096 { };
0097
0098 #ifndef BOOST_NO_INTRINSIC_WCHAR_T
0099 template<>
0100 class integer_traits<wchar_t>
0101 : public std::numeric_limits<wchar_t>,
0102
0103
0104 #if defined(WCHAR_MIN) && defined(WCHAR_MAX) && !defined(__APPLE__)
0105 public detail::integer_traits_base<wchar_t, WCHAR_MIN, WCHAR_MAX>
0106 #elif defined(BOOST_BORLANDC) || defined(__CYGWIN__) || defined(__MINGW32__) || (defined(__BEOS__) && defined(__GNUC__))
0107
0108 public detail::integer_traits_base<wchar_t, 0, 0xffff>
0109 #elif (defined(__sgi) && (!defined(__SGI_STL_PORT) || __SGI_STL_PORT < 0x400))\
0110 || (defined __APPLE__)\
0111 || (defined(__OpenBSD__) && defined(__GNUC__))\
0112 || (defined(__NetBSD__) && defined(__GNUC__))\
0113 || (defined(__FreeBSD__) && defined(__GNUC__))\
0114 || (defined(__DragonFly__) && defined(__GNUC__))\
0115 || (defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 3) && !defined(__SGI_STL_PORT))
0116
0117
0118
0119
0120
0121 public detail::integer_traits_base<wchar_t, INT_MIN, INT_MAX>
0122 #else
0123 #error No WCHAR_MIN and WCHAR_MAX present, please adjust integer_traits<> for your compiler.
0124 #endif
0125 { };
0126 #endif
0127
0128 template<>
0129 class integer_traits<short>
0130 : public std::numeric_limits<short>,
0131 public detail::integer_traits_base<short, SHRT_MIN, SHRT_MAX>
0132 { };
0133
0134 template<>
0135 class integer_traits<unsigned short>
0136 : public std::numeric_limits<unsigned short>,
0137 public detail::integer_traits_base<unsigned short, 0, USHRT_MAX>
0138 { };
0139
0140 template<>
0141 class integer_traits<int>
0142 : public std::numeric_limits<int>,
0143 public detail::integer_traits_base<int, INT_MIN, INT_MAX>
0144 { };
0145
0146 template<>
0147 class integer_traits<unsigned int>
0148 : public std::numeric_limits<unsigned int>,
0149 public detail::integer_traits_base<unsigned int, 0, UINT_MAX>
0150 { };
0151
0152 template<>
0153 class integer_traits<long>
0154 : public std::numeric_limits<long>,
0155 public detail::integer_traits_base<long, LONG_MIN, LONG_MAX>
0156 { };
0157
0158 template<>
0159 class integer_traits<unsigned long>
0160 : public std::numeric_limits<unsigned long>,
0161 public detail::integer_traits_base<unsigned long, 0, ULONG_MAX>
0162 { };
0163
0164 #if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T)
0165 #if defined(ULLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
0166
0167 template<>
0168 class integer_traits< ::boost::long_long_type>
0169 : public std::numeric_limits< ::boost::long_long_type>,
0170 public detail::integer_traits_base< ::boost::long_long_type, LLONG_MIN, LLONG_MAX>
0171 { };
0172
0173 template<>
0174 class integer_traits< ::boost::ulong_long_type>
0175 : public std::numeric_limits< ::boost::ulong_long_type>,
0176 public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULLONG_MAX>
0177 { };
0178
0179 #elif defined(ULONG_LONG_MAX) && defined(BOOST_HAS_LONG_LONG)
0180
0181 template<>
0182 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>{ };
0183 template<>
0184 class integer_traits< ::boost::ulong_long_type>
0185 : public std::numeric_limits< ::boost::ulong_long_type>,
0186 public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULONG_LONG_MAX>
0187 { };
0188
0189 #elif defined(ULONGLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
0190
0191 template<>
0192 class integer_traits< ::boost::long_long_type>
0193 : public std::numeric_limits< ::boost::long_long_type>,
0194 public detail::integer_traits_base< ::boost::long_long_type, LONGLONG_MIN, LONGLONG_MAX>
0195 { };
0196
0197 template<>
0198 class integer_traits< ::boost::ulong_long_type>
0199 : public std::numeric_limits< ::boost::ulong_long_type>,
0200 public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULONGLONG_MAX>
0201 { };
0202
0203 #elif defined(_LLONG_MAX) && defined(_C2) && defined(BOOST_HAS_LONG_LONG)
0204
0205 template<>
0206 class integer_traits< ::boost::long_long_type>
0207 : public std::numeric_limits< ::boost::long_long_type>,
0208 public detail::integer_traits_base< ::boost::long_long_type, -_LLONG_MAX - _C2, _LLONG_MAX>
0209 { };
0210
0211 template<>
0212 class integer_traits< ::boost::ulong_long_type>
0213 : public std::numeric_limits< ::boost::ulong_long_type>,
0214 public detail::integer_traits_base< ::boost::ulong_long_type, 0, _ULLONG_MAX>
0215 { };
0216
0217 #elif defined(BOOST_HAS_LONG_LONG)
0218
0219
0220
0221
0222 template<>
0223 class integer_traits< ::boost::long_long_type>
0224 : public std::numeric_limits< ::boost::long_long_type>,
0225 public detail::integer_traits_base< ::boost::long_long_type, (1LL << (sizeof(::boost::long_long_type) * CHAR_BIT - 1)), ~(1LL << (sizeof(::boost::long_long_type) * CHAR_BIT - 1))>
0226 { };
0227
0228 template<>
0229 class integer_traits< ::boost::ulong_long_type>
0230 : public std::numeric_limits< ::boost::ulong_long_type>,
0231 public detail::integer_traits_base< ::boost::ulong_long_type, 0, ~0uLL>
0232 { };
0233
0234 #elif defined(BOOST_HAS_MS_INT64)
0235
0236 template<>
0237 class integer_traits< __int64>
0238 : public std::numeric_limits< __int64>,
0239 public detail::integer_traits_base< __int64, _I64_MIN, _I64_MAX>
0240 { };
0241
0242 template<>
0243 class integer_traits< unsigned __int64>
0244 : public std::numeric_limits< unsigned __int64>,
0245 public detail::integer_traits_base< unsigned __int64, 0, _UI64_MAX>
0246 { };
0247
0248 #endif
0249 #endif
0250
0251 }
0252
0253 #endif
0254
0255
0256