]> git.lyx.org Git - lyx.git/blob - boost/boost/integer_traits.hpp
Boost 1.31.0
[lyx.git] / boost / boost / integer_traits.hpp
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.23 2003/08/27 10:30:53 johnmaddock 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(__NetBSD__) && defined(__GNUC__))\
103     || (defined(__FreeBSD__) && 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, OpenBSD and NetBSD
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
219