1
/* boost integer_traits.hpp header file
3
* Copyright Jens Maurer 2000
4
* Permission to use, copy, modify, sell, and distribute this software
5
* is hereby granted without fee provided that the above copyright notice
6
* appears in all copies and that both that copyright notice and this
7
* permission notice appear in supporting documentation,
9
* Jens Maurer makes no representations about the suitability of this
10
* software for any purpose. It is provided "as is" without express or
13
* $Id: integer_traits.hpp,v 1.1 2004/02/27 01:41:44 pseudonym Exp $
15
* Idea by Beman Dawes, Ed Brey, Steve Cleary, and Nathan Myers
18
// See http://www.boost.org/libs/integer for documentation.
21
#ifndef BOOST_INTEGER_TRAITS_HPP
22
#define BOOST_INTEGER_TRAITS_HPP
24
#include <boost/config.hpp>
25
#include <boost/limits.hpp>
27
// These are an implementation detail and not part of the interface
29
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) && !defined(BOOST_NO_CWCHAR)
36
class integer_traits : public std::numeric_limits<T>
39
BOOST_STATIC_CONSTANT(bool, is_integral = false);
43
template<class T, T min_val, T max_val>
44
class integer_traits_base
47
BOOST_STATIC_CONSTANT(bool, is_integral = true);
48
BOOST_STATIC_CONSTANT(T, const_min = min_val);
49
BOOST_STATIC_CONSTANT(T, const_max = max_val);
52
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
53
// A definition is required even for integral static constants
54
template<class T, T min_val, T max_val>
55
const bool integer_traits_base<T, min_val, max_val>::is_integral;
57
template<class T, T min_val, T max_val>
58
const T integer_traits_base<T, min_val, max_val>::const_min;
60
template<class T, T min_val, T max_val>
61
const T integer_traits_base<T, min_val, max_val>::const_max;
67
class integer_traits<bool>
68
: public std::numeric_limits<bool>,
69
public detail::integer_traits_base<bool, false, true>
73
class integer_traits<char>
74
: public std::numeric_limits<char>,
75
public detail::integer_traits_base<char, CHAR_MIN, CHAR_MAX>
79
class integer_traits<signed char>
80
: public std::numeric_limits<signed char>,
81
public detail::integer_traits_base<signed char, SCHAR_MIN, SCHAR_MAX>
85
class integer_traits<unsigned char>
86
: public std::numeric_limits<unsigned char>,
87
public detail::integer_traits_base<unsigned char, 0, UCHAR_MAX>
90
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
92
class integer_traits<wchar_t>
93
: public std::numeric_limits<wchar_t>,
94
#if defined(WCHAR_MIN) && defined(WCHAR_MAX)
95
public detail::integer_traits_base<wchar_t, WCHAR_MIN, WCHAR_MAX>
96
#elif defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) || (defined(__BEOS__) && defined(__GNUC__))
97
// No WCHAR_MIN and WCHAR_MAX, whar_t is short and unsigned:
98
public detail::integer_traits_base<wchar_t, 0, 0xffff>
99
#elif (defined(__sgi) && (!defined(__SGI_STL_PORT) || __SGI_STL_PORT < 0x400))\
100
|| (defined __APPLE__)\
101
|| (defined(__OpenBSD__) && defined(__GNUC__))\
102
|| (defined(__FreeBSD__) && defined(__GNUC__))\
103
|| (defined(__sun) && defined(__GNUC__))\
104
|| (defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 3) && !defined(__SGI_STL_PORT))
105
// No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as int.
106
// - SGI MIPSpro with native library
107
// - gcc 3.x on HP-UX
108
// - Mac OS X with native library
110
public detail::integer_traits_base<wchar_t, INT_MIN, INT_MAX>
111
#elif defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 2) && !defined(__SGI_STL_PORT)
112
// No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as unsigned int.
113
// - gcc 2.95.x on HP-UX
114
// (also, std::numeric_limits<wchar_t> appears to return the wrong values).
115
public detail::integer_traits_base<wchar_t, 0, UINT_MAX>
117
#error No WCHAR_MIN and WCHAR_MAX present, please adjust integer_traits<> for your compiler.
120
#endif // BOOST_NO_INTRINSIC_WCHAR_T
123
class integer_traits<short>
124
: public std::numeric_limits<short>,
125
public detail::integer_traits_base<short, SHRT_MIN, SHRT_MAX>
129
class integer_traits<unsigned short>
130
: public std::numeric_limits<unsigned short>,
131
public detail::integer_traits_base<unsigned short, 0, USHRT_MAX>
135
class integer_traits<int>
136
: public std::numeric_limits<int>,
137
public detail::integer_traits_base<int, INT_MIN, INT_MAX>
141
class integer_traits<unsigned int>
142
: public std::numeric_limits<unsigned int>,
143
public detail::integer_traits_base<unsigned int, 0, UINT_MAX>
147
class integer_traits<long>
148
: public std::numeric_limits<long>,
149
public detail::integer_traits_base<long, LONG_MIN, LONG_MAX>
153
class integer_traits<unsigned long>
154
: public std::numeric_limits<unsigned long>,
155
public detail::integer_traits_base<unsigned long, 0, ULONG_MAX>
158
#if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T)
159
#if defined(ULLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
162
class integer_traits<long long>
163
: public std::numeric_limits<long long>,
164
public detail::integer_traits_base<long long, LLONG_MIN, LLONG_MAX>
168
class integer_traits<unsigned long long>
169
: public std::numeric_limits<unsigned long long>,
170
public detail::integer_traits_base<unsigned long long, 0, ULLONG_MAX>
173
#elif defined(ULONG_LONG_MAX) && defined(BOOST_HAS_LONG_LONG)
176
class integer_traits<long long> : public std::numeric_limits<long long>, public detail::integer_traits_base<long long, LONG_LONG_MIN, LONG_LONG_MAX>{ };
178
class integer_traits<unsigned long long>
179
: public std::numeric_limits<unsigned long long>,
180
public detail::integer_traits_base<unsigned long long, 0, ULONG_LONG_MAX>
183
#elif defined(ULONGLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
186
class integer_traits<long long>
187
: public std::numeric_limits<long long>,
188
public detail::integer_traits_base<long long, LONGLONG_MIN, LONGLONG_MAX>
192
class integer_traits<unsigned long long>
193
: public std::numeric_limits<unsigned long long>,
194
public detail::integer_traits_base<unsigned long long, 0, ULONGLONG_MAX>
197
#elif defined(_LLONG_MAX) && defined(_C2) && defined(BOOST_HAS_LONG_LONG)
200
class integer_traits<long long>
201
: public std::numeric_limits<long long>,
202
public detail::integer_traits_base<long long, -_LLONG_MAX - _C2, _LLONG_MAX>
206
class integer_traits<unsigned long long>
207
: public std::numeric_limits<unsigned long long>,
208
public detail::integer_traits_base<unsigned long long, 0, _ULLONG_MAX>
216
#endif /* BOOST_INTEGER_TRAITS_HPP */