realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/texp_issubsetof.hpp
Go to the documentation of this file.
00001 #ifndef realroot_ARITHM_TRAITS_ISSUBSETOF_H
00002 #define realroot_ARITHM_TRAITS_ISSUBSETOF_H
00003 
00004 #include <realroot/texp_kernelof.hpp>
00005 
00006 namespace mmx {
00007 
00008 namespace texp {
00009   template<typename X, typename Y> 
00010   struct issubsetof_  { typedef texp::false_t T; };
00011   
00013   template<class K, class X, class Y>
00014   struct kernel_issubsetof { typedef false_t T; };
00015   template<class X, class Y>
00016   struct kernel_issubsetof<null_t,X,Y> { typedef null_t T; };
00017   
00018   template<class K>
00019   struct kernel_issubsetof< K, typename K::integer, algebraic<K>  > { typedef true_t T; };
00020   template<class K> 
00021   struct kernel_issubsetof< K, typename K::integer, typename K::rational > { typedef true_t T; };
00023   template<class K> 
00024   struct kernel_issubsetof< K, typename K::integer, typename K::floating > { typedef true_t T; };
00025   template<class K>
00026   struct kernel_issubsetof< K, double, typename K::floating > { typedef true_t T; };
00027   template<class K>
00028   struct kernel_issubsetof< K, typename K::integer, double > { typedef true_t T; };
00029   template<class K>
00030   struct kernel_issubsetof< K, typename K::floating, typename K::rational > { typedef true_t T; };
00031   template<typename Y>
00032   struct issubsetof_<int,Y>
00033   {
00034     typedef texp::true_t T;
00035   };
00036   
00037   template< template<class> class R, class X, class Y> 
00038   struct issubsetof_< R<X>, R<Y> >
00039   { typedef typename issubsetof_<X,Y>::T T; };
00040   
00041 
00046   template<typename X, typename Y>
00047   struct issubsetof
00048   {
00049     typedef typename ucstref < X>::T UX; typedef typename ucstref < Y>::T UY;
00050     typedef typename kernelof<UX>::T KX; typedef typename kernelof<UY>::T KY;
00051     typedef typename 
00052     sfirstnn<
00053       typename equal<UX,UY>::T,
00054       typename issubsetof_<UX,UY>::T,
00055       typename kernel_issubsetof<typename kernelof<UX>::T,UX,UY>::T,
00056       typename kernel_issubsetof<typename kernelof<UY>::T,UX,UY>::T >::T T;
00057   };
00058 
00059   template<typename X, typename TypeOrListOfTypes > struct issupersetof;
00060   template<typename X, typename Type>
00061   struct issupersetof { 
00062     typedef typename issubsetof<Type,X>::T T; 
00063   };
00064   
00065   template<typename X, typename A>
00066   struct issupersetof< X, texp::tlist<A,texp::null_t> >
00067   { 
00068     typedef typename issupersetof<X,A>::T T; 
00069   };
00070   
00071   template<typename X, typename A, typename Tail>
00072   struct issupersetof< X, texp::tlist<A,Tail> >
00073   {
00074     typedef typename issubsetof<A,X>::T                                                        ok;
00075     typedef typename tselect<ok, typename issupersetof<X,Tail>::T, texp::false_t >::T T;
00076   };
00077   
00078 }
00079 }// end namespace mmx
00080 #endif