realroot_doc 0.1.1
|
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