Ariles
compare.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2017-2020 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6  (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7 
8  @brief
9 */
10 
11 #pragma once
12 
13 #include "common.h"
14 
15 namespace ariles
16 {
17  namespace compare
18  {
20  {
21  public:
25  bool throw_on_error_; /// @todo DEPRECATED
26  bool nan_equal_;
27  bool inf_equal_;
28  /// @todo continue on failure.
29 
30 
31  public:
33  {
34  setDefaults();
35  }
36 
37 
38  void setDefaults()
39  {
40  double_tolerance_ = 1e-12;
41  float_tolerance_ = 1e-8;
42  compare_number_of_entries_ = false;
43  throw_on_error_ = false;
44 
45  nan_equal_ = true;
46  inf_equal_ = true;
47  }
48 
49 
50  template <typename t_Scalar>
51  t_Scalar getTolerance() const;
52  };
53 
54 
55  class ARILES_VISIBILITY_ATTRIBUTE Visitor : public visitor::Base<compare::Parameters>
56  {
57  public:
59 
60 
61  public:
62  bool equal_;
63 
64 
65  public:
66  template <class t_Left, class t_Right>
67  bool compare(const t_Left &left, const t_Right &right, const Parameters &param)
68  {
69  ariles::apply(*this, left, right, param);
70  return (equal_);
71  }
72 
74 
75  template <class t_Ariles>
76  const Parameters &getParameters(const t_Ariles &ariles_class) const
77  {
78  return (ariles_class.arilesGetParameters(*this));
79  }
80 
81 
82  template <class t_Left, class t_Right>
83  void start(const t_Left &left, const t_Right &right, const std::string &name, const Parameters &param)
84  {
86  equal_ = true;
87  this->operator()(left, right, name, param);
88  }
89 
90 
91  template <typename t_Scalar>
92  static bool compareFloats(const t_Scalar left, const t_Scalar right, const Parameters &param)
93  {
94  if (isNaN(left))
95  {
96  if (isNaN(right))
97  {
98  return (param.nan_equal_);
99  }
100  else
101  {
102  return (false);
103  }
104  }
105 
106  if (isInfinity(left))
107  {
108  if (isInfinity(right))
109  {
110  if (((left > 0) && (right > 0)) || ((left < 0) && (right < 0)))
111  {
112  return (param.inf_equal_);
113  }
114  }
115  return (false);
116  }
117  return (std::abs(left - right)
118  <= ((std::abs(left) < std::abs(right) ? std::abs(right) : std::abs(left))
119  * param.double_tolerance_));
120  }
121 
122 
123  template <class t_Left, class t_Right>
124  void operator()(const t_Left &left, const t_Right &right, const std::string &name, const Parameters &param)
125  {
127  ARILES_TRACE_ENTRY(name);
128  ARILES_TRACE_TYPE(left);
129  ARILES_TRACE_TYPE(right);
130 
131  try
132  {
133  apply_compare(*this, left, right, param);
134  if (false == this->equal_ and true == param.throw_on_error_)
135  {
136  ARILES_THROW("");
137  }
138  }
139  catch (const std::exception &e)
140  {
141  ARILES_THROW("entry: " + name + " // " + std::string(e.what()));
142  }
143  }
144  };
145 
146 
147  template <>
148  inline double Visitor::Parameters::getTolerance<double>() const
149  {
150  return (double_tolerance_);
151  }
152 
153  template <>
154  inline float Visitor::Parameters::getTolerance<float>() const
155  {
156  return (float_tolerance_);
157  }
158 
159 
160 #ifndef ARILES_METHODS_compare
161 # define ARILES_METHODS_compare \
162  const ariles::compare::Visitor::Parameters &arilesGetParameters(const ariles::compare::Visitor &visitor) const \
163  { \
164  ARILES_TRACE_FUNCTION; \
165  return (visitor.getDefaultParameters()); \
166  }
167 #endif
168  } // namespace compare
169 
170 
172 } // namespace ariles
void ARILES_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::Ariles, t_Left))
Definition: basic.h:149
void apply(t_Visitor &visitor, t_Ariles &ariles_class, const std::string &name, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::visitor::Visitor, t_Visitor))
Definition: common.h:96
#define ARILES_TRACE_FUNCTION
Definition: trace.h:118
compare::Parameters Parameters
Definition: compare.h:58
bool compare(const t_Left &left, const t_Right &right, const Parameters &param)
Definition: compare.h:67
compare::Visitor Compare
Definition: compare.h:171
#define ARILES_TRACE_TYPE(entry)
Definition: trace.h:120
static bool compareFloats(const t_Scalar left, const t_Scalar right, const Parameters &param)
Definition: compare.h:92
void operator()(const t_Left &left, const t_Right &right, const std::string &name, const Parameters &param)
Definition: compare.h:124
void start(const t_Left &left, const t_Right &right, const std::string &name, const Parameters &param)
Definition: compare.h:83
const Parameters & getParameters(const t_Ariles &ariles_class) const
Definition: compare.h:76
#define ARILES_VISIBILITY_ATTRIBUTE
Definition: helpers.h:69
#define ARILES_TRACE_ENTRY(entry_name)
Definition: trace.h:119
Definition: basic.h:17