realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/texp_list.hpp
Go to the documentation of this file.
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