10 #ifndef stk_util_util_TypeList_h 11 #define stk_util_util_TypeList_h 14 #include <stk_util/util/SameType.hpp> 30 struct TypeListEnd {};
40 template<
typename Value ,
class Tail = TypeListEnd >
struct TypeList {};
52 {
enum { value = 0 }; };
54 template<
typename Value ,
class Tail >
55 struct TypeListLength< TypeList< Value , Tail > >
56 {
enum { value = 1 + TypeListLength< Tail >::value }; };
65 template<
class ListType,
unsigned ordinal >
struct TypeListAt {};
67 template<
unsigned ordinal >
69 {
typedef TypeListEnd type ; };
71 template<
typename Value ,
class Tail >
72 struct TypeListAt< TypeList< Value , Tail > , 0 >
73 {
typedef Value type ; };
75 template<
typename Value ,
class Tail ,
unsigned ordinal >
76 struct TypeListAt< TypeList< Value , Tail > , ordinal >
77 {
typedef typename TypeListAt< Tail , ordinal - 1 >::type type ; };
87 template<
class ListType ,
typename TestValue ,
unsigned ordinal = 0 >
90 template<
typename TestValue ,
unsigned ordinal >
96 template<
typename Value ,
class Tail ,
typename TestValue ,
unsigned ordinal >
97 struct TypeListIndex< TypeList< Value , Tail > , TestValue , ordinal >
101 enum { J = match && 0 < ordinal ? ordinal - 1 : ordinal };
102 enum { N = TypeListIndex< Tail , TestValue , J >::value };
104 enum { value = match && 0 == ordinal ? 0 : ( -1 == N ? -1 : N + 1 ) };
114 template<
class ListType ,
typename TestValue >
117 template<
typename TestValue >
119 {
enum { value = 0 }; };
121 template<
typename Value ,
class Tail ,
typename TestValue >
122 struct TypeListCount< TypeList< Value , Tail > , TestValue >
124 enum { value = TypeListCount< Tail , TestValue >::value +
136 template<
typename TestValue >
138 {
enum { value =
false }; };
140 template<
typename Value ,
class Tail ,
typename TestValue >
141 struct TypeListMember< TypeList< Value , Tail > , TestValue >
144 TypeListMember< Tail , TestValue >::value };
157 {
enum { value =
true }; };
159 template<
typename Value ,
class Tail >
160 struct TypeListUnique< TypeList< Value , Tail > >
162 enum { value = ! TypeListMember< Tail , Value >::value &&
163 TypeListUnique< Tail >::value };
175 template<
class ListB >
177 {
enum { value =
true }; };
179 template<
typename Value ,
class Tail ,
class ListB >
180 struct TypeListDisjoint< TypeList< Value , Tail > , ListB >
182 enum { value = ! TypeListMember< ListB , Value >::value &&
183 TypeListDisjoint< Tail , ListB >::value };
196 {
typedef TypeListEnd type ; };
198 template<
typename Value ,
class Tail >
199 struct TypeListFirst< TypeList< Value , Tail > >
200 {
typedef Value type ; };
212 {
typedef TypeListEnd type ; };
214 template<
typename Value >
215 struct TypeListLast< TypeList< Value , TypeListEnd > >
216 {
typedef Value type ; };
218 template<
typename Value ,
class Tail >
219 struct TypeListLast< TypeList< Value , Tail > >
220 {
typedef typename TypeListLast< Tail >::type type ; };
232 {
typedef TypeListEnd type ; };
234 template<
typename T >
235 struct TypeListAppend< TypeListEnd , T >
236 {
typedef TypeList< T > type ; };
238 template<
typename Value ,
class Tail ,
typename T >
239 struct TypeListAppend< TypeList< Value , Tail > , T >
241 typedef TypeList< Value , typename TypeListAppend< Tail , T >::type > type ;
254 {
typedef TypeListEnd type ; };
256 template<
typename Value ,
class Tail >
257 struct TypeListJoin< TypeListEnd , TypeList< Value , Tail > >
258 {
typedef TypeList< Value , Tail > type ; };
260 template<
typename ValueA ,
class TailA ,
typename ValueB ,
class TailB >
261 struct TypeListJoin< TypeList< ValueA , TailA > ,
262 TypeList< ValueB , TailB > >
266 TypeListJoin< TailA , TypeList< ValueB , TailB > >::type Tail ;
268 typedef TypeList< ValueA , Tail > type ;
279 template<
typename Value ,
class Tail >
281 {
typedef Tail type ; };
283 template<
typename Value ,
class Tail ,
unsigned ordinal >
284 struct TypeListEraseAt< TypeList< Value , Tail > , ordinal >
286 typedef TypeList< Value ,
287 typename TypeListEraseAt<Tail,ordinal-1>::type > type ;
302 {
typedef TypeListEnd type ; };
304 template<
class Tail >
305 struct TypeListClean< TypeList< TypeListEnd , Tail > >
306 {
typedef TypeListEnd type ; };
308 template<
typename Value ,
class Tail >
309 struct TypeListClean< TypeList< Value , Tail > >
311 typedef TypeList< Value , typename TypeListClean< Tail >::type > type ;
320 template<
typename T00 = TypeListEnd ,
321 typename T01 = TypeListEnd ,
322 typename T02 = TypeListEnd ,
323 typename T03 = TypeListEnd ,
324 typename T04 = TypeListEnd ,
325 typename T05 = TypeListEnd ,
326 typename T06 = TypeListEnd ,
327 typename T07 = TypeListEnd ,
328 typename T08 = TypeListEnd ,
329 typename T09 = TypeListEnd ,
330 typename T10 = TypeListEnd ,
331 typename T11 = TypeListEnd ,
332 typename T12 = TypeListEnd ,
333 typename T13 = TypeListEnd ,
334 typename T14 = TypeListEnd ,
335 typename T15 = TypeListEnd ,
336 typename T16 = TypeListEnd ,
337 typename T17 = TypeListEnd ,
338 typename T18 = TypeListEnd ,
339 typename T19 = TypeListEnd ,
340 typename T20 = TypeListEnd ,
341 typename T21 = TypeListEnd ,
342 typename T22 = TypeListEnd ,
343 typename T23 = TypeListEnd ,
344 typename T24 = TypeListEnd ,
345 typename T25 = TypeListEnd ,
346 typename T26 = TypeListEnd ,
347 typename T27 = TypeListEnd ,
348 typename T28 = TypeListEnd ,
349 typename T29 = TypeListEnd ,
350 typename T30 = TypeListEnd ,
351 typename T31 = TypeListEnd ,
352 typename T32 = TypeListEnd ,
353 typename T33 = TypeListEnd ,
354 typename T34 = TypeListEnd ,
355 typename T35 = TypeListEnd ,
356 typename T36 = TypeListEnd ,
357 typename T37 = TypeListEnd ,
358 typename T38 = TypeListEnd ,
359 typename T39 = TypeListEnd ,
360 typename T40 = TypeListEnd ,
361 typename T41 = TypeListEnd ,
362 typename T42 = TypeListEnd ,
363 typename T43 = TypeListEnd ,
364 typename T44 = TypeListEnd ,
365 typename T45 = TypeListEnd ,
366 typename T46 = TypeListEnd ,
367 typename T47 = TypeListEnd ,
368 typename T48 = TypeListEnd ,
369 typename T49 = TypeListEnd ,
370 typename T50 = TypeListEnd ,
371 typename T51 = TypeListEnd ,
372 typename T52 = TypeListEnd ,
373 typename T53 = TypeListEnd ,
374 typename T54 = TypeListEnd ,
375 typename T55 = TypeListEnd ,
376 typename T56 = TypeListEnd ,
377 typename T57 = TypeListEnd ,
378 typename T58 = TypeListEnd ,
379 typename T59 = TypeListEnd ,
380 typename T60 = TypeListEnd ,
381 typename T61 = TypeListEnd ,
382 typename T62 = TypeListEnd ,
383 typename T63 = TypeListEnd >
386 #ifndef DOXYGEN_COMPILE 452 TypeListEnd > > > > > > > > > > > > > > > >
453 > > > > > > > > > > > > > > > >
454 > > > > > > > > > > > > > > > >
455 > > > > > > > > > > > > > > > > dirty_type ;
478 template<
typename ValueType,
typename ListType>
496 template<
class ListType>
497 struct TypeListLength ;
500 template<
class ListType,
typename ValueType,
unsigned Ordinal = 0>
501 struct TypeListIndex ;
504 template<
class ListType,
typename ValueType>
505 struct TypeListCount ;
508 template<
class ListType >
509 struct TypeListLast ;
512 template<
class ListType,
unsigned I>
516 template<
class ListType,
typename ValueType>
517 struct TypeListMember ;
520 template<
class ListType,
unsigned I >
521 struct TypeListEraseAt ;
528 template<
class ListType >
529 struct TypeListUnique ;
532 template<
class SuperList ,
class SubList >
533 struct TypeListContains ;
536 template<
class ListA ,
class ListB >
537 struct TypeListDisjoint ;
540 template<
class ListType>
541 struct TypeListClean ;
592 template<
typename Tail>
593 struct TypeListClean< TypeList< TypeListEnd , Tail > > {
594 typedef TypeListEnd list_type ;
597 template<
class ListType>
598 struct TypeListClean {
600 typedef typename ListType::TypeListValue ValueType ;
601 typedef typename ListType::TypeListTail InputTailType ;
602 typedef typename TypeListClean<InputTailType>::list_type TailType ;
604 typedef TypeList< ValueType , TailType > list_type ;
612 template<>
struct TypeListLength<TypeListEnd>
613 {
enum { value = 0 }; };
615 template<
class ListType>
616 struct TypeListLength< TypeList<TypeListEnd,ListType> >
617 {
enum { value = 0 }; };
619 template<
class ListType>
620 struct TypeListLength
622 private:
typedef typename ListType::TypeListTail TailType ;
623 public:
enum { value = 1 + TypeListLength<TailType>::value };
634 template<
typename ValueType,
unsigned Ordinal>
635 struct TypeListIndex< TypeListEnd , ValueType , Ordinal> {
637 typedef TypeListEnd tail_type ;
640 template<
class ListType,
unsigned Ordinal>
641 struct TypeListIndex< ListType , TypeListEnd , Ordinal > {
643 typedef TypeListEnd tail_type ;
646 template<
class Tail,
typename ValueType,
unsigned Ordinal >
647 struct TypeListIndex< TypeList<TypeListEnd,Tail> , ValueType, Ordinal >
650 typedef TypeListEnd tail_type ;
653 template<
typename ValueType,
class Tail>
654 struct TypeListIndex< TypeList<ValueType,Tail> , ValueType , 0 >
657 typedef Tail tail_type ;
662 template<
class ListType,
typename ValueType,
unsigned Ordinal>
667 enum { ord = Ordinal == 0 ? 0 : ( same ? Ordinal - 1 : Ordinal ) };
668 typedef typename ListType::TypeListTail TailType ;
669 typedef TypeListIndex< TailType , ValueType , ord > type_list_index ;
670 enum { temp = type_list_index::value };
672 enum { value = temp == -1 ? -1 : 1 + temp };
673 typedef typename type_list_index::tail_type tail_type ;
683 template<
typename ValueType>
684 struct TypeListCount< TypeListEnd , ValueType > {
enum { value = 0 }; };
686 template<
class ListType>
687 struct TypeListCount< ListType , TypeListEnd > {
enum { value = 0 }; };
689 template<
class Tail,
typename ValueType>
690 struct TypeListCount< TypeList<TypeListEnd,Tail>,ValueType>
691 {
enum { value = 0 }; };
693 template<
typename ValueType,
class Tail>
694 struct TypeListCount< TypeList<ValueType,Tail> , ValueType>
695 {
enum { value = 1 + TypeListCount< Tail , ValueType >::value }; };
697 template<
class ListType,
typename ValueType>
700 private:
typedef typename ListType::TypeListTail TailType ;
701 public:
enum { value = TypeListCount< TailType , ValueType >::value };
712 struct TypeListAt< TypeListEnd, 0>
714 typedef TypeListEnd type ;
715 typedef TypeListEnd list_type ;
719 struct TypeListAt< TypeListEnd, I>
721 typedef TypeListEnd type ;
722 typedef TypeListEnd list_type ;
725 template<
class ListType >
726 struct TypeListAt< ListType , 0 >
729 typedef typename ListType::TypeListTail Tail ;
731 typedef typename ListType::TypeListValue type ;
732 typedef TypeList< type , Tail > list_type ;
735 template<
class Tail,
unsigned I>
736 struct TypeListAt< TypeList<TypeListEnd,Tail>, I>
738 typedef TypeListEnd type ;
739 typedef TypeListEnd list_type ;
742 template<
class ListType,
unsigned I>
746 typedef typename ListType::TypeListTail Tail ;
747 typedef TypeListAt<Tail,I-1> AtType ;
749 typedef typename AtType::type type ;
750 typedef typename AtType::list_type list_type ;
760 struct TypeListLast< TypeListEnd >
761 {
typedef TypeListEnd type ; };
763 template<
class ValueType>
764 struct TypeListLast< TypeList<ValueType,TypeListEnd> >
765 {
typedef ValueType type ; };
767 template<
class ValueType,
class Tail>
768 struct TypeListLast< TypeList<ValueType,TypeList<TypeListEnd,Tail> > >
769 {
typedef ValueType type ; };
771 template<
class ValueType,
class Tail>
772 struct TypeListLast< TypeList<ValueType,Tail> >
773 {
typedef typename TypeListLast<Tail>::type type ; };
781 template<
typename ValueType >
782 struct TypeListMember< TypeListEnd , ValueType >
783 {
typedef TypeListEnd list_type ; };
785 template<
class Tail ,
typename ValueType >
786 struct TypeListMember< TypeList<TypeListEnd,Tail> , ValueType >
787 {
typedef TypeListEnd list_type ; };
789 template<
typename ValueType ,
class ListType>
790 struct TypeListMember< TypeList<ValueType,ListType> , ValueType >
791 {
typedef TypeList<ValueType,ListType> list_type ; };
793 template<
class ListType,
typename ValueType>
794 struct TypeListMember
796 private:
typedef typename ListType::TypeListTail Tail ;
797 public:
typedef typename TypeListMember<Tail,ValueType>::list_type list_type;
829 struct TypeListEraseAt< TypeListEnd, 0>
831 typedef TypeListEnd list_type ;
835 struct TypeListEraseAt< TypeListEnd, I>
837 typedef TypeListEnd list_type ;
840 template<
class Tail,
unsigned I>
841 struct TypeListEraseAt< TypeList<TypeListEnd,Tail>, I>
843 typedef TypeListEnd list_type ;
846 template<
class ListType >
847 struct TypeListEraseAt< ListType , 0 >
850 typedef typename ListType::TypeListTail Tail ;
852 typedef Tail list_type ;
855 template<
class ListType,
unsigned I>
856 struct TypeListEraseAt
859 typedef typename ListType::TypeListTail Tail ;
860 typedef TypeListEraseAt<Tail, I - 1> EraseAtType ;
862 typedef TypeList<typename ListType::TypeListValue, typename EraseAtType::list_type> list_type ;
872 struct TypeListUnique<TypeListEnd> {
enum { value =
true }; };
875 struct TypeListUnique< TypeList<TypeListEnd,Tail> >
876 {
enum { value =
true }; };
878 template<
class ListType >
879 struct TypeListUnique
882 typedef typename ListType::TypeListValue ValueType ;
883 typedef typename ListType::TypeListTail TailType ;
887 enum { value = ( TypeListIndex<TailType,ValueType>::value == -1 ) &&
888 TypeListUnique<TailType>::value };
898 template<
class SuperList>
899 struct TypeListContains<SuperList,TypeListEnd>
900 {
enum { value =
true }; };
902 template<
class SuperList,
typename Tail>
903 struct TypeListContains<SuperList,TypeList<TypeListEnd,Tail> >
904 {
enum { value =
true }; };
906 template<
class SuperList,
class SubList >
907 struct TypeListContains
910 typedef typename SubList::TypeListValue ValueType ;
911 typedef typename SubList::TypeListTail TailType ;
914 enum { value = ( TypeListIndex<SuperList,ValueType>::value != -1 ) &&
915 TypeListContains<SuperList,TailType>::value };
925 template<
class SuperList>
926 struct TypeListDisjoint<SuperList,TypeListEnd>
927 {
enum { value =
true }; };
929 template<
class SuperList,
typename Tail>
930 struct TypeListDisjoint<SuperList,TypeList<TypeListEnd,Tail> >
931 {
enum { value =
true }; };
933 template<
class ListA,
class ListB>
934 struct TypeListDisjoint
937 typedef typename ListB::TypeListValue ValueType ;
938 typedef typename ListB::TypeListTail TailType ;
941 enum { value = ( TypeListIndex<ListA,ValueType>::value == -1 ) &&
942 TypeListDisjoint<ListA,TailType>::value };
947 template<
typename T1 ,
978 struct MakeTypeList<TypeListEnd,
979 T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,
980 T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,
981 T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31> {
982 typedef TypeListEnd type ;
987 template<
typename T0 ,
1019 struct MakeTypeList {
1020 typedef typename TypeListClean<
1053 TypeListEnd > > > > > > > > > > > > > > > >
1054 > > > > > > > > > > > > > > > >
1056 enum { length = TypeListLength<type>::value };
1057 enum {
unique = TypeListUnique<type>::value };
1062 #endif // stk_util_util_TypeList_h Member enum { value = ... }; is true if T1 and T2 are the same type.
Member typedef ... type ; is the type of the member of ListType at location ordinal if ordinal...
Member typedef ... type ; is defined by erasing member at ordinal from ListType ...
Member enum { value = ... }; is the length of the type list.
ForwardIterator unique(ForwardIterator first, ForwardIterator last)
TypeListClean< dirty_type >::type type
The constructed type list.
Member typedef ... type ; is defined by truncating ListType at the first occurance of TypeListEn...
Member enum { value = ... }; is true if TestValue is a member of ListType .
Member enum { value = ... }; is true if all members of ListA are not a member ListB ...
Member typedef ... type ; is the first member of ListType .
Member enum { value = ... }; is the location within ListType of occurance I of type TestValue ...
Member enum { value = ... }; is the number of occurances of TestValue within ListType ...
Member typedef ... type ; is defined by appending T to the end of ListA .
Member typedef ... type ; is a type list constructed from the template arguments.
Member typedef ... type ; is defined by joining ListB to the end of ListA .
A link within a linked list of types.A linked list of types where Tail is required to either termin...
Member typedef ... type ; is the last member of ListType .
Member enum { value = ... }; is true if each member of ListType appears exactly once...