streambuf.tcc (basic_streambuf::sputbackc): Prefix "this->" to call to pbackfail.
[official-gcc.git] / libstdc++-v3 / include / bits / cpp_type_traits.h
blobd66fe7638410f14c0dc52a147834bbf6434cdc94
1 // The -*- C++ -*- type traits classes for internal use in libstdc++
3 // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
9 // any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19 // USA.
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
30 // Written by Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
32 /** @file cpp_type_traits.h
33 * This is an internal header file, included by other library headers.
34 * You should not attempt to use it directly.
37 #ifndef _CPP_BITS_CPP_TYPE_TRAITS_H
38 #define _CPP_BITS_CPP_TYPE_TRAITS_H 1
40 #pragma GCC system_header
43 // This file provides some compile-time information about various types.
44 // These representations were designed, on purpose, to be constant-expressions
45 // and not types as found in <stl/bits/type_traits.h>. In particular, they
46 // can be used in control structures and the optimizer hopefully will do
47 // the obvious thing.
49 // Why integral expressions, and not functions nor types?
50 // Firstly, these compile-time entities are used as template-arguments
51 // so function return values won't work: We need compile-time entities.
52 // We're left with types and constant integral expressions.
53 // Secondly, from the point of view of ease of use, type-based compile-time
54 // information is -not- *that* convenient. On has to write lots of
55 // overloaded functions and to hope that the compiler will select the right
56 // one. As a net effect, the overall structure isn't very clear at first
57 // glance.
58 // Thirdly, partial ordering and overload resolution (of function templates)
59 // is highly costly in terms of compiler-resource. It is a Good Thing to
60 // keep these resource consumption as least as possible.
62 // See valarray_array.h for a case use.
64 // -- Gaby (dosreis@cmla.ens-cachan.fr) 2000-03-06.
67 namespace std
69 template<typename _Tp>
70 struct __is_void
72 enum
74 _M_type = 0
78 template<>
79 struct __is_void<void>
81 enum
83 _M_type = 1
88 // Integer types
90 template<typename _Tp>
91 struct __is_integer
93 enum
95 _M_type = 0
99 // Thirteen specializations (yes there are eleven standard integer
100 // types; 'long long' and 'unsigned long long' are supported as
101 // extensions)
102 template<>
103 struct __is_integer<bool>
105 enum
107 _M_type = 1
111 template<>
112 struct __is_integer<char>
114 enum
116 _M_type = 1
120 template<>
121 struct __is_integer<signed char>
123 enum
125 _M_type = 1
129 template<>
130 struct __is_integer<unsigned char>
132 enum
134 _M_type = 1
138 # ifdef _GLIBCPP_USE_WCHAR_T
139 template<>
140 struct __is_integer<wchar_t>
142 enum
144 _M_type = 1
147 # endif
149 template<>
150 struct __is_integer<short>
152 enum
154 _M_type = 1
158 template<>
159 struct __is_integer<unsigned short>
161 enum
163 _M_type = 1
167 template<>
168 struct __is_integer<int>
170 enum
172 _M_type = 1
176 template<>
177 struct __is_integer<unsigned int>
179 enum
181 _M_type = 1
185 template<>
186 struct __is_integer<long>
188 enum
190 _M_type = 1
194 template<>
195 struct __is_integer<unsigned long>
197 enum
199 _M_type = 1
203 template<>
204 struct __is_integer<long long>
206 enum
208 _M_type = 1
212 template<>
213 struct __is_integer<unsigned long long>
215 enum
217 _M_type = 1
222 // Floating point types
224 template<typename _Tp>
225 struct __is_floating
227 enum
229 _M_type = 0
233 // three specializations (float, double and 'long double')
234 template<>
235 struct __is_floating<float>
237 enum
239 _M_type = 1
243 template<>
244 struct __is_floating<double>
246 enum
248 _M_type = 1
252 template<>
253 struct __is_floating<long double>
255 enum
257 _M_type = 1
262 // An arithmetic type is an integer type or a floating point type
264 template<typename _Tp>
265 struct __is_arithmetic
267 enum
269 _M_type = __is_integer<_Tp>::_M_type || __is_floating<_Tp>::_M_type
274 // A fundamental type is `void' or and arithmetic type
276 template<typename _Tp>
277 struct __is_fundamental
279 enum
281 _M_type = __is_void<_Tp>::_M_type || __is_arithmetic<_Tp>::_M_type
286 // For the immediate use, the following is a good approximation
288 template<typename _Tp>
289 struct __is_pod
291 enum
293 _M_type = __is_fundamental<_Tp>::_M_type
297 } // namespace std
300 #endif //_CPP_BITS_CPP_TYPE_TRAITS_H