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>
28 {
return x ==
' ' || x ==
'\r' || x ==
'\n' || x ==
'\t'; }
37 {
return lhs == rhs; }
39 static const char*
Name() {
return "equal"; }
50 static const char*
Name() {
return "less"; }
59 {
return lhs <= rhs; }
61 static const char*
Name() {
return "less or equal"; }
72 static const char*
Name() {
return "greater"; }
81 {
return lhs >= rhs; }
83 static const char*
Name() {
return "greater or equal"; }
97 {
return IsCloseTo(lhs, rhs); }
100 {
return boost::format(
"close (@%g) to") %
fEpsilon; }
125 IsCloseTo(
const T& lhs,
const T& rhs)
135 template<
typename Head,
typename Tail>
139 const boost::tuples::cons<Head, Tail>& rhs)
141 const double t = lhs.get_head() - rhs.get_head();
142 return t*t +
TupleDist2(lhs.get_tail(), rhs.get_tail());
146 const boost::tuples::null_type& )
162 {
return boost::format(
"absolutely close (@%g) to") %
fEpsilon; }
175 {
return boost::format(
"relatively close (@%g) to") %
fEpsilon; }
179 template<
typename Predicate>
180 class Not :
public Predicate {
184 Not(
const double eps) : Predicate(eps) { }
188 {
return !Predicate::operator()(x); }
190 template<
typename T,
typename U>
192 {
return !Predicate::operator()(x, y); }
194 template<
typename T,
typename U,
typename W>
196 {
return !Predicate::operator()(x, y, z); }
199 {
return boost::format(
"not-%s") % Predicate().Name(); }
208 lhs.get<1>() - rhs.get<1>(),
209 lhs.get<2>() - rhs.get<2>());
219 template<
class Predicate,
typename T>
220 inline bool Test(
const Predicate& pred,
const T& lhs,
const T& rhs)
221 {
return pred(lhs, rhs); }
225 template<
class Predicate,
typename T>
226 inline bool Test(
const T& lhs,
const T& rhs)
227 {
return Test(Predicate(), lhs, rhs); }
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); }
bool IsCloseRel(const T &lhs, const T &rhs) const
bool operator()(const T &lhs, const T &rhs) const
bool IsCloseAbs(const utl::Triple &lhs, const utl::Triple &rhs) const
bool operator()(const T &x, const U &y, const W &z) const
boost::format Name() const
boost::format Name() const
CloseAbs(const double eps=1e-6)
bool IsCloseAbs(const T &lhs, const T &rhs) const
bool operator()(const char x) const
bool operator()(const T &lhs, const T &rhs) const
bool operator()(const T &lhs, const T &rhs) const
static boost::format Name()
bool operator()(const T &lhs, const T &rhs) const
static const char * Name()
Predicate used in STL for searching for whitespace.
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
bool operator()(const T &lhs, const T &rhs) const
static const char * Name()
static const char * Name()
double abs(const SVector< n, T > &v)
static const char * Name()
static const char * Name()
bool operator()(const T &x) const
boost::format Name() const
static double TupleDist2(const boost::tuples::cons< Head, Tail > &lhs, const boost::tuples::cons< Head, Tail > &rhs)
Predicate for greater or equal.
bool operator()(const T &lhs, const T &rhs) const
bool operator()(const T &x, const U &y) const
bool operator()(const T &lhs, const T &rhs) const
CloseTo(const double eps=1e-6)
CloseRel(const double eps=1e-6)
bool operator()(const T &lhs, const T &rhs) const
bool Test(const Predicate &pred, const T &lhs, const T &rhs)
Test condition by evaluating a predicate.
Predicate for less or equal.
static double TupleDist2(const boost::tuples::null_type &, const boost::tuples::null_type &)
utl::Triple Diff(const utl::Triple &lhs, const utl::Triple &rhs)
Predicate for approximate equality (for floating point)