62#ifndef ELX_TEMPLATE_WORKAROUND
65# define ELX_TEMPLATE_WORKAROUND
67# define ELX_TEMPLATE_WORKAROUND template
70# define ELX_TEMPLATE_WORKAROUND template
87template<
typename H,
typename T >
116typename T1 = NullType,
typename T2 = NullType,
typename T3 = NullType,
117typename T4 = NullType,
typename T5 = NullType,
typename T6 = NullType,
118typename T7 = NullType,
typename T8 = NullType,
typename T9 = NullType,
119typename T10 = NullType,
typename T11 = NullType,
typename T12 = NullType,
120typename T13 = NullType,
typename T14 = NullType,
typename T15 = NullType,
121typename T16 = NullType,
typename T17 = NullType,
typename T18 = NullType,
122typename T19 = NullType,
typename T20 = NullType,
typename T21 = NullType,
123typename T22 = NullType,
typename T23 = NullType,
typename T24 = NullType
129 typedef typename MakeTypeList
143 typedef TypeList< T1, TailType > Type;
146struct MakeTypeList< >
148 typedef NullType Type;
151template<
typename TTypeList >
165template<
typename H,
typename T >
166struct Length< TypeList< H, T > >
168 enum { Type = 1 + Length< T >::Type };
173struct Length< NullType >
193template<
class TTypeList,
unsigned int index >
196template<
class Head,
class Tail >
197struct TypeAt< TypeList< Head, Tail >, 0 >
202template<
class Head,
class Tail,
unsigned int i >
203struct TypeAt< TypeList< Head, Tail >, i >
205 typedef typename TypeAt< Tail, i - 1 >::Type Type;
208template<
unsigned int i >
209struct TypeAt< NullType, i >
211 typedef NullType Type;
214template<
class TTypeList1,
class TTypeList2 >
237template<
class Head,
class Tail,
class T >
238struct Append< TypeList< Head, Tail >, T >
240 typedef TypeList< Head, typename Append< Tail, T >::Type > Type;
245struct Append< NullType, NullType >
247 typedef NullType Type;
250struct Append< NullType, T >
252 typedef TypeList< T, NullType > Type;
255struct Append< T, NullType >
257 typedef TypeList< T, NullType > Type;
259template<
class Head,
class Tail >
260struct Append< NullType, TypeList< Head, Tail > >
262 typedef TypeList< Head, Tail > Type;
264template<
class Head,
class Tail >
265struct Append< TypeList< Head, Tail >, NullType >
267 typedef TypeList< Head, Tail > Type;
273template<
class TList,
class T >
277struct Erase< NullType, T >
279 typedef NullType Type;
282template<
class T,
class Tail >
283struct Erase< TypeList< T, Tail >, T >
288template<
class Head,
class Tail,
class T >
289struct Erase< TypeList< Head, Tail >, T >
291 typedef TypeList< Head, typename Erase< Tail, T >::Type > Type;
297template<
class TList,
class T >
300struct EraseAll< NullType, T >
302 typedef NullType Type;
304template<
class T,
class Tail >
305struct EraseAll< TypeList< T, Tail >, T >
307 typedef typename EraseAll< Tail, T >::Type Type;
309template<
class Head,
class Tail,
class T >
310struct EraseAll< TypeList< Head, Tail >, T >
312 typedef TypeList< Head, typename EraseAll< Tail, T >::Type > Type;
318template<
class TList >
322struct NoDuplicates< NullType >
324 typedef NullType Type;
327template<
class Head,
class Tail >
328struct 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;
343template<
class TList,
class T,
class U >
346template<
class T,
class U >
347struct Replace< NullType, T, U >
349 typedef NullType Type;
352template<
class T,
class Tail,
class U >
353struct Replace< TypeList< T, Tail >, T, U >
355 typedef TypeList< U, Tail > Type;
358template<
class Head,
class Tail,
class T,
class U >
359struct Replace< TypeList< Head, Tail >, T, U >
361 typedef TypeList< Head, typename Replace< Tail, T, U >::Type > Type;
367template<
class TList,
class T,
class U >
370template<
class T,
class U >
371struct ReplaceAll< NullType, T, U >
373 typedef NullType Type;
376template<
class T,
class Tail,
class U >
377struct ReplaceAll< TypeList< T, Tail >, T, U >
379 typedef TypeList< U, typename ReplaceAll< Tail, T, U >::Type > Type;
382template<
class Head,
class Tail,
class T,
class U >
383struct ReplaceAll< TypeList< Head, Tail >, T, U >
385 typedef TypeList< Head, typename ReplaceAll< Tail, T, U >::Type > Type;
391template<
class TList >
395struct Reverse< NullType >
397 typedef NullType Type;
400template<
class Head,
class Tail >
401struct Reverse< TypeList< Head, Tail > >
403 typedef typename Append< typename Reverse< Tail >::Type, Head >::Type Type;
420template<
class TTypeList,
class TType >
422template<
class TType >
423struct IndexOf< NullType, TType >
427template<
class TType,
class TTail >
428struct IndexOf< TypeList< TType, TTail >, TType >
432template<
class Head,
class TTail,
class TType >
433struct IndexOf< TypeList< Head, TTail >, TType >
437 enum { temp = IndexOf< TTail, TType >::Type };
441 enum { Type = ( temp == -1 ? -1 : 1 + temp ) };
456template<
class TTypeList,
class TType >
458template<
class TType >
459struct HasType< NullType, TType >
461 enum { Type =
false };
463template<
class TType,
class TTail >
464struct HasType< TypeList< TType, TTail >, TType >
466 enum { Type =
true };
468template<
class Head,
class TTail,
class TType >
469struct HasType< TypeList< Head, TTail >, TType >
471 enum { Type = HasType< TTail, TType >::Type };
492template<
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 );
520struct Visit< NullType >
522 template<
class Predicate >
523 void operator()(
const Predicate & )
543template<
class TTypeList,
unsigned int Dimension >
546 template<
class Predicate >
547 void operator()( Predicate & visitor )
549 typedef typename TTypeList::Head Head;
550 typedef typename TTypeList::Tail Tail;
551 visitor.ELX_TEMPLATE_WORKAROUND operator()< Head, Dimension >( );
552 VisitDimension< Tail, Dimension > next;
553 next.ELX_TEMPLATE_WORKAROUND operator()< Predicate >( visitor );
557 template<
class Predicate >
558 void operator()(
const Predicate & visitor )
560 typedef typename TTypeList::Head Head;
561 typedef typename TTypeList::Tail Tail;
562 visitor.ELX_TEMPLATE_WORKAROUND operator()< Head, Dimension >( );
563 VisitDimension< Tail, Dimension > next;
564 next.ELX_TEMPLATE_WORKAROUND operator()< Predicate >( visitor );
570template<
unsigned int Dimension >
571struct VisitDimension< NullType, Dimension >
573 template<
class Predicate >
574 void operator()(
const Predicate & )
596template<
typename TLeftTypeList,
typename TRightTypeList >
599template<
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 );
634template<
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 );
693template<
typename TRightTypeList >
694struct DualVisitImpl< typelist::NullType, TRightTypeList >
696 template<
typename Visitor >
697 void operator()(
const Visitor & )
const
700template<
typename TLeftTypeList >
701struct DualVisitImpl< TLeftTypeList, typelist::NullType >
703 template<
typename Visitor >
704 void operator()(
const Visitor & )
const
707 template<
typename Visitor >
708 void visitRHS(
const Visitor & )
const {}
712struct DualVisitImpl< typelist::NullType, typelist::NullType >
714 template<
typename Visitor >
715 void operator()(
const Visitor & )
const
739template<
typename TLeftTypeList,
typename TRightTypeList,
unsigned int Dimension >
740struct DualVisitDimensionImpl;
742template<
typename TLeftTypeList,
typename TRightTypeList,
unsigned int Dimension >
743struct 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 );
777template<
typename TLeftTypeList,
typename TRightTypeList,
unsigned int Dimension >
778struct 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 );
836template<
typename TRightTypeList,
unsigned int Dimension >
837struct DualVisitDimensionImpl< typelist::NullType, TRightTypeList, Dimension >
839 template<
typename Visitor >
840 void operator()(
const Visitor & )
const
843template<
typename TLeftTypeList,
unsigned int Dimension >
844struct 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 {}
854template<
unsigned int Dimension >
855struct DualVisitDimensionImpl< typelist::NullType, typelist::NullType, Dimension >
857 template<
typename Visitor >
858 void operator()(
const Visitor & )
const