dune-common  2.2.0
float_cmp.hh
Go to the documentation of this file.
00001 #ifndef DUNE_COMMON_FLOAT_CMP_HH
00002 #define DUNE_COMMON_FLOAT_CMP_HH
00003 
00093 
00094 namespace Dune {
00097   namespace FloatCmp {
00098     // basic constants
00101     enum CmpStyle { 
00103       relativeWeak,
00105       relativeStrong,
00107       absolute,
00109       defaultCmpStyle = relativeWeak
00110     };
00113     enum RoundingStyle {
00115       towardZero,
00117       towardInf,
00119       downward,
00121       upward,
00123       defaultRoundingStyle = towardZero
00124     };
00125 
00126     template<class T> struct EpsilonType;
00127 
00129 
00134     template<class T, CmpStyle style = defaultCmpStyle>
00135     struct DefaultEpsilon {
00137       static typename EpsilonType<T>::Type value();
00138     };
00139 
00140     // operations in functional style
00141 
00144 
00146 
00153     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00154     bool eq(const T &first,
00155             const T &second,
00156             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00158 
00166     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00167     bool ne(const T &first,
00168             const T &second,
00169             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00171 
00182     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00183     bool gt(const T &first,
00184             const T &second,
00185             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00187 
00198     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00199     bool lt(const T &first,
00200             const T &second,
00201             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00203 
00214     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00215     bool ge(const T &first,
00216             const T &second,
00217             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00219 
00230     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00231     bool le(const T &first,
00232             const T &second,
00233             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00234 
00235     // rounding operations
00237 
00250     template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
00251     I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00252     // truncation
00254 
00267     template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
00268     I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00269 
00271     // group FloatCmp
00272   } //namespace FloatCmp
00273 
00274 
00275   // oo interface
00277 
00283   template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
00284            FloatCmp::RoundingStyle rstyle_ = FloatCmp::defaultRoundingStyle>
00285   class FloatCmpOps {
00286     typedef FloatCmp::CmpStyle CmpStyle;
00287     typedef FloatCmp::RoundingStyle RoundingStyle;
00288 
00289   public:
00290     // record template parameters
00292     static const CmpStyle cstyle = cstyle_;
00294     static const RoundingStyle rstyle = rstyle_;
00296     typedef T ValueType;
00298 
00301     typedef typename FloatCmp::EpsilonType<T>::Type EpsilonType;
00302 
00303   private:
00304     EpsilonType epsilon_;
00305 
00306     typedef FloatCmp::DefaultEpsilon<EpsilonType, cstyle> DefaultEpsilon;
00307 
00308   public:
00310 
00313     FloatCmpOps(EpsilonType epsilon = DefaultEpsilon::value());
00314 
00316     EpsilonType epsilon() const;
00318     void epsilon(EpsilonType epsilon__);
00319 
00321     bool eq(const ValueType &first, const ValueType &second) const;
00323 
00326     bool ne(const ValueType &first, const ValueType &second) const;
00328 
00332     bool gt(const ValueType &first, const ValueType &second) const;
00334 
00338     bool lt(const ValueType &first, const ValueType &second) const;
00340 
00344     bool ge(const ValueType &first, const ValueType &second) const;
00346 
00350     bool le(const ValueType &first, const ValueType &second) const;
00351 
00353 
00362     template<class I>
00363     I round(const ValueType &val) const;
00364 
00366 
00375     template<class I>
00376     I trunc(const ValueType &val) const;
00377  
00378   };
00379 
00380 } //namespace Dune
00381 
00382 #include "float_cmp.cc"
00383 
00384 #endif //DUNE_COMMON_FLOAT_CMP_HH