| 2061 | namespace Detail { |
| 2062 | |
| 2063 | class Approx { |
| 2064 | private: |
| 2065 | bool equalityComparisonImpl(double other) const; |
| 2066 | |
| 2067 | public: |
| 2068 | explicit Approx ( double value ); |
| 2069 | |
| 2070 | static Approx custom(); |
| 2071 | |
| 2072 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2073 | Approx operator()( T const& value ) { |
| 2074 | Approx approx( static_cast<double>(value) ); |
| 2075 | approx.epsilon( m_epsilon ); |
| 2076 | approx.margin( m_margin ); |
| 2077 | approx.scale( m_scale ); |
| 2078 | return approx; |
| 2079 | } |
| 2080 | |
| 2081 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2082 | explicit Approx( T const& value ): Approx(static_cast<double>(value)) |
| 2083 | {} |
| 2084 | |
| 2085 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2086 | friend bool operator == ( const T& lhs, Approx const& rhs ) { |
| 2087 | auto lhs_v = static_cast<double>(lhs); |
| 2088 | return rhs.equalityComparisonImpl(lhs_v); |
| 2089 | } |
| 2090 | |
| 2091 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2092 | friend bool operator == ( Approx const& lhs, const T& rhs ) { |
| 2093 | return operator==( rhs, lhs ); |
| 2094 | } |
| 2095 | |
| 2096 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2097 | friend bool operator != ( T const& lhs, Approx const& rhs ) { |
| 2098 | return !operator==( lhs, rhs ); |
| 2099 | } |
| 2100 | |
| 2101 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2102 | friend bool operator != ( Approx const& lhs, T const& rhs ) { |
| 2103 | return !operator==( rhs, lhs ); |
| 2104 | } |
| 2105 | |
| 2106 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2107 | friend bool operator <= ( T const& lhs, Approx const& rhs ) { |
| 2108 | return static_cast<double>(lhs) < rhs.m_value || lhs == rhs; |
| 2109 | } |
| 2110 | |
| 2111 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2112 | friend bool operator <= ( Approx const& lhs, T const& rhs ) { |
| 2113 | return lhs.m_value < static_cast<double>(rhs) || lhs == rhs; |
| 2114 | } |
| 2115 | |
| 2116 | template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
| 2117 | friend bool operator >= ( T const& lhs, Approx const& rhs ) { |
| 2118 | return static_cast<double>(lhs) > rhs.m_value || lhs == rhs; |
| 2119 | } |
| 2120 |
no test coverage detected