59 #ifndef __TypeList_H__
60 #define __TypeList_H__
62 #ifndef ELX_TEMPLATE_WORKAROUND
65 # define ELX_TEMPLATE_WORKAROUND
67 # define ELX_TEMPLATE_WORKAROUND template
70 # define ELX_TEMPLATE_WORKAROUND template
87 template<
typename H,
typename T >
116 typename T1 = NullType,
typename T2 = NullType,
typename T3 = NullType,
117 typename T4 = NullType,
typename T5 = NullType,
typename T6 = NullType,
118 typename T7 = NullType,
typename T8 = NullType,
typename T9 = NullType,
119 typename T10 = NullType,
typename T11 = NullType,
typename T12 = NullType,
120 typename T13 = NullType,
typename T14 = NullType,
typename T15 = NullType,
121 typename T16 = NullType,
typename T17 = NullType,
typename T18 = NullType,
122 typename T19 = NullType,
typename T20 = NullType,
typename T21 = NullType,
123 typename T22 = NullType,
typename T23 = NullType,
typename T24 = NullType
129 typedef typename MakeTypeList
143 typedef TypeList< T1, TailType > Type;
146 struct MakeTypeList< >
148 typedef NullType Type;
151 template<
typename TTypeList >
165 template<
typename H,
typename T >
166 struct Length< TypeList< H, T > >
168 enum { Type = 1 + Length< T >::Type };
173 struct Length< NullType >
193 template<
class TTypeList,
unsigned int index >
196 template<
class Head,
class Tail >
197 struct TypeAt< TypeList< Head, Tail >, 0 >
202 template<
class Head,
class Tail,
unsigned int i >
203 struct TypeAt< TypeList< Head, Tail >, i >
205 typedef typename TypeAt< Tail, i - 1 >::Type Type;
208 template<
unsigned int i >
209 struct TypeAt< NullType, i >
211 typedef NullType Type;
214 template<
class TTypeList1,
class TTypeList2 >
237 template<
class Head,
class Tail,
class T >
238 struct Append< TypeList< Head, Tail >, T >
240 typedef TypeList< Head, typename Append< Tail, T >::Type > Type;
245 struct Append< NullType, NullType >
247 typedef NullType Type;
250 struct Append< NullType, T >
252 typedef TypeList< T, NullType > Type;
255 struct Append< T, NullType >
257 typedef TypeList< T, NullType > Type;
259 template<
class Head,
class Tail >
260 struct Append< NullType, TypeList< Head, Tail > >
262 typedef TypeList< Head, Tail > Type;
264 template<
class Head,
class Tail >
265 struct Append< TypeList< Head, Tail >, NullType >
267 typedef TypeList< Head, Tail > Type;
273 template<
class TList,
class T >
277 struct Erase< NullType, T >
279 typedef NullType Type;
282 template<
class T,
class Tail >
283 struct Erase< TypeList< T, Tail >, T >
288 template<
class Head,
class Tail,
class T >
289 struct Erase< TypeList< Head, Tail >, T >
291 typedef TypeList< Head, typename Erase< Tail, T >::Type > Type;
297 template<
class TList,
class T >
300 struct EraseAll< NullType, T >
302 typedef NullType Type;
304 template<
class T,
class Tail >
305 struct EraseAll< TypeList< T, Tail >, T >
307 typedef typename EraseAll< Tail, T >::Type Type;
309 template<
class Head,
class Tail,
class T >
310 struct EraseAll< TypeList< Head, Tail >, T >
312 typedef TypeList< Head, typename EraseAll< Tail, T >::Type > Type;
318 template<
class TList >
322 struct NoDuplicates< NullType >
324 typedef NullType Type;
327 template<
class Head,
class Tail >
328 struct NoDuplicates< TypeList< Head, Tail > >
332 typedef typename NoDuplicates< Tail >::Type L1;
333 typedef typename Erase< L1, Head >::Type L2;
337 typedef TypeList< Head, L2 > Type;
343 template<
class TList,
class T,
class U >
346 template<
class T,
class U >
347 struct Replace< NullType, T, U >
349 typedef NullType Type;
352 template<
class T,
class Tail,
class U >
353 struct Replace< TypeList< T, Tail >, T, U >
355 typedef TypeList< U, Tail > Type;
358 template<
class Head,
class Tail,
class T,
class U >
359 struct Replace< TypeList< Head, Tail >, T, U >
361 typedef TypeList< Head, typename Replace< Tail, T, U >::Type > Type;
367 template<
class TList,
class T,
class U >
370 template<
class T,
class U >
371 struct ReplaceAll< NullType, T, U >
373 typedef NullType Type;
376 template<
class T,
class Tail,
class U >
377 struct ReplaceAll< TypeList< T, Tail >, T, U >
379 typedef TypeList< U, typename ReplaceAll< Tail, T, U >::Type > Type;
382 template<
class Head,
class Tail,
class T,
class U >
383 struct ReplaceAll< TypeList< Head, Tail >, T, U >
385 typedef TypeList< Head, typename ReplaceAll< Tail, T, U >::Type > Type;
391 template<
class TList >
395 struct Reverse< NullType >
397 typedef NullType Type;
400 template<
class Head,
class Tail >
401 struct Reverse< TypeList< Head, Tail > >
403 typedef typename Append< typename Reverse< Tail >::Type, Head >::Type Type;
420 template<
class TTypeList,
class TType >
422 template<
class TType >
423 struct IndexOf< NullType, TType >
427 template<
class TType,
class TTail >
428 struct IndexOf< TypeList< TType, TTail >, TType >
432 template<
class Head,
class TTail,
class TType >
433 struct IndexOf< TypeList< Head, TTail >, TType >
437 enum { temp = IndexOf< TTail, TType >::Type };
441 enum { Type = ( temp == -1 ? -1 : 1 + temp ) };
456 template<
class TTypeList,
class TType >
458 template<
class TType >
459 struct HasType< NullType, TType >
461 enum { Type =
false };
463 template<
class TType,
class TTail >
464 struct HasType< TypeList< TType, TTail >, TType >
466 enum { Type =
true };
468 template<
class Head,
class TTail,
class TType >
469 struct HasType< TypeList< Head, TTail >, TType >
471 enum { Type = HasType< TTail, TType >::Type };
492 template<
class TTypeList >
495 template<
class Predicate >
496 void operator()( Predicate & visitor )
498 typedef typename TTypeList::Head Head;
499 typedef typename TTypeList::Tail Tail;
500 visitor.ELX_TEMPLATE_WORKAROUND operator()< Head >( );
502 next.ELX_TEMPLATE_WORKAROUND operator()< Predicate >( visitor );
506 template<
class Predicate >
507 void operator()(
const Predicate & visitor )
509 typedef typename TTypeList::Head Head;
510 typedef typename TTypeList::Tail Tail;
511 visitor.ELX_TEMPLATE_WORKAROUND operator()< Head >( );
513 next.ELX_TEMPLATE_WORKAROUND operator()< Predicate >( visitor );
520 struct Visit< NullType >
522 template<
class Predicate >
523 void operator()(
const Predicate & )
543 template<
class TTypeList,
unsigned int Dimension >
546 template<
class Predicate >
549 typedef typename TTypeList::Head Head;
550 typedef typename TTypeList::Tail Tail;
551 visitor.ELX_TEMPLATE_WORKAROUND operator()< Head, Dimension >( );
553 next.ELX_TEMPLATE_WORKAROUND operator()< Predicate >( visitor );
557 template<
class Predicate >
560 typedef typename TTypeList::Head Head;
561 typedef typename TTypeList::Tail Tail;
562 visitor.ELX_TEMPLATE_WORKAROUND operator()< Head, Dimension >( );
564 next.ELX_TEMPLATE_WORKAROUND operator()< Predicate >( visitor );
570 template<
unsigned int Dimension >
571 struct VisitDimension< NullType, Dimension >
573 template<
class Predicate >
596 template<
typename TLeftTypeList,
typename TRightTypeList >
597 struct DualVisitImpl;
599 template<
typename TLeftTypeList,
typename TRightTypeList >
603 template<
typename Visitor >
604 void operator()( Visitor & visitor )
const
606 DualVisitImpl< TLeftTypeList, TRightTypeList > impl;
607 return impl.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
611 template<
typename Visitor >
612 void operator()(
const Visitor & visitor )
const
614 DualVisitImpl< TLeftTypeList, TRightTypeList > impl;
615 return impl.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
634 template<
typename TLeftTypeList,
typename TRightTypeList >
637 template<
typename Visitor >
638 void operator()( Visitor & visitor )
const
640 typedef typename TLeftTypeList::Tail LeftTail;
642 DualVisitImpl< TLeftTypeList, TRightTypeList > goRight;
643 goRight.visitRHS< Visitor >( visitor );
645 DualVisitImpl< LeftTail, TRightTypeList > goLeft;
646 goLeft.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
650 template<
typename Visitor >
651 void operator()(
const Visitor & visitor )
const
653 typedef typename TLeftTypeList::Tail LeftTail;
655 DualVisitImpl< TLeftTypeList, TRightTypeList > goRight;
656 goRight.visitRHS< Visitor >( visitor );
658 DualVisitImpl< LeftTail, TRightTypeList > goLeft;
659 goLeft.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
663 template<
typename Visitor >
664 void visitRHS( Visitor & visitor )
const
666 typedef typename TLeftTypeList::Head LeftHead;
667 typedef typename TRightTypeList::Head RightHead;
668 typedef typename TRightTypeList::Tail RightTail;
670 visitor.ELX_TEMPLATE_WORKAROUND operator()< LeftHead, RightHead >( );
672 DualVisitImpl< TLeftTypeList, RightTail > goRight;
673 goRight.ELX_TEMPLATE_WORKAROUND visitRHS< Visitor >( visitor );
677 template<
typename Visitor >
678 void visitRHS(
const Visitor & visitor )
const
680 typedef typename TLeftTypeList::Head LeftHead;
681 typedef typename TRightTypeList::Head RightHead;
682 typedef typename TRightTypeList::Tail RightTail;
684 visitor.ELX_TEMPLATE_WORKAROUND operator()< LeftHead, RightHead >( );
686 DualVisitImpl< TLeftTypeList, RightTail > goRight;
687 goRight.ELX_TEMPLATE_WORKAROUND visitRHS< Visitor >( visitor );
693 template<
typename TRightTypeList >
694 struct DualVisitImpl<
typelist::NullType, TRightTypeList >
696 template<
typename Visitor >
697 void operator()(
const Visitor & )
const
700 template<
typename TLeftTypeList >
701 struct DualVisitImpl< TLeftTypeList,
typelist::NullType >
703 template<
typename Visitor >
704 void operator()(
const Visitor & )
const
707 template<
typename Visitor >
708 void visitRHS(
const Visitor & )
const {}
712 struct DualVisitImpl<
typelist::NullType, typelist::NullType >
714 template<
typename Visitor >
715 void operator()(
const Visitor & )
const
739 template<
typename TLeftTypeList,
typename TRightTypeList,
unsigned int Dimension >
740 struct DualVisitDimensionImpl;
742 template<
typename TLeftTypeList,
typename TRightTypeList,
unsigned int Dimension >
743 struct DualVisitDimension
746 template<
typename Visitor >
747 void operator()( Visitor & visitor )
const
749 DualVisitDimensionImpl< TLeftTypeList, TRightTypeList, Dimension > impl;
750 return impl.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
754 template<
typename Visitor >
755 void operator()(
const Visitor & visitor )
const
757 DualVisitDimensionImpl< TLeftTypeList, TRightTypeList, Dimension > impl;
758 return impl.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
777 template<
typename TLeftTypeList,
typename TRightTypeList,
unsigned int Dimension >
778 struct DualVisitDimensionImpl
780 template<
typename Visitor >
781 void operator()( Visitor & visitor )
const
783 typedef typename TLeftTypeList::Tail LeftTail;
785 DualVisitDimensionImpl< TLeftTypeList, TRightTypeList, Dimension > goRight;
786 goRight.visitRHS< Visitor >( visitor );
788 DualVisitDimensionImpl< LeftTail, TRightTypeList, Dimension > goLeft;
789 goLeft.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
793 template<
typename Visitor >
794 void operator()(
const Visitor & visitor )
const
796 typedef typename TLeftTypeList::Tail LeftTail;
798 DualVisitDimensionImpl< TLeftTypeList, TRightTypeList, Dimension > goRight;
799 goRight.visitRHS< Visitor >( visitor );
801 DualVisitDimensionImpl< LeftTail, TRightTypeList, Dimension > goLeft;
802 goLeft.ELX_TEMPLATE_WORKAROUND operator()< Visitor >( visitor );
806 template<
typename Visitor >
807 void visitRHS( Visitor & visitor )
const
809 typedef typename TLeftTypeList::Head LeftHead;
810 typedef typename TRightTypeList::Head RightHead;
811 typedef typename TRightTypeList::Tail RightTail;
813 visitor.ELX_TEMPLATE_WORKAROUND operator()< LeftHead, RightHead, Dimension >( );
815 DualVisitDimensionImpl< TLeftTypeList, RightTail, Dimension > goRight;
816 goRight.ELX_TEMPLATE_WORKAROUND visitRHS< Visitor >( visitor );
820 template<
typename Visitor >
821 void visitRHS(
const Visitor & visitor )
const
823 typedef typename TLeftTypeList::Head LeftHead;
824 typedef typename TRightTypeList::Head RightHead;
825 typedef typename TRightTypeList::Tail RightTail;
827 visitor.ELX_TEMPLATE_WORKAROUND operator()< LeftHead, RightHead, Dimension >( );
829 DualVisitDimensionImpl< TLeftTypeList, RightTail, Dimension > goRight;
830 goRight.ELX_TEMPLATE_WORKAROUND visitRHS< Visitor >( visitor );
836 template<
typename TRightTypeList,
unsigned int Dimension >
837 struct DualVisitDimensionImpl<
typelist::NullType, TRightTypeList, Dimension >
839 template<
typename Visitor >
840 void operator()(
const Visitor & )
const
843 template<
typename TLeftTypeList,
unsigned int Dimension >
844 struct DualVisitDimensionImpl< TLeftTypeList,
typelist::NullType, Dimension >
846 template<
typename Visitor >
847 void operator()(
const Visitor & )
const
850 template<
typename Visitor >
851 void visitRHS(
const Visitor & )
const {}
854 template<
unsigned int Dimension >
855 struct DualVisitDimensionImpl<
typelist::NullType, typelist::NullType, Dimension >
857 template<
typename Visitor >
858 void operator()(
const Visitor & )
const
Runs a templated predicate on each type in the list with dimension provided as template parameter.
void operator()(Predicate &visitor)
void operator()(const Predicate &visitor)