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 
31 namespace ns3 {
32 
38 template <typename T>
39 struct TypeTraits
40 {
41 private:
43  struct NullType {};
48  template <typename U>
49  struct UnConst
50  {
51  typedef U Result;
52  };
57  template <typename U>
58  struct UnConst<const U>
59  {
60  typedef U Result;
61  };
66  template <typename U>
68  {
70  enum
71  {
72  IsReference = 0
73  };
74  typedef U ReferencedType;
75  };
80  template <typename U>
81  struct ReferenceTraits<U&>
82  {
84  enum
85  {
86  IsReference = 1
87  };
88  typedef U ReferencedType;
89  };
94  template <typename U>
96  {
98  enum
99  {
100  IsPointer = 0,
101  IsPtr = 0
102  };
103  typedef U PointeeType;
104  };
109  template <typename U>
110  struct PointerTraits<U *>
111  {
113  enum
114  {
115  IsPointer = 1,
116  IsPtr = 0
117  };
118  typedef U PointeeType;
119  };
124  template <typename U>
125  struct PointerTraits<ns3::Ptr<U> >
126  {
128  enum
129  {
130  IsPointer = 0,
131  IsPtr = 1
132  };
133  typedef U PointeeType;
134  };
139  template <typename U>
140  struct Base
141  {
142  typedef U Type;
143  };
148  template <typename U>
149  struct Base <U &>
150  {
151  typedef typename Base<U>::Type Type;
152  };
157  template <typename U>
158  struct Base <U *>
159  {
160  typedef typename Base<U>::Type Type;
161  };
166  template <typename U>
167  struct Base <const U >
168  {
169  typedef typename Base<U>::Type Type;
170  };
175  template <typename U>
176  struct PtrBase
177  {
178  typedef U Type;
179  };
184  template <typename U>
185  struct PtrBase <ns3::Ptr<U> >
186  {
187  typedef U Type;
188  };
193  template <typename U>
195  {
197  enum
198  {
199  IsFunctionPointer = 0
200  };
202  };
207  template <typename U>
208  struct FunctionPtrTraits <U (*)(void)>
209  {
211  enum
212  {
213  IsFunctionPointer = 1
214  }; enum
216  {
217  nArgs = 0
218  };
219  typedef U ReturnType;
220  };
226  template <typename U,
227  typename V1>
228  struct FunctionPtrTraits <U (*)(V1)>
229  {
231  enum
232  {
233  IsFunctionPointer = 1
234  }; enum
236  {
237  nArgs = 1
238  };
239  typedef U ReturnType;
240  typedef V1 Arg1Type;
241  };
248  template <typename U,
249  typename V1, typename V2>
250  struct FunctionPtrTraits <U (*)(V1,V2)>
251  {
253  enum
254  {
255  IsFunctionPointer = 1
256  }; enum
258  {
259  nArgs = 2
260  };
261  typedef U ReturnType;
262  typedef V1 Arg1Type;
263  typedef V2 Arg2Type;
264  };
272  template <typename U,
273  typename V1, typename V2, typename V3>
274  struct FunctionPtrTraits <U (*)(V1,V2,V3)>
275  {
277  enum
278  {
279  IsFunctionPointer = 1
280  }; enum
282  {
283  nArgs = 3
284  };
285  typedef U ReturnType;
286  typedef V1 Arg1Type;
287  typedef V2 Arg2Type;
288  typedef V3 Arg3Type;
289  };
298  template <typename U,
299  typename V1, typename V2, typename V3,
300  typename V4>
301  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4)>
302  {
304  enum
305  {
306  IsFunctionPointer = 1
307  }; enum
309  {
310  nArgs = 4
311  };
312  typedef U ReturnType;
313  typedef V1 Arg1Type;
314  typedef V2 Arg2Type;
315  typedef V3 Arg3Type;
316  typedef V4 Arg4Type;
317  };
327  template <typename U,
328  typename V1, typename V2, typename V3,
329  typename V4, typename V5>
330  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5)>
331  {
333  enum
334  {
335  IsFunctionPointer = 1
336  }; enum
338  {
339  nArgs = 5
340  };
341  typedef U ReturnType;
342  typedef V1 Arg1Type;
343  typedef V2 Arg2Type;
344  typedef V3 Arg3Type;
345  typedef V4 Arg4Type;
346  typedef V5 Arg5Type;
347  };
358  template <typename U,
359  typename V1, typename V2, typename V3,
360  typename V4, typename V5, typename V6>
361  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5,V6)>
362  {
364  enum
365  {
366  IsFunctionPointer = 1
367  }; enum
369  {
370  nArgs = 6
371  };
372  typedef U ReturnType;
373  typedef V1 Arg1Type;
374  typedef V2 Arg2Type;
375  typedef V3 Arg3Type;
376  typedef V4 Arg4Type;
377  typedef V5 Arg5Type;
378  typedef V6 Arg6Type;
379  };
384  template <typename U>
386  {
388  enum
389  {
390  IsPointerToMember = 0
391  };
392  };
398  template <typename U, typename V>
399  struct PtrToMemberTraits <U (V::*)(void)>
400  {
402  enum
403  {
404  IsPointerToMember = 1
405  }; enum
407  {
408  nArgs = 0
409  };
410  typedef U ReturnType;
411  };
417  template <typename U, typename V>
418  struct PtrToMemberTraits <U (V::*)(void) const>
419  {
421  enum
422  {
423  IsPointerToMember = 1
424  }; enum
426  {
427  nArgs = 0
428  };
429  typedef U ReturnType;
430  };
437  template <typename U, typename V,
438  typename W1>
439  struct PtrToMemberTraits <U (V::*)(W1)>
440  {
442  enum
443  {
444  IsPointerToMember = 1
445  }; enum
447  {
448  nArgs = 1
449  };
450  typedef U ReturnType;
451  typedef W1 Arg1Type;
452  };
459  template <typename U, typename V,
460  typename W1>
461  struct PtrToMemberTraits <U (V::*)(W1) const>
462  {
464  enum
465  {
466  IsPointerToMember = 1
467  }; enum
469  {
470  nArgs = 1
471  };
472  typedef U ReturnType;
473  typedef W1 Arg1Type;
474  };
482  template <typename U, typename V,
483  typename W1, typename W2>
484  struct PtrToMemberTraits <U (V::*)(W1,W2)>
485  {
487  enum
488  {
489  IsPointerToMember = 1
490  }; enum
492  {
493  nArgs = 2
494  };
495  typedef U ReturnType;
496  typedef W1 Arg1Type;
497  typedef W2 Arg2Type;
498  };
506  template <typename U, typename V,
507  typename W1, typename W2>
508  struct PtrToMemberTraits <U (V::*)(W1,W2) const>
509  {
511  enum
512  {
513  IsPointerToMember = 1
514  }; enum
516  {
517  nArgs = 2
518  };
519  typedef U ReturnType;
520  typedef W1 Arg1Type;
521  typedef W2 Arg2Type;
522  };
531  template <typename U, typename V,
532  typename W1, typename W2, typename W3>
533  struct PtrToMemberTraits <U (V::*)(W1,W2,W3)>
534  {
536  enum
537  {
538  IsPointerToMember = 1
539  }; enum
541  {
542  nArgs = 3
543  };
544  typedef U ReturnType;
545  typedef W1 Arg1Type;
546  typedef W2 Arg2Type;
547  typedef W3 Arg3Type;
548  };
557  template <typename U, typename V,
558  typename W1, typename W2, typename W3>
559  struct PtrToMemberTraits <U (V::*)(W1,W2,W3) const>
560  {
562  enum
563  {
564  IsPointerToMember = 1
565  }; enum
567  {
568  nArgs = 3
569  };
570  typedef U ReturnType;
571  typedef W1 Arg1Type;
572  typedef W2 Arg2Type;
573  typedef W3 Arg3Type;
574  };
584  template <typename U, typename V,
585  typename W1, typename W2, typename W3,
586  typename W4>
587  struct PtrToMemberTraits <U (V::*)(W1,W2,W3,W4)>
588  {
590  enum
591  {
592  IsPointerToMember = 1
593  }; enum
595  {
596  nArgs = 4
597  };
598  typedef U ReturnType;
599  typedef W1 Arg1Type;
600  typedef W2 Arg2Type;
601  typedef W3 Arg3Type;
602  typedef W4 Arg4Type;
603  };
613  template <typename U, typename V,
614  typename W1, typename W2, typename W3,
615  typename W4>
616  struct PtrToMemberTraits <U (V::*)(W1,W2,W3,W4) const>
617  {
619  enum
620  {
621  IsPointerToMember = 1
622  }; enum
624  {
625  nArgs = 4
626  };
627  typedef U ReturnType;
628  typedef W1 Arg1Type;
629  typedef W2 Arg2Type;
630  typedef W3 Arg3Type;
631  typedef W4 Arg4Type;
632  };
643  template <typename U, typename V,
644  typename W1, typename W2, typename W3,
645  typename W4, typename W5>
646  struct PtrToMemberTraits <U (V::*)(W1,W2,W3,W4,W5)>
647  {
649  enum
650  {
651  IsPointerToMember = 1
652  }; enum
654  {
655  nArgs = 5
656  };
657  typedef U ReturnType;
658  typedef W1 Arg1Type;
659  typedef W2 Arg2Type;
660  typedef W3 Arg3Type;
661  typedef W4 Arg4Type;
662  typedef W5 Arg5Type;
663  };
674  template <typename U, typename V,
675  typename W1, typename W2, typename W3,
676  typename W4, typename W5>
677  struct PtrToMemberTraits <U (V::*)(W1,W2,W3,W4,W5) const>
678  {
680  enum
681  {
682  IsPointerToMember = 1
683  }; enum
685  {
686  nArgs = 5
687  };
688  typedef U ReturnType;
689  typedef W1 Arg1Type;
690  typedef W2 Arg2Type;
691  typedef W3 Arg3Type;
692  typedef W4 Arg4Type;
693  typedef W5 Arg5Type;
694  };
706  template <typename U, typename V,
707  typename W1, typename W2, typename W3,
708  typename W4, typename W5, typename W6>
709  struct PtrToMemberTraits <U (V::*)(W1,W2,W3,W4,W5,W6)>
710  {
712  enum
713  {
714  IsPointerToMember = 1
715  }; enum
717  {
718  nArgs = 6
719  };
720  typedef U ReturnType;
721  typedef W1 Arg1Type;
722  typedef W2 Arg2Type;
723  typedef W3 Arg3Type;
724  typedef W4 Arg4Type;
725  typedef W5 Arg5Type;
726  typedef W6 Arg6Type;
727  };
739  template <typename U, typename V,
740  typename W1, typename W2, typename W3,
741  typename W4, typename W5, typename W6>
742  struct PtrToMemberTraits <U (V::*)(W1,W2,W3,W4,W5,W6) const>
743  {
745  enum
746  {
747  IsPointerToMember = 1
748  }; enum
750  {
751  nArgs = 6
752  };
753  typedef U ReturnType;
754  typedef W1 Arg1Type;
755  typedef W2 Arg2Type;
756  typedef W3 Arg3Type;
757  typedef W4 Arg4Type;
758  typedef W5 Arg5Type;
759  typedef W6 Arg6Type;
760  };
761 
762 public:
770  typedef typename Base<T>::Type BaseType;
772  typedef typename PtrBase<T>::Type PtrBaseType;
774  enum
775  {
786  };
791 };
792 
793 } // namespace ns3
794 
795 #endif /* TYPE_TRAITS_H */
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::Ptr smart pointer declaration and implementation.
Base< U >::Type Type
Base type.
Definition: type-traits.h:160
Base< U >::Type Type
Base type.
Definition: type-traits.h:151
Base< U >::Type Type
Base type.
Definition: type-traits.h:169
Base type, after removing &, * and const.
Definition: type-traits.h:141
Not a function pointer type.
Definition: type-traits.h:195
@ IsFunctionPointer
Not a function pointer.
Definition: type-traits.h:199
NullType ReturnType
Return type.
Definition: type-traits.h:201
Null value type traits.
Definition: type-traits.h:43
Not a pointer type.
Definition: type-traits.h:96
@ IsPointer
Not a pointer type.
Definition: type-traits.h:100
Base type of a Ptr.
Definition: type-traits.h:177
Not a pointer to member type.
Definition: type-traits.h:386
@ IsPointerToMember
Not a pointer to member.
Definition: type-traits.h:390
Not a reference type.
Definition: type-traits.h:68
@ IsReference
Not a reference type.
Definition: type-traits.h:72
Not a const type.
Definition: type-traits.h:50
U Result
Non-const type.
Definition: type-traits.h:51
Inspect a type to deduce its features.
Definition: type-traits.h:40
ReferenceTraits< T >::ReferencedType ReferencedType
Referenced type.
Definition: type-traits.h:766
PtrToMemberTraits< T > PointerToMemberTraits
Pointer to member traits type.
Definition: type-traits.h:788
PtrBase< T >::Type PtrBaseType
Ptr base type.
Definition: type-traits.h:772
FunctionPtrTraits< T > FunctionPointerTraits
Function pointer traits.
Definition: type-traits.h:790
@ IsPtr
Ptr predicate.
Definition: type-traits.h:781
@ IsFunctionPointer
Function pointer predicate.
Definition: type-traits.h:785
@ IsPointerToMember
Pointer to member predicate.
Definition: type-traits.h:777
@ IsReference
Reference predicate.
Definition: type-traits.h:783
@ IsPointer
Pointer predicate.
Definition: type-traits.h:779
Base< T >::Type BaseType
Base type, after removing &, * and const.
Definition: type-traits.h:770
PointerTraits< T >::PointeeType PointeeType
Pointee type.
Definition: type-traits.h:768
UnConst< T >::Result NonConstType
Not a const type.
Definition: type-traits.h:764