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 
23 #include "ptr.h"
24 
36 template <typename T>
37 struct TypeTraits
38 {
39 private:
41  struct NullType {};
46  template <typename U> struct UnConst
47  {
48  typedef U Result;
49  };
54  template <typename U> struct UnConst<const U>
55  {
56  typedef U Result;
57  };
62  template <typename U> struct ReferenceTraits
63  { enum { IsReference = 0 };
65  typedef U ReferencedType;
66  };
71  template <typename U> struct ReferenceTraits<U&>
72  { enum { IsReference = 1 };
74  typedef U ReferencedType;
75  };
80  template <typename U> struct PointerTraits
81  { enum { IsPointer = 0,
83  IsPtr = 0 };
84  typedef U PointeeType;
85  };
90  template <typename U> struct PointerTraits<U *>
91  { enum { IsPointer = 1,
93  IsPtr = 0 };
94  typedef U PointeeType;
95  };
100  template <typename U> struct PointerTraits<ns3::Ptr<U> >
101  { enum { IsPointer = 0,
103  IsPtr = 1 };
104  typedef U PointeeType;
105  };
110  template <typename U> struct Base
111  {
112  typedef U Type;
113  };
118  template <typename U> struct Base <U &>
119  {
120  typedef typename Base<U>::Type Type;
121  };
126  template <typename U> struct Base <U *>
127  {
128  typedef typename Base<U>::Type Type;
129  };
134  template <typename U> struct Base <const U >
135  {
136  typedef typename Base<U>::Type Type;
137  };
142  template <typename U> struct PtrBase
143  {
144  typedef U Type;
145  };
150  template <typename U> struct PtrBase <ns3::Ptr<U> >
151  {
152  typedef U Type;
153  };
158  template <typename U> struct FunctionPtrTraits
159  { enum { IsFunctionPointer = 0 };
162  };
167  template <typename U>
168  struct FunctionPtrTraits <U (*)(void)>
169  { enum { IsFunctionPointer = 1 }; enum { nArgs = 0 };
172  typedef U ReturnType;
173  };
179  template <typename U,
180  typename V1>
181  struct FunctionPtrTraits <U (*)(V1)>
182  { enum { IsFunctionPointer = 1 }; enum { nArgs = 1 };
185  typedef U ReturnType;
186  typedef V1 Arg1Type;
187  };
194  template <typename U,
195  typename V1, typename V2>
196  struct FunctionPtrTraits <U (*)(V1,V2)>
197  { enum { IsFunctionPointer = 1 }; enum { nArgs = 2 };
200  typedef U ReturnType;
201  typedef V1 Arg1Type;
202  typedef V2 Arg2Type;
203  };
211  template <typename U,
212  typename V1, typename V2, typename V3>
213  struct FunctionPtrTraits <U (*)(V1,V2,V3)>
214  { enum { IsFunctionPointer = 1 }; enum { nArgs = 3 };
217  typedef U ReturnType;
218  typedef V1 Arg1Type;
219  typedef V2 Arg2Type;
220  typedef V3 Arg3Type;
221  };
230  template <typename U,
231  typename V1, typename V2, typename V3,
232  typename V4>
233  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4)>
234  { enum { IsFunctionPointer = 1 }; enum { nArgs = 4 };
237  typedef U ReturnType;
238  typedef V1 Arg1Type;
239  typedef V2 Arg2Type;
240  typedef V3 Arg3Type;
241  typedef V4 Arg4Type;
242  };
252  template <typename U,
253  typename V1, typename V2, typename V3,
254  typename V4, typename V5>
255  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5)>
256  { enum { IsFunctionPointer = 1 }; enum { nArgs = 5 };
259  typedef U ReturnType;
260  typedef V1 Arg1Type;
261  typedef V2 Arg2Type;
262  typedef V3 Arg3Type;
263  typedef V4 Arg4Type;
264  typedef V5 Arg5Type;
265  };
276  template <typename U,
277  typename V1, typename V2, typename V3,
278  typename V4, typename V5, typename V6>
279  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5,V6)>
280  { enum { IsFunctionPointer = 1 }; enum { nArgs = 6 };
283  typedef U ReturnType;
284  typedef V1 Arg1Type;
285  typedef V2 Arg2Type;
286  typedef V3 Arg3Type;
287  typedef V4 Arg4Type;
288  typedef V5 Arg5Type;
289  typedef V6 Arg6Type;
290  };
295  template <typename U> struct PtrToMemberTraits
296  { enum { IsPointerToMember = 0 };
298  };
304  template <typename U, typename V>
305  struct PtrToMemberTraits <U (V::*) (void)>
306  { enum { IsPointerToMember = 1 }; enum { nArgs = 0 };
309  typedef U ReturnType;
310  };
316  template <typename U, typename V>
317  struct PtrToMemberTraits <U (V::*) (void) const>
318  { enum { IsPointerToMember = 1 }; enum { nArgs = 0 };
321  typedef U ReturnType;
322  };
329  template <typename U, typename V,
330  typename W1>
331  struct PtrToMemberTraits <U (V::*) (W1)>
332  { enum { IsPointerToMember = 1 }; enum { nArgs = 1 };
335  typedef U ReturnType;
336  typedef W1 Arg1Type;
337  };
344  template <typename U, typename V,
345  typename W1>
346  struct PtrToMemberTraits <U (V::*) (W1) const>
347  { enum { IsPointerToMember = 1 }; enum { nArgs = 1 };
350  typedef U ReturnType;
351  typedef W1 Arg1Type;
352  };
360  template <typename U, typename V,
361  typename W1, typename W2>
362  struct PtrToMemberTraits <U (V::*) (W1,W2)>
363  { enum { IsPointerToMember = 1 }; enum { nArgs = 2 };
366  typedef U ReturnType;
367  typedef W1 Arg1Type;
368  typedef W2 Arg2Type;
369  };
377  template <typename U, typename V,
378  typename W1, typename W2>
379  struct PtrToMemberTraits <U (V::*) (W1,W2) const>
380  { enum { IsPointerToMember = 1 }; enum { nArgs = 2 };
383  typedef U ReturnType;
384  typedef W1 Arg1Type;
385  typedef W2 Arg2Type;
386  };
395  template <typename U, typename V,
396  typename W1, typename W2, typename W3>
397  struct PtrToMemberTraits <U (V::*) (W1,W2,W3)>
398  { enum { IsPointerToMember = 1 }; enum { nArgs = 3 };
401  typedef U ReturnType;
402  typedef W1 Arg1Type;
403  typedef W2 Arg2Type;
404  typedef W3 Arg3Type;
405  };
414  template <typename U, typename V,
415  typename W1, typename W2, typename W3>
416  struct PtrToMemberTraits <U (V::*) (W1,W2,W3) const>
417  { enum { IsPointerToMember = 1 }; enum { nArgs = 3 };
420  typedef U ReturnType;
421  typedef W1 Arg1Type;
422  typedef W2 Arg2Type;
423  typedef W3 Arg3Type;
424  };
434  template <typename U, typename V,
435  typename W1, typename W2, typename W3,
436  typename W4>
437  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4)>
438  { enum { IsPointerToMember = 1 }; enum { nArgs = 4 };
441  typedef U ReturnType;
442  typedef W1 Arg1Type;
443  typedef W2 Arg2Type;
444  typedef W3 Arg3Type;
445  typedef W4 Arg4Type;
446  };
456  template <typename U, typename V,
457  typename W1, typename W2, typename W3,
458  typename W4>
459  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4) const>
460  { enum { IsPointerToMember = 1 }; enum { nArgs = 4 };
463  typedef U ReturnType;
464  typedef W1 Arg1Type;
465  typedef W2 Arg2Type;
466  typedef W3 Arg3Type;
467  typedef W4 Arg4Type;
468  };
479  template <typename U, typename V,
480  typename W1, typename W2, typename W3,
481  typename W4, typename W5>
482  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5)>
483  { enum { IsPointerToMember = 1 }; enum { nArgs = 5 };
486  typedef U ReturnType;
487  typedef W1 Arg1Type;
488  typedef W2 Arg2Type;
489  typedef W3 Arg3Type;
490  typedef W4 Arg4Type;
491  typedef W5 Arg5Type;
492  };
503  template <typename U, typename V,
504  typename W1, typename W2, typename W3,
505  typename W4, typename W5>
506  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5) const>
507  { enum { IsPointerToMember = 1 }; enum { nArgs = 5 };
510  typedef U ReturnType;
511  typedef W1 Arg1Type;
512  typedef W2 Arg2Type;
513  typedef W3 Arg3Type;
514  typedef W4 Arg4Type;
515  typedef W5 Arg5Type;
516  };
528  template <typename U, typename V,
529  typename W1, typename W2, typename W3,
530  typename W4, typename W5, typename W6>
531  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6)>
532  { enum { IsPointerToMember = 1 }; enum { nArgs = 6 };
535  typedef U ReturnType;
536  typedef W1 Arg1Type;
537  typedef W2 Arg2Type;
538  typedef W3 Arg3Type;
539  typedef W4 Arg4Type;
540  typedef W5 Arg5Type;
541  typedef W6 Arg6Type;
542  };
554  template <typename U, typename V,
555  typename W1, typename W2, typename W3,
556  typename W4, typename W5, typename W6>
557  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6) const>
558  { enum { IsPointerToMember = 1 }; enum { nArgs = 6 };
561  typedef U ReturnType;
562  typedef W1 Arg1Type;
563  typedef W2 Arg2Type;
564  typedef W3 Arg3Type;
565  typedef W4 Arg4Type;
566  typedef W5 Arg5Type;
567  typedef W6 Arg6Type;
568  };
569 
570 public:
572  typedef typename UnConst<T>::Result NonConstType;
574  typedef typename ReferenceTraits<T>::ReferencedType ReferencedType;
576  typedef typename PointerTraits<T>::PointeeType PointeeType;
578  typedef typename Base<T>::Type BaseType;
580  typedef typename PtrBase<T>::Type PtrBaseType;
582  enum {
584  IsPointerToMember = PtrToMemberTraits<T>::IsPointerToMember,
586  IsPointer = PointerTraits<T>::IsPointer,
588  IsPtr = PointerTraits<T>::IsPtr,
590  IsReference = ReferenceTraits<T>::IsReference,
592  IsFunctionPointer = FunctionPtrTraits<T>::IsFunctionPointer
593  };
595  typedef PtrToMemberTraits<T> PointerToMemberTraits;
597  typedef FunctionPtrTraits<T> FunctionPointerTraits;
598 };
599 
600 
601 #endif /* TYPE_TRAITS_H */
Reference predicate.
Definition: type-traits.h:590
Base< U >::Type Type
Base type.
Definition: type-traits.h:136
U Result
Non-const type.
Definition: type-traits.h:48
Not a pointer type.
Definition: type-traits.h:80
PtrBase< T >::Type PtrBaseType
Ptr base type.
Definition: type-traits.h:580
Not a pointer to member type.
Definition: type-traits.h:295
Smart pointer implementation.
Base type, after removing &, * and const.
Definition: type-traits.h:110
Base type of a Ptr.
Definition: type-traits.h:142
Base< T >::Type BaseType
Base type, after removing &, * and const.
Definition: type-traits.h:578
PtrToMemberTraits< T > PointerToMemberTraits
Pointer to member traits type.
Definition: type-traits.h:595
Function pointer predicate.
Definition: type-traits.h:592
Not a function pointer type.
Definition: type-traits.h:158
Ptr predicate.
Definition: type-traits.h:588
Null value type traits.
Definition: type-traits.h:41
U PointeeType
Base type.
Definition: type-traits.h:84
ReferenceTraits< T >::ReferencedType ReferencedType
Referenced type.
Definition: type-traits.h:574
Every class exported by the ns3 library is enclosed in the ns3 namespace.
U Type
Base type.
Definition: type-traits.h:112
Base< U >::Type Type
Base type.
Definition: type-traits.h:120
FunctionPtrTraits< T > FunctionPointerTraits
Function pointer traits.
Definition: type-traits.h:597
U Result
Non-const type.
Definition: type-traits.h:56
Not a const type.
Definition: type-traits.h:46
Pointer to member predicate.
Definition: type-traits.h:584
Pointer predicate.
Definition: type-traits.h:586
Inspect a type to deduce its features.
Definition: type-traits.h:37
PointerTraits< T >::PointeeType PointeeType
Pointee type.
Definition: type-traits.h:576
Not a reference type.
Definition: type-traits.h:62
Base< U >::Type Type
Base type.
Definition: type-traits.h:128
UnConst< T >::Result NonConstType
Not a const type.
Definition: type-traits.h:572
NullType ReturnType
Return type.
Definition: type-traits.h:161
U Type
Base type.
Definition: type-traits.h:144