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