00001
00002
00003 #ifndef DUNE_COMMON_FLOAT_CMP_HH
00004 #define DUNE_COMMON_FLOAT_CMP_HH
00005
00094
00095 namespace Dune {
00098 namespace FloatCmp {
00099
00102 enum CmpStyle {
00104 relativeWeak,
00106 relativeStrong,
00108 absolute,
00110 defaultCmpStyle = relativeWeak
00111 };
00114 enum RoundingStyle {
00116 towardZero,
00118 towardInf,
00120 downward,
00122 upward,
00124 defaultRoundingStyle = towardZero
00125 };
00126
00127 template<class T> struct EpsilonType;
00128
00130
00135 template<class T, CmpStyle style = defaultCmpStyle>
00136 struct DefaultEpsilon {
00138 static typename EpsilonType<T>::Type value();
00139 };
00140
00141
00142
00145
00147
00154 template <class T, CmpStyle style >
00155 bool eq(const T &first,
00156 const T &second,
00157 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00159
00167 template <class T, CmpStyle style >
00168 bool ne(const T &first,
00169 const T &second,
00170 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00172
00183 template <class T, CmpStyle style >
00184 bool gt(const T &first,
00185 const T &second,
00186 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00188
00199 template <class T, CmpStyle style >
00200 bool lt(const T &first,
00201 const T &second,
00202 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00204
00215 template <class T, CmpStyle style >
00216 bool ge(const T &first,
00217 const T &second,
00218 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00220
00231 template <class T, CmpStyle style >
00232 bool le(const T &first,
00233 const T &second,
00234 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00235
00236
00238
00251 template<class I, class T, CmpStyle cstyle , RoundingStyle rstyle >
00252 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00253
00255
00268 template<class I, class T, CmpStyle cstyle , RoundingStyle rstyle >
00269 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00270
00272
00273 }
00274
00275
00276
00278
00284 template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
00285 FloatCmp::RoundingStyle rstyle_ = FloatCmp::defaultRoundingStyle>
00286 class FloatCmpOps {
00287 typedef FloatCmp::CmpStyle CmpStyle;
00288 typedef FloatCmp::RoundingStyle RoundingStyle;
00289
00290 public:
00291
00293 static const CmpStyle cstyle = cstyle_;
00295 static const RoundingStyle rstyle = rstyle_;
00297 typedef T ValueType;
00299
00302 typedef typename FloatCmp::EpsilonType<T>::Type EpsilonType;
00303
00304 private:
00305 EpsilonType epsilon_;
00306
00307 typedef FloatCmp::DefaultEpsilon<EpsilonType, cstyle> DefaultEpsilon;
00308
00309 public:
00311
00314 FloatCmpOps(EpsilonType epsilon = DefaultEpsilon::value());
00315
00317 EpsilonType epsilon() const;
00319 void epsilon(EpsilonType epsilon__);
00320
00322 bool eq(const ValueType &first, const ValueType &second) const;
00324
00327 bool ne(const ValueType &first, const ValueType &second) const;
00329
00333 bool gt(const ValueType &first, const ValueType &second) const;
00335
00339 bool lt(const ValueType &first, const ValueType &second) const;
00341
00345 bool ge(const ValueType &first, const ValueType &second) const;
00347
00351 bool le(const ValueType &first, const ValueType &second) const;
00352
00354
00363 template<class I>
00364 I round(const ValueType &val) const;
00365
00367
00376 template<class I>
00377 I trunc(const ValueType &val) const;
00378
00379 };
00380
00381 }
00382
00383 #include "float_cmp.cc"
00384
00385 #endif //DUNE_COMMON_FLOAT_CMP_HH