~ubuntu-branches/ubuntu/warty/aqsis/warty

« back to all changes in this revision

Viewing changes to boost/boost/integer_traits.hpp

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2004-08-24 07:25:04 UTC
  • Revision ID: james.westby@ubuntu.com-20040824072504-zf993vnevvisdsvb
Tags: upstream-0.9.1
ImportĀ upstreamĀ versionĀ 0.9.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* boost integer_traits.hpp header file
 
2
 *
 
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,
 
8
 *
 
9
 * Jens Maurer makes no representations about the suitability of this
 
10
 * software for any purpose. It is provided "as is" without express or
 
11
 * implied warranty.
 
12
 *
 
13
 * $Id: integer_traits.hpp,v 1.1 2004/02/27 01:41:44 pseudonym Exp $
 
14
 *
 
15
 * Idea by Beman Dawes, Ed Brey, Steve Cleary, and Nathan Myers
 
16
 */
 
17
 
 
18
//  See http://www.boost.org/libs/integer for documentation.
 
19
 
 
20
 
 
21
#ifndef BOOST_INTEGER_TRAITS_HPP
 
22
#define BOOST_INTEGER_TRAITS_HPP
 
23
 
 
24
#include <boost/config.hpp>
 
25
#include <boost/limits.hpp>
 
26
 
 
27
// These are an implementation detail and not part of the interface
 
28
#include <limits.h>
 
29
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) && !defined(BOOST_NO_CWCHAR)
 
30
#include <wchar.h>
 
31
#endif
 
32
 
 
33
 
 
34
namespace boost {
 
35
template<class T>
 
36
class integer_traits : public std::numeric_limits<T>
 
37
{
 
38
public:
 
39
  BOOST_STATIC_CONSTANT(bool, is_integral = false);
 
40
};
 
41
 
 
42
namespace detail {
 
43
template<class T, T min_val, T max_val>
 
44
class integer_traits_base
 
45
{
 
46
public:
 
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);
 
50
};
 
51
 
 
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;
 
56
 
 
57
template<class T, T min_val, T max_val>
 
58
const T integer_traits_base<T, min_val, max_val>::const_min;
 
59
 
 
60
template<class T, T min_val, T max_val>
 
61
const T integer_traits_base<T, min_val, max_val>::const_max;
 
62
#endif
 
63
 
 
64
} // namespace detail
 
65
 
 
66
template<>
 
67
class integer_traits<bool>
 
68
  : public std::numeric_limits<bool>,
 
69
    public detail::integer_traits_base<bool, false, true>
 
70
{ };
 
71
 
 
72
template<>
 
73
class integer_traits<char>
 
74
  : public std::numeric_limits<char>,
 
75
    public detail::integer_traits_base<char, CHAR_MIN, CHAR_MAX>
 
76
{ };
 
77
 
 
78
template<>
 
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>
 
82
{ };
 
83
 
 
84
template<>
 
85
class integer_traits<unsigned char>
 
86
  : public std::numeric_limits<unsigned char>,
 
87
    public detail::integer_traits_base<unsigned char, 0, UCHAR_MAX>
 
88
{ };
 
89
 
 
90
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
 
91
template<>
 
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
 
109
    //  - gcc on FreeBSD
 
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>
 
116
#else
 
117
#error No WCHAR_MIN and WCHAR_MAX present, please adjust integer_traits<> for your compiler.
 
118
#endif
 
119
{ };
 
120
#endif // BOOST_NO_INTRINSIC_WCHAR_T
 
121
 
 
122
template<>
 
123
class integer_traits<short>
 
124
  : public std::numeric_limits<short>,
 
125
    public detail::integer_traits_base<short, SHRT_MIN, SHRT_MAX>
 
126
{ };
 
127
 
 
128
template<>
 
129
class integer_traits<unsigned short>
 
130
  : public std::numeric_limits<unsigned short>,
 
131
    public detail::integer_traits_base<unsigned short, 0, USHRT_MAX>
 
132
{ };
 
133
 
 
134
template<>
 
135
class integer_traits<int>
 
136
  : public std::numeric_limits<int>,
 
137
    public detail::integer_traits_base<int, INT_MIN, INT_MAX>
 
138
{ };
 
139
 
 
140
template<>
 
141
class integer_traits<unsigned int>
 
142
  : public std::numeric_limits<unsigned int>,
 
143
    public detail::integer_traits_base<unsigned int, 0, UINT_MAX>
 
144
{ };
 
145
 
 
146
template<>
 
147
class integer_traits<long>
 
148
  : public std::numeric_limits<long>,
 
149
    public detail::integer_traits_base<long, LONG_MIN, LONG_MAX>
 
150
{ };
 
151
 
 
152
template<>
 
153
class integer_traits<unsigned long>
 
154
  : public std::numeric_limits<unsigned long>,
 
155
    public detail::integer_traits_base<unsigned long, 0, ULONG_MAX>
 
156
{ };
 
157
 
 
158
#if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T)
 
159
#if defined(ULLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
 
160
 
 
161
template<>
 
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>
 
165
{ };
 
166
 
 
167
template<>
 
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>
 
171
{ };
 
172
 
 
173
#elif defined(ULONG_LONG_MAX) && defined(BOOST_HAS_LONG_LONG)
 
174
 
 
175
template<>
 
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>{ };
 
177
template<>
 
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>
 
181
{ };
 
182
 
 
183
#elif defined(ULONGLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
 
184
 
 
185
template<>
 
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>
 
189
{ };
 
190
 
 
191
template<>
 
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>
 
195
{ };
 
196
 
 
197
#elif defined(_LLONG_MAX) && defined(_C2) && defined(BOOST_HAS_LONG_LONG)
 
198
 
 
199
template<>
 
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>
 
203
{ };
 
204
 
 
205
template<>
 
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>
 
209
{ };
 
210
 
 
211
#endif
 
212
#endif
 
213
 
 
214
} // namespace boost
 
215
 
 
216
#endif /* BOOST_INTEGER_TRAITS_HPP */
 
217
 
 
218