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
31namespace ns3 {
32
38template <typename T>
40{
41private:
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 {
101 IsPtr = 0
102 };
103 typedef U PointeeType;
104 };
109 template <typename U>
110 struct PointerTraits<U *>
111 {
113 enum
114 {
116 IsPtr = 0
117 };
118 typedef U PointeeType;
119 };
124 template <typename U>
125 struct PointerTraits<ns3::Ptr<U> >
126 {
128 enum
129 {
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 {
200 };
202 };
207 template <typename U>
208 struct FunctionPtrTraits <U (*)(void)>
209 {
211 enum
212 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
391 };
392 };
398 template <typename U, typename V>
399 struct PtrToMemberTraits <U (V::*)(void)>
400 {
402 enum
403 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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
762public:
770 typedef typename Base<T>::Type BaseType;
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
NullType ReturnType
Return type.
Definition: type-traits.h:201
@ IsFunctionPointer
Not a function pointer.
Definition: type-traits.h:199
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
@ 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
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
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