dune-common 2.1.1
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 
00089 
00090 namespace Dune {
00093   namespace FloatCmp {
00094     // basic constants
00097     enum CmpStyle { 
00099       relativeWeak,
00101       relativeStrong,
00103       absolute,
00105       defaultCmpStyle = relativeWeak
00106     };
00109     enum RoundingStyle {
00111       towardZero,
00113       towardInf,
00115       downward,
00117       upward,
00119       defaultRoundingStyle = towardZero
00120     };
00121 
00122     template<class T> struct EpsilonType;
00123 
00125 
00130     template<class T, CmpStyle style = defaultCmpStyle>
00131     struct DefaultEpsilon {
00133       static typename EpsilonType<T>::Type value();
00134     };
00135 
00136     // operations in functional style
00137 
00140 
00142 
00149     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00150     bool eq(const T &first,
00151             const T &second,
00152             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00154 
00162     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00163     bool ne(const T &first,
00164             const T &second,
00165             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00167 
00178     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00179     bool gt(const T &first,
00180             const T &second,
00181             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00183 
00194     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00195     bool lt(const T &first,
00196             const T &second,
00197             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00199 
00210     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00211     bool ge(const T &first,
00212             const T &second,
00213             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00215 
00226     template <class T, CmpStyle style /*= defaultCmpStyle*/>
00227     bool le(const T &first,
00228             const T &second,
00229             typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00230 
00231     // rounding operations
00233 
00246     template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
00247     I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00248     // truncation
00250 
00263     template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
00264     I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00265 
00267     // group FloatCmp
00268   } //namespace FloatCmp
00269 
00270 
00271   // oo interface
00273 
00279   template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
00280            FloatCmp::RoundingStyle rstyle_ = FloatCmp::defaultRoundingStyle>
00281   class FloatCmpOps {
00282     typedef FloatCmp::CmpStyle CmpStyle;
00283     typedef FloatCmp::RoundingStyle RoundingStyle;
00284 
00285   public:
00286     // record template parameters
00288     static const CmpStyle cstyle = cstyle_;
00290     static const RoundingStyle rstyle = rstyle_;
00292     typedef T ValueType;
00294 
00297     typedef typename FloatCmp::EpsilonType<T>::Type EpsilonType;
00298 
00299   private:
00300     EpsilonType epsilon_;
00301 
00302     typedef FloatCmp::DefaultEpsilon<EpsilonType, cstyle> DefaultEpsilon;
00303 
00304   public:
00306 
00309     FloatCmpOps(EpsilonType epsilon = DefaultEpsilon::value());
00310 
00312     EpsilonType epsilon() const;
00314     void epsilon(EpsilonType epsilon__);
00315 
00317     bool eq(const ValueType &first, const ValueType &second) const;
00319 
00322     bool ne(const ValueType &first, const ValueType &second) const;
00324 
00328     bool gt(const ValueType &first, const ValueType &second) const;
00330 
00334     bool lt(const ValueType &first, const ValueType &second) const;
00336 
00340     bool ge(const ValueType &first, const ValueType &second) const;
00342 
00346     bool le(const ValueType &first, const ValueType &second) const;
00347 
00349 
00358     template<class I>
00359     I round(const ValueType &val) const;
00360 
00362 
00371     template<class I>
00372     I trunc(const ValueType &val) const;
00373  
00374   };
00375 
00376 } //namespace Dune
00377 
00378 #include "float_cmp.cc"
00379 
00380 #endif //DUNE_COMMON_FLOAT_CMP_HH