diff --git a/dune/stuff/common/float_cmp.hh b/dune/stuff/common/float_cmp.hh index b6b1b8b98dec662473b68d218208a5c18b204592..8deaaeccb17d582e843bdd29dd21615d49abb7dd 100644 --- a/dune/stuff/common/float_cmp.hh +++ b/dune/stuff/common/float_cmp.hh @@ -11,33 +11,56 @@ #include <dune/stuff/la/container/eigen.hh> #endif +#include <type_traits> + namespace Dune { namespace Stuff { namespace Common { namespace FloatCmp { +template <class T, Dune::FloatCmp::CmpStyle style = Dune::FloatCmp::defaultCmpStyle> +typename std::enable_if<std::is_arithmetic<T>::value, bool>::type +ne(const T& first, const T& second, + typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) +{ + return Dune::FloatCmp::ne<T, style>(first, second, epsilon); +} + +template <class T, Dune::FloatCmp::CmpStyle style = Dune::FloatCmp::defaultCmpStyle> +typename std::enable_if<std::is_arithmetic<T>::value, bool>::type +eq(const T& first, const T& second, + typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) +{ + return Dune::FloatCmp::eq<T, style>(first, second, epsilon); +} + +template <class T, template <class> class FirstVectorType, template <class> class SecondVectorType = FirstVectorType, + Dune::FloatCmp::CmpStyle style = Dune::FloatCmp::defaultCmpStyle> +bool ne(const FirstVectorType<T>& first, const SecondVectorType<T>& second, + typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) +{ + return !eq(first, second, epsilon); +} template <class T, Dune::FloatCmp::CmpStyle style = Dune::FloatCmp::defaultCmpStyle> bool eq(const Dune::DynamicVector<T>& first, const Dune::DynamicVector<T>& second, typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) { assert(first.size() == second.size()); - bool result = true; for (size_t ii = 0; ii < first.size(); ++ii) - if (!Dune::FloatCmp::eq<T, style>(first[ii], second[ii], epsilon)) - result = false; - return result; + if (Dune::FloatCmp::ne<T, style>(first[ii], second[ii], epsilon)) + return false; + return true; } // ... eq(...) template <class T, int size, Dune::FloatCmp::CmpStyle style = Dune::FloatCmp::defaultCmpStyle> bool eq(const Dune::FieldVector<T, size>& first, const Dune::FieldVector<T, size>& second, typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) { - bool result = true; for (size_t ii = 0; ii < size; ++ii) - if (!Dune::FloatCmp::eq<T, style>(first[ii], second[ii], epsilon)) - result = false; - return result; + if (Dune::FloatCmp::ne<T, style>(first[ii], second[ii], epsilon)) + return false; + return true; } // ... eq(...) #if HAVE_EIGEN @@ -46,11 +69,10 @@ bool eq(const Dune::Stuff::LA::EigenDenseVector<T>& first, const Dune::Stuff::LA typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) { assert(first.size() == second.size()); - bool result = true; for (size_t ii = 0; ii < first.size(); ++ii) if (!Dune::FloatCmp::eq<T, style>(first.backend()[ii], second.backend()[ii], epsilon)) - result = false; - return result; + return false; + return true; } // ... eq(...) template <class T, Dune::FloatCmp::CmpStyle style = Dune::FloatCmp::defaultCmpStyle> @@ -58,11 +80,10 @@ bool eq(const Dune::DynamicVector<T>& first, const Dune::Stuff::LA::EigenDenseVe typename Dune::FloatCmp::EpsilonType<T>::Type epsilon = Dune::FloatCmp::DefaultEpsilon<T, style>::value()) { assert(first.size() == second.size()); - bool result = true; for (size_t ii = 0; ii < first.size(); ++ii) if (!Dune::FloatCmp::eq<T, style>(first[ii], second.backend()[ii], epsilon)) - result = false; - return result; + return false; + return true; } // ... eq(...) #endif // HAVE_EIGEN