dune-common 2.1.1
|
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