A Discrete-Event Network Simulator
API
type-traits.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007 INRIA
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  */
19 
20 #ifndef TYPE_TRAITS_H
21 #define TYPE_TRAITS_H
22 
24 template <typename T>
25 struct TypeTraits
26 {
27 private:
28  struct NullType {};
29  template <typename U> struct UnConst
30  {
31  typedef U Result;
32  };
33  template <typename U> struct UnConst<const U>
34  {
35  typedef U Result;
36  };
37  template <typename U> struct ReferenceTraits
38  {
39  enum { IsReference = 0 };
40  typedef U ReferencedType;
41  };
42  template <typename U> struct ReferenceTraits<U&>
43  {
44  enum { IsReference = 1 };
45  typedef U ReferencedType;
46  };
47  template <typename U> struct PointerTraits
48  {
49  enum { IsPointer = 0};
50  typedef U PointeeType;
51  };
52  template <typename U> struct PointerTraits<U *>
53  {
54  enum { IsPointer = 1};
55  typedef U PointeeType;
56  };
57  template <typename U> struct FunctionPtrTraits
58  {
59  enum { IsFunctionPointer = 0};
60  typedef NullType ReturnType;
61  };
62  template <typename U>
63  struct FunctionPtrTraits <U (*)(void)>
64  {
65  enum { IsFunctionPointer = 1};
66  enum { nArgs = 0};
67  typedef U ReturnType;
68  };
69  template <typename U, typename V1>
70  struct FunctionPtrTraits <U (*)(V1)>
71  {
72  enum { IsFunctionPointer = 1};
73  enum { nArgs = 1};
74  typedef U ReturnType;
75  typedef V1 Arg1Type;
76  };
77  template <typename U, typename V1, typename V2>
78  struct FunctionPtrTraits <U (*)(V1,V2)>
79  {
80  enum { IsFunctionPointer = 1};
81  enum { nArgs = 2};
82  typedef U ReturnType;
83  typedef V1 Arg1Type;
84  typedef V2 Arg2Type;
85  };
86  template <typename U, typename V1, typename V2,
87  typename V3>
88  struct FunctionPtrTraits <U (*)(V1,V2,V3)>
89  {
90  enum { IsFunctionPointer = 1};
91  enum { nArgs = 3};
92  typedef U ReturnType;
93  typedef V1 Arg1Type;
94  typedef V2 Arg2Type;
95  typedef V3 Arg3Type;
96  };
97  template <typename U, typename V1, typename V2,
98  typename V3, typename V4>
99  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4)>
100  {
101  enum { IsFunctionPointer = 1};
102  enum { nArgs = 4};
103  typedef U ReturnType;
104  typedef V1 Arg1Type;
105  typedef V2 Arg2Type;
106  typedef V3 Arg3Type;
107  typedef V4 Arg4Type;
108  };
109  template <typename U, typename V1, typename V2,
110  typename V3, typename V4,
111  typename V5>
112  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5)>
113  {
114  enum { IsFunctionPointer = 1};
115  enum { nArgs = 5};
116  typedef U ReturnType;
117  typedef V1 Arg1Type;
118  typedef V2 Arg2Type;
119  typedef V3 Arg3Type;
120  typedef V4 Arg4Type;
121  typedef V5 Arg5Type;
122  };
123  template <typename U, typename V1, typename V2,
124  typename V3, typename V4,
125  typename V5, typename V6>
126  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5,V6)>
127  {
128  enum { IsFunctionPointer = 1};
129  enum { nArgs = 6};
130  typedef U ReturnType;
131  typedef V1 Arg1Type;
132  typedef V2 Arg2Type;
133  typedef V3 Arg3Type;
134  typedef V4 Arg4Type;
135  typedef V5 Arg5Type;
136  typedef V6 Arg6Type;
137  };
138  template <typename U> struct PtrToMemberTraits
139  {
140  enum { IsPointerToMember = 0};
141  };
142  template <typename U, typename V>
143  struct PtrToMemberTraits <U (V::*) (void)>
144  {
145  enum { IsPointerToMember = 1};
146  enum { nArgs = 0};
147  typedef U ReturnType;
148  };
149  template <typename U, typename V>
150  struct PtrToMemberTraits <U (V::*) (void) const>
151  {
152  enum { IsPointerToMember = 1};
153  enum { nArgs = 0};
154  typedef U ReturnType;
155  };
156  template <typename U, typename V,typename W1>
157  struct PtrToMemberTraits <U (V::*) (W1)>
158  {
159  enum { IsPointerToMember = 1};
160  enum { nArgs = 1};
161  typedef U ReturnType;
162  typedef W1 Arg1Type;
163  };
164  template <typename U, typename V,typename W1>
165  struct PtrToMemberTraits <U (V::*) (W1) const>
166  {
167  enum { IsPointerToMember = 1};
168  enum { nArgs = 1};
169  typedef U ReturnType;
170  typedef W1 Arg1Type;
171  };
172  template <typename U, typename V,typename W1, typename W2>
173  struct PtrToMemberTraits <U (V::*) (W1,W2)>
174  {
175  enum { IsPointerToMember = 1};
176  enum { nArgs = 2};
177  typedef U ReturnType;
178  typedef W1 Arg1Type;
179  typedef W2 Arg2Type;
180  };
181  template <typename U, typename V,typename W1, typename W2>
182  struct PtrToMemberTraits <U (V::*) (W1,W2) const>
183  {
184  enum { IsPointerToMember = 1};
185  enum { nArgs = 2};
186  typedef U ReturnType;
187  typedef W1 Arg1Type;
188  typedef W2 Arg2Type;
189  };
190  template <typename U, typename V,
191  typename W1, typename W2,
192  typename W3>
193  struct PtrToMemberTraits <U (V::*) (W1,W2,W3)>
194  {
195  enum { IsPointerToMember = 1};
196  enum { nArgs = 3};
197  typedef U ReturnType;
198  typedef W1 Arg1Type;
199  typedef W2 Arg2Type;
200  typedef W3 Arg3Type;
201  };
202  template <typename U, typename V,
203  typename W1, typename W2,
204  typename W3>
205  struct PtrToMemberTraits <U (V::*) (W1,W2,W3) const>
206  {
207  enum { IsPointerToMember = 1};
208  enum { nArgs = 3};
209  typedef U ReturnType;
210  typedef W1 Arg1Type;
211  typedef W2 Arg2Type;
212  typedef W3 Arg3Type;
213  };
214  template <typename U, typename V,
215  typename W1, typename W2,
216  typename W3, typename W4>
217  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4)>
218  {
219  enum { IsPointerToMember = 1};
220  enum { nArgs = 4};
221  typedef U ReturnType;
222  typedef W1 Arg1Type;
223  typedef W2 Arg2Type;
224  typedef W3 Arg3Type;
225  typedef W4 Arg4Type;
226  };
227  template <typename U, typename V,
228  typename W1, typename W2,
229  typename W3, typename W4>
230  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4) const>
231  {
232  enum { IsPointerToMember = 1};
233  enum { nArgs = 4};
234  typedef U ReturnType;
235  typedef W1 Arg1Type;
236  typedef W2 Arg2Type;
237  typedef W3 Arg3Type;
238  typedef W4 Arg4Type;
239  };
240  template <typename U, typename V,
241  typename W1, typename W2,
242  typename W3, typename W4,
243  typename W5>
244  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5)>
245  {
246  enum { IsPointerToMember = 1};
247  enum { nArgs = 5};
248  typedef U ReturnType;
249  typedef W1 Arg1Type;
250  typedef W2 Arg2Type;
251  typedef W3 Arg3Type;
252  typedef W4 Arg4Type;
253  typedef W5 Arg5Type;
254  };
255  template <typename U, typename V,
256  typename W1, typename W2,
257  typename W3, typename W4,
258  typename W5>
259  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5) const>
260  {
261  enum { IsPointerToMember = 1};
262  enum { nArgs = 5};
263  typedef U ReturnType;
264  typedef W1 Arg1Type;
265  typedef W2 Arg2Type;
266  typedef W3 Arg3Type;
267  typedef W4 Arg4Type;
268  typedef W5 Arg5Type;
269  };
270  template <typename U, typename V,
271  typename W1, typename W2,
272  typename W3, typename W4,
273  typename W5, typename W6>
274  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6)>
275  {
276  enum { IsPointerToMember = 1};
277  enum { nArgs = 6};
278  typedef U ReturnType;
279  typedef W1 Arg1Type;
280  typedef W2 Arg2Type;
281  typedef W3 Arg3Type;
282  typedef W4 Arg4Type;
283  typedef W5 Arg5Type;
284  typedef W6 Arg6Type;
285  };
286  template <typename U, typename V,
287  typename W1, typename W2,
288  typename W3, typename W4,
289  typename W5, typename W6>
290  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6) const>
291  {
292  enum { IsPointerToMember = 1};
293  enum { nArgs = 6};
294  typedef U ReturnType;
295  typedef W1 Arg1Type;
296  typedef W2 Arg2Type;
297  typedef W3 Arg3Type;
298  typedef W4 Arg4Type;
299  typedef W5 Arg5Type;
300  typedef W6 Arg6Type;
301  };
302 
303 public:
304  typedef typename UnConst<T>::Result NonConstType;
305  typedef typename ReferenceTraits<T>::ReferencedType ReferencedType;
306  typedef typename PointerTraits<T>::PointeeType PointeeType;
307  enum { IsPointerToMember = PtrToMemberTraits<T>::IsPointerToMember};
308  enum { IsPointer = PointerTraits<T>::IsPointer};
309  enum { IsReference = ReferenceTraits<T>::IsReference};
310  enum { IsFunctionPointer = FunctionPtrTraits<T>::IsFunctionPointer};
311  typedef PtrToMemberTraits<T> PointerToMemberTraits;
312  typedef FunctionPtrTraits<T> FunctionPointerTraits;
313 };
314 
315 
316 #endif /* TYPE_TRAITS_H */
U Result
Non-const result type.
Definition: type-traits.h:31
< Non-pointer type traits
Definition: type-traits.h:47
< Pointer to member type traits
Definition: type-traits.h:138
V1 Arg1Type
First argument type.
Definition: type-traits.h:75
PtrToMemberTraits< T > PointerToMemberTraits
Pointer to member traits type.
Definition: type-traits.h:311
U PointeeType
Pointer result type.
Definition: type-traits.h:55
< Non-function pointer type traits
Definition: type-traits.h:57
Null value type traits.
Definition: type-traits.h:28
U ReferencedType
Referenced result type.
Definition: type-traits.h:45
U PointeeType
Non-pointer result type.
Definition: type-traits.h:50
ReferenceTraits< T >::ReferencedType ReferencedType
Referenced type.
Definition: type-traits.h:305
FunctionPtrTraits< T > FunctionPointerTraits
Function pointer traits.
Definition: type-traits.h:312
U Result
Non-const result type.
Definition: type-traits.h:35
< Non-const type
Definition: type-traits.h:29
Type trait reference values.
Definition: type-traits.h:25
PointerTraits< T >::PointeeType PointeeType
Pointee type.
Definition: type-traits.h:306
< Non-reference type traits
Definition: type-traits.h:37
U ReferencedType
Non-referenced result type.
Definition: type-traits.h:40
UnConst< T >::Result NonConstType
Non-const type.
Definition: type-traits.h:304
NullType ReturnType
Non-function pointer result type.
Definition: type-traits.h:60