realroot_doc 0.1.1
|
00001 #ifndef realroot_BASE_TYPE_LIST_H 00002 #define realroot_BASE_TYPE_LIST_H 00003 00004 namespace mmx { 00005 00006 namespace texp { 00007 00012 00013 template<class A, class B> 00014 struct tlist { typedef A car; typedef B cdr; }; 00015 00019 template< template<class> class TypeFunctor, class TypeList > 00020 struct tmap; 00021 template< template<class> class TypeFunctor, class Head, class Tail> 00022 struct tmap< TypeFunctor, tlist<Head,Tail> > 00023 { 00024 typedef tlist< typename TypeFunctor<Head>::T, 00025 typename tmap< TypeFunctor, Tail >::T > T; 00026 }; 00027 template< template<class> class TypeFunctor, class Head> 00028 struct tmap< TypeFunctor, tlist<Head,null_t> > 00029 { 00030 typedef tlist< typename TypeFunctor<Head>::T, null_t> T; 00031 }; 00032 00034 template 00035 < 00036 typename T1 = null_t, typename T2 = null_t, typename T3 = null_t, 00037 typename T4 = null_t, typename T5 = null_t, typename T6 = null_t, 00038 typename T7 = null_t, typename T8 = null_t, typename T9 = null_t, 00039 typename T10 = null_t, typename T11 = null_t, typename T12 = null_t, 00040 typename T13 = null_t, typename T14 = null_t, typename T15 = null_t, 00041 typename T16 = null_t, typename T17 = null_t, typename T18 = null_t 00042 > 00043 struct gentlist 00044 { 00045 private: 00046 typedef typename gentlist 00047 < 00048 T2 , T3 , T4 , 00049 T5 , T6 , T7 , 00050 T8 , T9 , T10, 00051 T11, T12, T13, 00052 T14, T15, T16, 00053 T17, T18 > 00054 ::T cdr; 00055 typedef T1 car; 00056 public: 00057 typedef tlist<car,cdr> T; 00058 }; 00059 template< typename X> 00060 struct gentlist< X, null_t > 00061 { 00062 typedef tlist<X,null_t> T; 00063 }; 00064 00066 template < typename L > 00067 struct sfirstnnl { typedef L T; }; 00068 template < typename car, typename cdr > 00069 struct sfirstnnl< tlist<car,cdr> > { typedef car T; }; 00070 template < typename cdr > struct sfirstnnl< tlist< null_t, cdr > > 00071 { typedef typename sfirstnnl< cdr >::T T; }; 00072 template <> struct sfirstnnl< tlist<null_t, null_t> > { typedef null_t T; }; 00073 00074 template < 00075 typename T1 = null_t, typename T2 = null_t, typename T3 = null_t, 00076 typename T4 = null_t, typename T5 = null_t, typename T6 = null_t, 00077 typename T7 = null_t, typename T8 = null_t, typename T9 = null_t, 00078 typename T10 = null_t, typename T11 = null_t, typename T12 = null_t, 00079 typename T13 = null_t, typename T14 = null_t, typename T15 = null_t, 00080 typename T16 = null_t, typename T17 = null_t, typename T18 = null_t 00081 > 00082 struct sfirstnn 00083 { 00084 typedef typename gentlist<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>::T L; 00085 typedef typename sfirstnnl<L>::T T; 00086 }; 00087 00088 /* 00089 template<class List> struct reverse; 00090 template<class List, class RList> struct reversal; 00091 template<class List> struct reversal<type::null_t,List> { typedef List T; }; 00092 template<class car, class cdr, class List> 00093 struct reversal< tlist<car,cdr>, List > { typedef typename reversal<cdr, tlist<car,List> >::T T; }; 00094 00095 template<class car, class cdr> 00096 struct reverse< tlist<car,cdr> > 00097 { 00098 typedef typename reversal< cdr , tlist<car,type::null_t> >::T T; 00099 }; 00100 */ 00101 }; 00102 00103 }// end namespace mmx 00104 00105 #endif