Test.h
Go to the documentation of this file.
1 #ifndef _utl_Test_h_
2 #define _utl_Test_h_
3 
15 #include <utl/Triple.h>
16 #include <boost/format.hpp>
17 #include <boost/tuple/tuple.hpp>
18 #include <boost/tuple/tuple_comparison.hpp>
19 #include <boost/tuple/tuple_io.hpp>
20 #include <cmath>
21 
22 
23 namespace utl {
24 
26  struct IsSpace {
27  bool operator()(const char x) const
28  { return x == ' ' || x == '\r' || x == '\n' || x == '\t'; }
29  };
30 
31 
33  class Equal {
34  public:
35  template<typename T>
36  bool operator()(const T& lhs, const T& rhs) const
37  { return lhs == rhs; }
38 
39  static const char* Name() { return "equal"; }
40  };
41 
42 
44  class Less {
45  public:
46  template<typename T>
47  bool operator()(const T& lhs, const T& rhs) const
48  { return lhs < rhs; }
49 
50  static const char* Name() { return "less"; }
51  };
52 
53 
55  class LessOrEqual {
56  public:
57  template<typename T>
58  bool operator()(const T& lhs, const T& rhs) const
59  { return lhs <= rhs; }
60 
61  static const char* Name() { return "less or equal"; }
62  };
63 
64 
66  class Greater {
67  public:
68  template<typename T>
69  bool operator()(const T& lhs, const T& rhs) const
70  { return lhs > rhs; }
71 
72  static const char* Name() { return "greater"; }
73  };
74 
75 
78  public:
79  template<typename T>
80  bool operator()(const T& lhs, const T& rhs) const
81  { return lhs >= rhs; }
82 
83  static const char* Name() { return "greater or equal"; }
84  };
85 
86 
88 
91  class CloseTo {
92  public:
93  CloseTo(const double eps = 1e-6) : fEpsilon(eps) { }
94 
95  template<typename T>
96  bool operator()(const T& lhs, const T& rhs) const
97  { return IsCloseTo(lhs, rhs); }
98 
99  boost::format Name() const
100  { return boost::format("close (@%g) to") % fEpsilon; }
101 
102  protected:
103  template<typename T>
104  bool IsCloseAbs(const T& lhs, const T& rhs) const
105  { return std::abs(double(lhs) - double(rhs)) < fEpsilon; }
106 
107  bool IsCloseAbs(const utl::Triple& lhs, const utl::Triple& rhs) const
108  { return std::sqrt(TupleDist2(lhs, rhs)) < fEpsilon; }
109 
110  template<typename T>
111  bool IsCloseRel(const T& lhs, const T& rhs) const
112  { return 2*std::abs(double(lhs) - double(rhs)) / (std::abs(double(lhs)) + std::abs(double(rhs))) < fEpsilon; }
113 
114  bool
115  IsCloseRel(const utl::Triple& lhs, const utl::Triple& rhs)
116  const
117  {
118  return (2*sqrt(TupleDist2(lhs, rhs)) /
119  (sqrt(TupleDist2(lhs, utl::Triple(0,0,0))) +
120  sqrt(TupleDist2(rhs, utl::Triple(0,0,0))))) < fEpsilon;
121  }
122 
123  template<typename T>
124  bool
125  IsCloseTo(const T& lhs, const T& rhs)
126  const
127  {
128  if (IsCloseAbs(lhs, rhs))
129  return true;
130  else
131  return IsCloseRel(lhs, rhs);
132  }
133 
134  // tuple distance
135  template<typename Head, typename Tail>
136  static
137  double
138  TupleDist2(const boost::tuples::cons<Head, Tail>& lhs,
139  const boost::tuples::cons<Head, Tail>& rhs)
140  {
141  const double t = lhs.get_head() - rhs.get_head();
142  return t*t + TupleDist2(lhs.get_tail(), rhs.get_tail());
143  }
144 
145  static double TupleDist2(const boost::tuples::null_type& /*lhs*/,
146  const boost::tuples::null_type& /*rhs*/)
147  { return 0; }
148 
149  double fEpsilon;
150  };
151 
152 
153  class CloseAbs : public CloseTo {
154  public:
155  CloseAbs(const double eps = 1e-6) : CloseTo(eps) { }
156 
157  template<typename T>
158  bool operator()(const T& lhs, const T& rhs) const
159  { return IsCloseAbs(lhs, rhs); }
160 
161  boost::format Name() const
162  { return boost::format("absolutely close (@%g) to") % fEpsilon; }
163  };
164 
165 
166  class CloseRel : public CloseTo {
167  public:
168  CloseRel(const double eps = 1e-6) : CloseTo(eps) { }
169 
170  template<typename T>
171  bool operator()(const T& lhs, const T& rhs) const
172  { return IsCloseRel(lhs, rhs); }
173 
174  boost::format Name() const
175  { return boost::format("relatively close (@%g) to") % fEpsilon; }
176  };
177 
178 
179  template<typename Predicate>
180  class Not : public Predicate {
181  public:
182  Not() : Predicate() { }
183 
184  Not(const double eps) : Predicate(eps) { }
185 
186  template<typename T>
187  bool operator()(const T& x) const
188  { return !Predicate::operator()(x); }
189 
190  template<typename T, typename U>
191  bool operator()(const T& x, const U& y) const
192  { return !Predicate::operator()(x, y); }
193 
194  template<typename T, typename U, typename W>
195  bool operator()(const T& x, const U& y, const W& z) const
196  { return !Predicate::operator()(x, y, z); }
197 
198  static boost::format Name()
199  { return boost::format("not-%s") % Predicate().Name(); }
200  };
201 
202 
203  inline
205  Diff(const utl::Triple& lhs, const utl::Triple& rhs)
206  {
207  return utl::Triple(lhs.get<0>() - rhs.get<0>(),
208  lhs.get<1>() - rhs.get<1>(),
209  lhs.get<2>() - rhs.get<2>());
210  }
211 
212 
214 
219  template<class Predicate, typename T>
220  inline bool Test(const Predicate& pred, const T& lhs, const T& rhs)
221  { return pred(lhs, rhs); }
222 
223 
225  template<class Predicate, typename T>
226  inline bool Test(const T& lhs, const T& rhs)
227  { return Test(Predicate(), lhs, rhs); }
228 
229 
231  template<class Predicate, typename T, typename U>
232  inline bool Test(const T& lhs, const T& rhs, const U& eps)
233  { return Test(Predicate(eps), lhs, rhs); }
234 
235 }
236 
237 
238 #endif
bool IsCloseRel(const T &lhs, const T &rhs) const
Definition: Test.h:111
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:36
bool IsCloseAbs(const utl::Triple &lhs, const utl::Triple &rhs) const
Definition: Test.h:107
bool operator()(const T &x, const U &y, const W &z) const
Definition: Test.h:195
boost::format Name() const
Definition: Test.h:161
boost::format Name() const
Definition: Test.h:174
CloseAbs(const double eps=1e-6)
Definition: Test.h:155
bool IsCloseAbs(const T &lhs, const T &rhs) const
Definition: Test.h:104
bool operator()(const char x) const
Definition: Test.h:27
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:158
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:58
static boost::format Name()
Definition: Test.h:198
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:47
static const char * Name()
Definition: Test.h:50
#define U
double fEpsilon
Definition: Test.h:149
Predicate used in STL for searching for whitespace.
Definition: Test.h:26
Predicate for equality.
Definition: Test.h:33
Definition: Test.h:180
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
Definition: Triple.h:15
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:171
static const char * Name()
Definition: Test.h:83
static const char * Name()
Definition: Test.h:61
double abs(const SVector< n, T > &v)
static const char * Name()
Definition: Test.h:72
double eps
static const char * Name()
Definition: Test.h:39
bool operator()(const T &x) const
Definition: Test.h:187
boost::format Name() const
Definition: Test.h:99
static double TupleDist2(const boost::tuples::cons< Head, Tail > &lhs, const boost::tuples::cons< Head, Tail > &rhs)
Definition: Test.h:138
Predicate for greater or equal.
Definition: Test.h:77
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:80
Predicate for less.
Definition: Test.h:44
bool operator()(const T &x, const U &y) const
Definition: Test.h:191
Not()
Definition: Test.h:182
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:96
CloseTo(const double eps=1e-6)
Definition: Test.h:93
Predicate for greater.
Definition: Test.h:66
CloseRel(const double eps=1e-6)
Definition: Test.h:168
bool operator()(const T &lhs, const T &rhs) const
Definition: Test.h:69
bool Test(const Predicate &pred, const T &lhs, const T &rhs)
Test condition by evaluating a predicate.
Definition: Test.h:220
Predicate for less or equal.
Definition: Test.h:55
Not(const double eps)
Definition: Test.h:184
static double TupleDist2(const boost::tuples::null_type &, const boost::tuples::null_type &)
Definition: Test.h:145
utl::Triple Diff(const utl::Triple &lhs, const utl::Triple &rhs)
Definition: Test.h:205
Predicate for approximate equality (for floating point)
Definition: Test.h:91

, generated on Tue Sep 26 2023.