LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
RealComparisons.h
Go to the documentation of this file.
1 
11 #ifndef LARCORE_COREUTILS_REALCOMPARISONS_H
12 #define LARCORE_COREUTILS_REALCOMPARISONS_H
13 
14 // C/C++ standard libraries
15 #include <cmath> // std::abs()
16 #include <utility> // std::move()
17 
18 
19 namespace lar {
20  namespace util {
21 
65  template <typename RealType>
66  struct RealComparisons {
67  using Value_t = RealType;
68 
70  constexpr RealComparisons(Value_t threshold): threshold(threshold) {}
71 
73  constexpr bool zero(Value_t value) const
74  { return std::abs(value) <= threshold; }
75 
77  constexpr bool nonZero(Value_t value) const
78  { return !zero(value); }
79 
81  constexpr bool equal(Value_t a, Value_t b) const
82  { return zero(a - b); }
83 
85  constexpr bool nonEqual(Value_t a, Value_t b) const
86  { return !equal(a, b); }
87 
89  constexpr bool strictlyNegative(Value_t value) const
90  { return value < -threshold; }
91 
93  constexpr bool strictlyPositive(Value_t value) const
94  { return value > threshold; }
95 
97  constexpr bool nonNegative(Value_t value) const
98  { return value >= -threshold; }
99 
101  constexpr bool nonPositive(Value_t value) const
102  { return value <= threshold; }
103 
105  constexpr bool strictlySmaller(Value_t a, Value_t b) const
106  { return strictlyNegative(a - b); }
107 
109  constexpr bool nonSmaller(Value_t a, Value_t b) const
110  { return nonNegative(a - b); }
111 
113  constexpr bool strictlyGreater(Value_t a, Value_t b) const
114  { return strictlyPositive(a - b); }
115 
117  constexpr bool nonGreater(Value_t a, Value_t b) const
118  { return nonPositive(a - b); }
119 
121  constexpr bool within(Value_t value, Value_t lower, Value_t upper) const
122  { return nonNegative(value - lower) && nonPositive(value - upper); }
123 
125  constexpr bool withinSorted
126  (Value_t value, Value_t lower, Value_t upper) const
127  {
128  return (lower < upper)
129  ? within(value, lower, upper)
130  : within(value, upper, lower)
131  ;
132  } // sortedWithin
133 
135 
136  }; // struct RealComparisons<>
137 
138 
139  //--------------------------------------------------------------------------
141  template <typename RealType>
143 
145 
147  constexpr Vector2DComparison(Comp_t const& comparer)
148  : comparer(comparer) {}
149 
151  Vector2DComparison(Comp_t&& comparer): comparer(std::move(comparer)) {}
152 
154  constexpr Vector2DComparison(RealType threshold): comparer(threshold) {}
155 
157  constexpr Comp_t comp() const { return comparer; }
158 
160  template <typename Vect>
161  constexpr bool zero(Vect const& v) const
162  { return comp().zero(v.X()) && comp().zero(v.Y()); }
163 
165  template <typename Vect>
166  constexpr bool nonZero(Vect const& v) const { return !zero(v); }
167 
169  template <typename VectA, typename VectB>
170  constexpr bool equal(VectA const& a, VectB const& b) const
171  { return comp().equal(a.X(), b.X()) && comp().equal(a.Y(), b.Y()); }
172 
174  template <typename VectA, typename VectB>
175  constexpr bool nonEqual(VectA const& a, VectB const& b) const
176  { return !equal(a, b); }
177 
178  private:
179  Comp_t const comparer;
180 
181  }; // struct Vector2DComparison
182 
183 
184  //--------------------------------------------------------------------------
186  template <typename RealType>
189 
191  template <typename RealType>
194  { return Vector2DComparison<RealType>(comp); }
195 
196 
197  //--------------------------------------------------------------------------
199  template <typename RealType>
201 
204 
207 
209  constexpr Vector3DComparison(Comp_t const& comparer)
210  : comparer(comparer) {}
211 
213  Vector3DComparison(Comp_t&& comparer): comparer(std::move(comparer)) {}
214 
216  constexpr Vector3DComparison(RealType threshold): comparer(threshold) {}
217 
219  constexpr Comp_t comp() const { return comp2D().comp(); }
220 
222  constexpr Comp2D_t comp2D() const { return comparer; }
223 
225  template <typename Vect>
226  constexpr bool zero(Vect const& v) const
227  { return comp2D().zero(v) && comp().zero(v.Z()); }
228 
230  template <typename Vect>
231  constexpr bool nonZero(Vect const& v) const { return !zero(v); }
232 
234  template <typename VectA, typename VectB>
235  constexpr bool equal(VectA const& a, VectB const& b) const
236  { return comp2D().equal(a, b) && comp().equal(a.Z(), b.Z()); }
237 
239  template <typename VectA, typename VectB>
240  constexpr bool nonEqual(VectA const& a, VectB const& b) const
241  { return !equal(a, b); }
242 
243  private:
245 
246  }; // struct Vector3DComparison
247 
248 
249  //--------------------------------------------------------------------------
251  template <typename RealType>
254 
256  template <typename RealType>
259  { return Vector3DComparison<RealType>(comp); }
260 
261 
262  //--------------------------------------------------------------------------
263 
264 
265  } // namespace util
266 } // namespace lar
267 
268 
269 #endif // LARCORE_COREUTILS_REALCOMPARISONS_H
constexpr Vector3DComparison(Comp_t const &comparer)
Copy the specified comparison.
Namespace for general, non-LArSoft-specific utilities.
Definition: PIDAAlg.h:17
constexpr bool nonEqual(Value_t a, Value_t b) const
Returns whether a and b are farther than the threshold.
constexpr bool zero(Vect const &v) const
Returns whether the specified vector is null (within tolerance).
Class comparing 2D vectors.
Provides simple real number checks.
constexpr Comp_t comp() const
Returns the basic value comparer.
constexpr bool zero(Value_t value) const
Returns whether the value is no farther from 0 than the threshold.
auto makeVector2DComparison(RealType threshold)
Creates a Vector2DComparison from a RealComparisons object.
STL namespace.
Comp_t const comparer
Comparison object.
constexpr Vector3DComparison(RealType threshold)
Use the specified threshold.
constexpr bool equal(VectA const &a, VectB const &b) const
Returns whether the specified vectors match (within tolerance).
constexpr bool withinSorted(Value_t value, Value_t lower, Value_t upper) const
Returns whether value is between bounds (included); bounds are sorted.
constexpr bool nonEqual(VectA const &a, VectB const &b) const
Returns whether the specified vectors do not match (within tolerance).
constexpr RealComparisons(Value_t threshold)
type of values being compered
constexpr bool strictlySmaller(Value_t a, Value_t b) const
Returns whether a is strictly smaller than b.
constexpr bool strictlyGreater(Value_t a, Value_t b) const
Returns whether a is strictly greater than b.
auto makeVector3DComparison(RealType threshold)
Creates a Vector3DComparison from a RealComparisons object.
constexpr Vector2DComparison(Comp_t const &comparer)
Copy the specified comparison.
Vector2DComparison(Comp_t &&comparer)
Steal the specified comparison.
Class comparing 2D vectors.
constexpr bool strictlyNegative(Value_t value) const
Returns whether value is larger than zero beyond tolerance.
constexpr bool nonGreater(Value_t a, Value_t b) const
Returns whether a is smaller than (or equal to) b.
constexpr Comp_t comp() const
Returns the base value comparer.
constexpr bool strictlyPositive(Value_t value) const
Returns whether value is smaller than zero beyond tolerance.
Vector3DComparison(Comp_t &&comparer)
Steal the specified comparison.
std::string value(boost::any const &)
constexpr Vector2DComparison(RealType threshold)
Use the specified threshold.
LArSoft-specific namespace.
constexpr bool nonEqual(VectA const &a, VectB const &b) const
Returns whether the specified vectors do not match (within tolerance).
constexpr bool nonNegative(Value_t value) const
Returns whether value is larger than or equal() to zero.
constexpr bool nonZero(Value_t value) const
Returns whether the value is farther from 0 than the threshold.
constexpr bool zero(Vect const &v) const
Returns whether the specified vector is null (within tolerance).
constexpr bool nonZero(Vect const &v) const
Returns whether the specified vector is not null (within tolerance).
constexpr bool nonSmaller(Value_t a, Value_t b) const
Returns whether a is greater than (or equal to) b.
constexpr Comp2D_t comp2D() const
Returns the 2D vector comparer.
constexpr bool equal(Value_t a, Value_t b) const
Returns whether a and b are no farther than the threshold.
constexpr bool nonPositive(Value_t value) const
Returns whether value is smaller than or equal() to zero.
constexpr bool within(Value_t value, Value_t lower, Value_t upper) const
Returns whether value is between the bounds (included)
constexpr bool equal(VectA const &a, VectB const &b) const
Returns whether the specified vectors match (within tolerance).
constexpr bool nonZero(Vect const &v) const
Returns whether the specified vector is not null (within tolerance).