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 }
00080 #endif