00001 #ifndef realroot_interval_glue_hpp
00002 #define realroot_interval_glue_hpp
00003
00004 #include <basix/list.hpp>
00005 #include <numerix/interval.hpp>
00006
00007 #define FORALL(X) template<class X>
00008 #define Interval interval<C>
00009
00010 namespace mmx
00011 {
00012 FORALL(C) inline mmx::nat hash(const Interval& p){ return 1;}
00013
00014
00015
00016
00017 FORALL(C) syntactic flatten(const Interval & x)
00018 {
00019 return flatten(cons(as<generic>(lower(x)), list<generic>(as<generic>(upper(x)))));
00020 }
00021
00022
00023 FORALL(C) Interval
00024 interval_from_pair (const C& a, const C& b)
00025 {
00026 return Interval(a,b);
00027 }
00028
00029 FORALL(C) inline C interval_lower (const Interval& I) {return lower(I);}
00030 FORALL(C) inline C interval_upper (const Interval& I) {return upper(I);}
00031
00032
00033 template<typename T, typename F>
00034 struct as_helper< interval<T>,interval<F> >
00035 {
00036 static inline
00037 interval<T> cv (const interval<F>& x)
00038 {
00039 return interval<T>(as<T>(lower(x)),as<T>(upper(x)));
00040 }
00041 };
00042
00043
00044 FORALL(C) Interval operator+( const Interval& I, const C& c)
00045 {
00046 return I+ Interval(c,c);
00047 }
00048 FORALL(C) Interval operator+( const C& c, const Interval& I)
00049 {
00050 return Interval(c,c)+I;
00051 }
00052
00053 FORALL(C) Interval operator-( const Interval& I, const C& c)
00054 {
00055 return I- Interval(c,c);
00056 }
00057 FORALL(C) Interval operator-( const C& c, const Interval& I)
00058 {
00059 return Interval(c,c)-I;
00060 }
00061
00062 FORALL(C) Interval operator*( const Interval& I, const C& c)
00063 {
00064 return I* Interval(c,c);
00065 }
00066 FORALL(C) Interval operator*( const C& c, const Interval& I)
00067 {
00068 return Interval(c,c)*I;
00069 }
00070
00071
00072 FORALL(C) C interval_size (const Interval& p)
00073 {
00074 return upper(p)-lower(p);
00075 }
00076
00077 }
00078
00079 #undef Interval
00080 #undef FORALL
00081
00082 #endif //realroot_interval_glue_hpp