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 
30 template <typename T>
31 struct TypeTraits
32 {
33 private:
34  struct NullType {};
35  template <typename U> struct UnConst
36  {
37  typedef U Result;
38  };
39  template <typename U> struct UnConst<const U>
40  {
41  typedef U Result;
42  };
43  template <typename U> struct ReferenceTraits
44  {
45  enum { IsReference = 0 };
46  typedef U ReferencedType;
47  };
48  template <typename U> struct ReferenceTraits<U&>
49  {
50  enum { IsReference = 1 };
51  typedef U ReferencedType;
52  };
53  template <typename U> struct PointerTraits
54  {
55  enum { IsPointer = 0};
56  typedef U PointeeType;
57  };
58  template <typename U> struct PointerTraits<U *>
59  {
60  enum { IsPointer = 1};
61  typedef U PointeeType;
62  };
63  template <typename U> struct FunctionPtrTraits
64  {
65  enum { IsFunctionPointer = 0};
66  typedef NullType ReturnType;
67  };
68  template <typename U>
69  struct FunctionPtrTraits <U (*)(void)>
70  {
71  enum { IsFunctionPointer = 1};
72  enum { nArgs = 0};
73  typedef U ReturnType;
74  };
75  template <typename U, typename V1>
76  struct FunctionPtrTraits <U (*)(V1)>
77  {
78  enum { IsFunctionPointer = 1};
79  enum { nArgs = 1};
80  typedef U ReturnType;
81  typedef V1 Arg1Type;
82  };
83  template <typename U, typename V1, typename V2>
84  struct FunctionPtrTraits <U (*)(V1,V2)>
85  {
86  enum { IsFunctionPointer = 1};
87  enum { nArgs = 2};
88  typedef U ReturnType;
89  typedef V1 Arg1Type;
90  typedef V2 Arg2Type;
91  };
92  template <typename U, typename V1, typename V2,
93  typename V3>
94  struct FunctionPtrTraits <U (*)(V1,V2,V3)>
95  {
96  enum { IsFunctionPointer = 1};
97  enum { nArgs = 3};
98  typedef U ReturnType;
99  typedef V1 Arg1Type;
100  typedef V2 Arg2Type;
101  typedef V3 Arg3Type;
102  };
103  template <typename U, typename V1, typename V2,
104  typename V3, typename V4>
105  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4)>
106  {
107  enum { IsFunctionPointer = 1};
108  enum { nArgs = 4};
109  typedef U ReturnType;
110  typedef V1 Arg1Type;
111  typedef V2 Arg2Type;
112  typedef V3 Arg3Type;
113  typedef V4 Arg4Type;
114  };
115  template <typename U, typename V1, typename V2,
116  typename V3, typename V4,
117  typename V5>
118  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5)>
119  {
120  enum { IsFunctionPointer = 1};
121  enum { nArgs = 5};
122  typedef U ReturnType;
123  typedef V1 Arg1Type;
124  typedef V2 Arg2Type;
125  typedef V3 Arg3Type;
126  typedef V4 Arg4Type;
127  typedef V5 Arg5Type;
128  };
129  template <typename U, typename V1, typename V2,
130  typename V3, typename V4,
131  typename V5, typename V6>
132  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5,V6)>
133  {
134  enum { IsFunctionPointer = 1};
135  enum { nArgs = 6};
136  typedef U ReturnType;
137  typedef V1 Arg1Type;
138  typedef V2 Arg2Type;
139  typedef V3 Arg3Type;
140  typedef V4 Arg4Type;
141  typedef V5 Arg5Type;
142  typedef V6 Arg6Type;
143  };
144  template <typename U> struct PtrToMemberTraits
145  {
146  enum { IsPointerToMember = 0};
147  };
148  template <typename U, typename V>
149  struct PtrToMemberTraits <U (V::*) (void)>
150  {
151  enum { IsPointerToMember = 1};
152  enum { nArgs = 0};
153  typedef U ReturnType;
154  };
155  template <typename U, typename V>
156  struct PtrToMemberTraits <U (V::*) (void) const>
157  {
158  enum { IsPointerToMember = 1};
159  enum { nArgs = 0};
160  typedef U ReturnType;
161  };
162  template <typename U, typename V,typename W1>
163  struct PtrToMemberTraits <U (V::*) (W1)>
164  {
165  enum { IsPointerToMember = 1};
166  enum { nArgs = 1};
167  typedef U ReturnType;
168  typedef W1 Arg1Type;
169  };
170  template <typename U, typename V,typename W1>
171  struct PtrToMemberTraits <U (V::*) (W1) const>
172  {
173  enum { IsPointerToMember = 1};
174  enum { nArgs = 1};
175  typedef U ReturnType;
176  typedef W1 Arg1Type;
177  };
178  template <typename U, typename V,typename W1, typename W2>
179  struct PtrToMemberTraits <U (V::*) (W1,W2)>
180  {
181  enum { IsPointerToMember = 1};
182  enum { nArgs = 2};
183  typedef U ReturnType;
184  typedef W1 Arg1Type;
185  typedef W2 Arg2Type;
186  };
187  template <typename U, typename V,typename W1, typename W2>
188  struct PtrToMemberTraits <U (V::*) (W1,W2) const>
189  {
190  enum { IsPointerToMember = 1};
191  enum { nArgs = 2};
192  typedef U ReturnType;
193  typedef W1 Arg1Type;
194  typedef W2 Arg2Type;
195  };
196  template <typename U, typename V,
197  typename W1, typename W2,
198  typename W3>
199  struct PtrToMemberTraits <U (V::*) (W1,W2,W3)>
200  {
201  enum { IsPointerToMember = 1};
202  enum { nArgs = 3};
203  typedef U ReturnType;
204  typedef W1 Arg1Type;
205  typedef W2 Arg2Type;
206  typedef W3 Arg3Type;
207  };
208  template <typename U, typename V,
209  typename W1, typename W2,
210  typename W3>
211  struct PtrToMemberTraits <U (V::*) (W1,W2,W3) const>
212  {
213  enum { IsPointerToMember = 1};
214  enum { nArgs = 3};
215  typedef U ReturnType;
216  typedef W1 Arg1Type;
217  typedef W2 Arg2Type;
218  typedef W3 Arg3Type;
219  };
220  template <typename U, typename V,
221  typename W1, typename W2,
222  typename W3, typename W4>
223  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4)>
224  {
225  enum { IsPointerToMember = 1};
226  enum { nArgs = 4};
227  typedef U ReturnType;
228  typedef W1 Arg1Type;
229  typedef W2 Arg2Type;
230  typedef W3 Arg3Type;
231  typedef W4 Arg4Type;
232  };
233  template <typename U, typename V,
234  typename W1, typename W2,
235  typename W3, typename W4>
236  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4) const>
237  {
238  enum { IsPointerToMember = 1};
239  enum { nArgs = 4};
240  typedef U ReturnType;
241  typedef W1 Arg1Type;
242  typedef W2 Arg2Type;
243  typedef W3 Arg3Type;
244  typedef W4 Arg4Type;
245  };
246  template <typename U, typename V,
247  typename W1, typename W2,
248  typename W3, typename W4,
249  typename W5>
250  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5)>
251  {
252  enum { IsPointerToMember = 1};
253  enum { nArgs = 5};
254  typedef U ReturnType;
255  typedef W1 Arg1Type;
256  typedef W2 Arg2Type;
257  typedef W3 Arg3Type;
258  typedef W4 Arg4Type;
259  typedef W5 Arg5Type;
260  };
261  template <typename U, typename V,
262  typename W1, typename W2,
263  typename W3, typename W4,
264  typename W5>
265  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5) const>
266  {
267  enum { IsPointerToMember = 1};
268  enum { nArgs = 5};
269  typedef U ReturnType;
270  typedef W1 Arg1Type;
271  typedef W2 Arg2Type;
272  typedef W3 Arg3Type;
273  typedef W4 Arg4Type;
274  typedef W5 Arg5Type;
275  };
276  template <typename U, typename V,
277  typename W1, typename W2,
278  typename W3, typename W4,
279  typename W5, typename W6>
280  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6)>
281  {
282  enum { IsPointerToMember = 1};
283  enum { nArgs = 6};
284  typedef U ReturnType;
285  typedef W1 Arg1Type;
286  typedef W2 Arg2Type;
287  typedef W3 Arg3Type;
288  typedef W4 Arg4Type;
289  typedef W5 Arg5Type;
290  typedef W6 Arg6Type;
291  };
292  template <typename U, typename V,
293  typename W1, typename W2,
294  typename W3, typename W4,
295  typename W5, typename W6>
296  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6) const>
297  {
298  enum { IsPointerToMember = 1};
299  enum { nArgs = 6};
300  typedef U ReturnType;
301  typedef W1 Arg1Type;
302  typedef W2 Arg2Type;
303  typedef W3 Arg3Type;
304  typedef W4 Arg4Type;
305  typedef W5 Arg5Type;
306  typedef W6 Arg6Type;
307  };
308 
309 public:
310  typedef typename UnConst<T>::Result NonConstType;
311  typedef typename ReferenceTraits<T>::ReferencedType ReferencedType;
312  typedef typename PointerTraits<T>::PointeeType PointeeType;
313  enum { IsPointerToMember = PtrToMemberTraits<T>::IsPointerToMember};
314  enum { IsPointer = PointerTraits<T>::IsPointer};
315  enum { IsReference = ReferenceTraits<T>::IsReference};
316  enum { IsFunctionPointer = FunctionPtrTraits<T>::IsFunctionPointer};
317  typedef PtrToMemberTraits<T> PointerToMemberTraits;
318  typedef FunctionPtrTraits<T> FunctionPointerTraits;
319 };
320 
321 
322 #endif /* TYPE_TRAITS_H */
U Result
Non-const result type.
Definition: type-traits.h:37
< Non-pointer type traits
Definition: type-traits.h:53
< Pointer to member type traits
Definition: type-traits.h:144
V1 Arg1Type
First argument type.
Definition: type-traits.h:81
PtrToMemberTraits< T > PointerToMemberTraits
Pointer to member traits type.
Definition: type-traits.h:317
U PointeeType
Pointer result type.
Definition: type-traits.h:61
< Non-function pointer type traits
Definition: type-traits.h:63
Null value type traits.
Definition: type-traits.h:34
U ReferencedType
Referenced result type.
Definition: type-traits.h:51
U PointeeType
Non-pointer result type.
Definition: type-traits.h:56
ReferenceTraits< T >::ReferencedType ReferencedType
Referenced type.
Definition: type-traits.h:311
FunctionPtrTraits< T > FunctionPointerTraits
Function pointer traits.
Definition: type-traits.h:318
U Result
Non-const result type.
Definition: type-traits.h:41
< Non-const type
Definition: type-traits.h:35
Type trait reference values.
Definition: type-traits.h:31
PointerTraits< T >::PointeeType PointeeType
Pointee type.
Definition: type-traits.h:312
< Non-reference type traits
Definition: type-traits.h:43
U ReferencedType
Non-referenced result type.
Definition: type-traits.h:46
UnConst< T >::Result NonConstType
Non-const type.
Definition: type-traits.h:310
NullType ReturnType
Non-function pointer result type.
Definition: type-traits.h:66