1 /*
2  *  Created by Martin on 07/11/2017.
3  *
4  * Distributed under the Boost Software License, Version 1.0. (See accompanying
5  * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  */
7 #ifndef TWOBLUECUBES_CATCH_MATCHERS_FLOATING_H_INCLUDED
8 #define TWOBLUECUBES_CATCH_MATCHERS_FLOATING_H_INCLUDED
9 
10 #include "catch_matchers.h"
11 
12 #include <type_traits>
13 #include <cmath>
14 
15 namespace Catch {
16 namespace Matchers {
17 
18     namespace Floating {
19 
20         enum class FloatingPointKind : uint8_t;
21 
22         struct WithinAbsMatcher : MatcherBase<double> {
23             WithinAbsMatcher(double target, double margin);
24             bool match(double const& matchee) const override;
25             std::string describe() const override;
26         private:
27             double m_target;
28             double m_margin;
29         };
30 
31         struct WithinUlpsMatcher : MatcherBase<double> {
32             WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType);
33             bool match(double const& matchee) const override;
34             std::string describe() const override;
35         private:
36             double m_target;
37             int m_ulps;
38             FloatingPointKind m_type;
39         };
40 
41 
42     } // namespace Floating
43 
44     // The following functions create the actual matcher objects.
45     // This allows the types to be inferred
46     Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff);
47     Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff);
48     Floating::WithinAbsMatcher WithinAbs(double target, double margin);
49 
50 } // namespace Matchers
51 } // namespace Catch
52 
53 #endif // TWOBLUECUBES_CATCH_MATCHERS_FLOATING_H_INCLUDED
54