• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/arm-brcm-linux-uclibcgnueabi/include/c++/4.5.3/ext/
1// -*- C++ -*-
2
3// Copyright (C) 2005, 2006, 2007, 2009 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 terms
7// of the GNU General Public License as published by the Free Software
8// Foundation; either version 3, or (at your option) any later
9// version.
10
11// This library is distributed in the hope that it will be useful, but
12// WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14// General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file ext/type_traits.h
26 *  This file is a GNU extension to the Standard C++ Library.
27 */
28
29#ifndef _EXT_TYPE_TRAITS
30#define _EXT_TYPE_TRAITS 1
31
32#pragma GCC system_header
33
34#include <bits/c++config.h>
35#include <bits/cpp_type_traits.h>
36
37_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
38
39  // Define a nested type if some predicate holds.
40  template<bool, typename>
41    struct __enable_if
42    { };
43
44  template<typename _Tp>
45    struct __enable_if<true, _Tp>
46    { typedef _Tp __type; };
47
48
49  // Conditional expression for types. If true, first, if false, second.
50  template<bool _Cond, typename _Iftrue, typename _Iffalse>
51    struct __conditional_type
52    { typedef _Iftrue __type; };
53
54  template<typename _Iftrue, typename _Iffalse>
55    struct __conditional_type<false, _Iftrue, _Iffalse>
56    { typedef _Iffalse __type; };
57
58
59  // Given an integral builtin type, return the corresponding unsigned type.
60  template<typename _Tp>
61    struct __add_unsigned
62    {
63    private:
64      typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
65
66    public:
67      typedef typename __if_type::__type __type;
68    };
69
70  template<>
71    struct __add_unsigned<char>
72    { typedef unsigned char __type; };
73
74  template<>
75    struct __add_unsigned<signed char>
76    { typedef unsigned char __type; };
77
78  template<>
79    struct __add_unsigned<short>
80    { typedef unsigned short __type; };
81
82  template<>
83    struct __add_unsigned<int>
84    { typedef unsigned int __type; };
85
86  template<>
87    struct __add_unsigned<long>
88    { typedef unsigned long __type; };
89
90  template<>
91    struct __add_unsigned<long long>
92    { typedef unsigned long long __type; };
93
94  // Declare but don't define.
95  template<>
96    struct __add_unsigned<bool>;
97
98  template<>
99    struct __add_unsigned<wchar_t>;
100
101
102  // Given an integral builtin type, return the corresponding signed type.
103  template<typename _Tp>
104    struct __remove_unsigned
105    {
106    private:
107      typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
108
109    public:
110      typedef typename __if_type::__type __type;
111    };
112
113  template<>
114    struct __remove_unsigned<char>
115    { typedef signed char __type; };
116
117  template<>
118    struct __remove_unsigned<unsigned char>
119    { typedef signed char __type; };
120
121  template<>
122    struct __remove_unsigned<unsigned short>
123    { typedef short __type; };
124
125  template<>
126    struct __remove_unsigned<unsigned int>
127    { typedef int __type; };
128
129  template<>
130    struct __remove_unsigned<unsigned long>
131    { typedef long __type; };
132
133  template<>
134    struct __remove_unsigned<unsigned long long>
135    { typedef long long __type; };
136
137  // Declare but don't define.
138  template<>
139    struct __remove_unsigned<bool>;
140
141  template<>
142    struct __remove_unsigned<wchar_t>;
143
144
145  // For use in string and vstring.
146  template<typename _Type>
147    inline bool
148    __is_null_pointer(_Type* __ptr)
149    { return __ptr == 0; }
150
151  template<typename _Type>
152    inline bool
153    __is_null_pointer(_Type)
154    { return false; }
155
156
157  // For complex and cmath
158  template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
159    struct __promote
160    { typedef double __type; };
161
162  template<typename _Tp>
163    struct __promote<_Tp, false>
164    { typedef _Tp __type; };
165
166  template<typename _Tp, typename _Up>
167    struct __promote_2
168    {
169    private:
170      typedef typename __promote<_Tp>::__type __type1;
171      typedef typename __promote<_Up>::__type __type2;
172
173    public:
174      typedef __typeof__(__type1() + __type2()) __type;
175    };
176
177  template<typename _Tp, typename _Up, typename _Vp>
178    struct __promote_3
179    {
180    private:
181      typedef typename __promote<_Tp>::__type __type1;
182      typedef typename __promote<_Up>::__type __type2;
183      typedef typename __promote<_Vp>::__type __type3;
184
185    public:
186      typedef __typeof__(__type1() + __type2() + __type3()) __type;
187    };
188
189  template<typename _Tp, typename _Up, typename _Vp, typename _Wp>
190    struct __promote_4
191    {
192    private:
193      typedef typename __promote<_Tp>::__type __type1;
194      typedef typename __promote<_Up>::__type __type2;
195      typedef typename __promote<_Vp>::__type __type3;
196      typedef typename __promote<_Wp>::__type __type4;
197
198    public:
199      typedef __typeof__(__type1() + __type2() + __type3() + __type4()) __type;
200    };
201
202_GLIBCXX_END_NAMESPACE
203
204#endif
205