Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-15 10:10:39

0001 /* boost integer_traits.hpp header file
0002  *
0003  * Copyright Jens Maurer 2000
0004  * Distributed under the Boost Software License, Version 1.0. (See
0005  * accompanying file LICENSE_1_0.txt or copy at
0006  * https://www.boost.org/LICENSE_1_0.txt)
0007  *
0008  * $Id$
0009  *
0010  * Idea by Beman Dawes, Ed Brey, Steve Cleary, and Nathan Myers
0011  */
0012 
0013 //  See https://www.boost.org/libs/integer for documentation.
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 // These are an implementation detail and not part of the interface
0023 #include <limits.h>
0024 // we need wchar.h for WCHAR_MAX/MIN but not all platforms provide it,
0025 // and some may have <wchar.h> but not <cwchar> ...
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 // We simply cannot include this header on gcc without getting copious warnings of the kind:
0032 //
0033 // ../../../boost/integer_traits.hpp:164:66: warning: use of C99 long long integer constant
0034 //
0035 // And yet there is no other reasonable implementation, so we declare this a system header
0036 // to suppress these warnings.
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 //  A definition is required even for integral static constants
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 } // namespace detail
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     // Don't trust WCHAR_MIN and WCHAR_MAX with Mac OS X's native
0103     // library: they are wrong!
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     // No WCHAR_MIN and WCHAR_MAX, whar_t is short and unsigned:
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     // No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as int.
0117     //  - SGI MIPSpro with native library
0118     //  - gcc 3.x on HP-UX
0119     //  - Mac OS X with native library
0120     //  - gcc on FreeBSD, OpenBSD and NetBSD
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 // BOOST_NO_INTRINSIC_WCHAR_T
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 // we have long long but no constants, this happens for example with gcc in -ansi mode,
0220 // we'll just have to work out the values for ourselves (assumes 2's compliment representation):
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 } // namespace boost
0252 
0253 #endif /* BOOST_INTEGER_TRAITS_HPP */
0254 
0255 
0256