#pragma once /* * NullTypeList */ struct NullTypeList { struct Head { private: Head(); }; struct Tail { private: Tail(); }; }; // Typelist の長さを調べる template struct Length { private: template struct In; template <> struct In { enum { value = 0 }; }; template struct In { private: typedef typename TList::Head Head; typedef typename TList::Tail Tail; public: enum { value = 1 + Length::value }; }; public: enum { value = In::value }; }; // Typelist の指定番号目の要素を取得する template struct TypeAt { typedef typename TList::Head Head; typedef typename TList::Tail Tail; private: template struct In { typedef typename TypeAt::Result Result; }; template<> struct In<0> { typedef Head Result; }; public: typedef typename In::Result Result; }; /* * Typelist */ template struct Typelist { typedef T Head; typedef U Tail; }; /* * Tuple */ template struct Tuple { typedef Tuple< typename T, typename U > TList; typedef typename T Head; typedef typename U Tail; // Tuple の指定番号目の要素を取得する template struct In { typedef typename TypeAt::Result PointType; template struct Phase1 { typedef typename TL::Head Head; typedef typename TL::Tail Tail; template struct Phase2 { static inline PointType Get( const TL &tuple ) { return Phase1::Get( tuple.t ); } static inline void Set( TL *tuple, PointType pt ) { Phase1::Set( &tuple->t, pt ); } }; template<> struct Phase2<0> { static inline PointType Get( const TL &tuple ) { return tuple.h; } static inline void Set( TL *tuple, PointType pt ) { tuple->h = pt; } }; static inline PointType Get( const TL &tuple ) { return Phase2::Get( tuple ); } static inline void Set( TL *tuple, PointType pt ) { Phase2::Set( tuple, pt ); } }; public: static inline PointType Get( const TList &tuple ) { return Phase1::Get( tuple ); } static inline void Set( TList *tuple, PointType set ) { Phase1::Set( tuple, set ); } }; Tuple() {} Tuple( Head _h ) : h(_h) {} Tuple( Head _h, const Tail &_t ) : h(_h), t(_t) {} Tuple( const Tuple &_t ) : h(_t.h), t(_t.t) {} template inline static typename In::PointType Get( const TList &tuple ) { return In::Get( tuple ); } template inline static void Set( TList *tuple, const typename In::PointType &set ) { In::Set( tuple, set ); } Head h; Tail t; }; /* 宣言専用のクラス */ struct TypelistDeclarator { #define CASCADE_CRACKER_WIDGET_DECL( num ) typename T##num struct In0 { typedef TYPELIST_0() Type; }; template< CASCADE_CRACKER_TYPE_B( 1, DECL) > struct In1 { typedef TYPELIST_1( T1) Type; }; template< CASCADE_CRACKER_TYPE_B( 2, DECL) > struct In2 { typedef TYPELIST_2( T1, T2) Type; }; template< CASCADE_CRACKER_TYPE_B( 3, DECL) > struct In3 { typedef TYPELIST_3( T1, T2, T3) Type; }; template< CASCADE_CRACKER_TYPE_B( 4, DECL) > struct In4 { typedef TYPELIST_4( T1, T2, T3, T4) Type; }; template< CASCADE_CRACKER_TYPE_B( 5, DECL) > struct In5 { typedef TYPELIST_5( T1, T2, T3, T4, T5) Type; }; template< CASCADE_CRACKER_TYPE_B( 6, DECL) > struct In6 { typedef TYPELIST_6( T1, T2, T3, T4, T5, T6) Type; }; template< CASCADE_CRACKER_TYPE_B( 7, DECL) > struct In7 { typedef TYPELIST_7( T1, T2, T3, T4, T5, T6, T7) Type; }; template< CASCADE_CRACKER_TYPE_B( 8, DECL) > struct In8 { typedef TYPELIST_8( T1, T2, T3, T4, T5, T6, T7, T8) Type; }; template< CASCADE_CRACKER_TYPE_B( 9, DECL) > struct In9 { typedef TYPELIST_9( T1, T2, T3, T4, T5, T6, T7, T8, T9) Type; }; template< CASCADE_CRACKER_TYPE_B(10, DECL) > struct In10 { typedef TYPELIST_10(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) Type; }; template< CASCADE_CRACKER_TYPE_B(11, DECL) > struct In11 { typedef TYPELIST_11(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) Type; }; template< CASCADE_CRACKER_TYPE_B(12, DECL) > struct In12 { typedef TYPELIST_12(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) Type; }; template< CASCADE_CRACKER_TYPE_B(13, DECL) > struct In13 { typedef TYPELIST_13(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) Type; }; template< CASCADE_CRACKER_TYPE_B(14, DECL) > struct In14 { typedef TYPELIST_14(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) Type; }; template< CASCADE_CRACKER_TYPE_B(15, DECL) > struct In15 { typedef TYPELIST_15(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) Type; }; #undef CASCADE_CRACKER_WIDGET_DECL }; struct TupleDeclarator { #define CASCADE_CRACKER_WIDGET_DECL( num ) typename T##num struct In0 { typedef TUPLE_0() Type; }; template< CASCADE_CRACKER_TYPE_B( 1, DECL) > struct In1 { typedef TUPLE_1( T1) Type; }; template< CASCADE_CRACKER_TYPE_B( 2, DECL) > struct In2 { typedef TUPLE_2( T1, T2) Type; }; template< CASCADE_CRACKER_TYPE_B( 3, DECL) > struct In3 { typedef TUPLE_3( T1, T2, T3) Type; }; template< CASCADE_CRACKER_TYPE_B( 4, DECL) > struct In4 { typedef TUPLE_4( T1, T2, T3, T4) Type; }; template< CASCADE_CRACKER_TYPE_B( 5, DECL) > struct In5 { typedef TUPLE_5( T1, T2, T3, T4, T5) Type; }; template< CASCADE_CRACKER_TYPE_B( 6, DECL) > struct In6 { typedef TUPLE_6( T1, T2, T3, T4, T5, T6) Type; }; template< CASCADE_CRACKER_TYPE_B( 7, DECL) > struct In7 { typedef TUPLE_7( T1, T2, T3, T4, T5, T6, T7) Type; }; template< CASCADE_CRACKER_TYPE_B( 8, DECL) > struct In8 { typedef TUPLE_8( T1, T2, T3, T4, T5, T6, T7, T8) Type; }; template< CASCADE_CRACKER_TYPE_B( 9, DECL) > struct In9 { typedef TUPLE_9( T1, T2, T3, T4, T5, T6, T7, T8, T9) Type; }; template< CASCADE_CRACKER_TYPE_B(10, DECL) > struct In10 { typedef TUPLE_10(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) Type; }; template< CASCADE_CRACKER_TYPE_B(11, DECL) > struct In11 { typedef TUPLE_11(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) Type; }; template< CASCADE_CRACKER_TYPE_B(12, DECL) > struct In12 { typedef TUPLE_12(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) Type; }; template< CASCADE_CRACKER_TYPE_B(13, DECL) > struct In13 { typedef TUPLE_13(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) Type; }; template< CASCADE_CRACKER_TYPE_B(14, DECL) > struct In14 { typedef TUPLE_14(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) Type; }; template< CASCADE_CRACKER_TYPE_B(15, DECL) > struct In15 { typedef TUPLE_15(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) Type; }; #undef CASCADE_CRACKER_WIDGET_DECL };