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
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 };
00102
00103 }
00104
00105 #endif