5#include "Rivet/Projection.hh"
6#include "Rivet/Config/RivetCommon.hh"
34 Cmp(
const T& t1,
const T& t2)
35 : _value(CmpState::UNDEF), _objects(&t1, &t2) { }
40 : _value(x._value), _objects(nullptr, nullptr) { }
44 const Cmp<T>& operator=(
const Cmp<U>& x) {
54 operator CmpState()
const {
61 const Cmp<T>& operator||(
const Cmp<U>& c)
const {
63 if (_value == CmpState::EQ) _value = c;
70 void _compare()
const {
71 if (_value == CmpState::UNDEF) {
73 if (l(*_objects.first, *_objects.second))
74 _value = CmpState::NEQ;
75 else if (l(*_objects.second, *_objects.first))
76 _value = CmpState::NEQ;
78 _value = CmpState::EQ;
83 mutable CmpState _value;
86 const pair<const T*, const T*> _objects;
111 Cmp(
const Projection& p1,
const Projection& p2)
112 : _value(CmpState::UNDEF), _objects(&p1, &p2) { }
115 template <
typename U>
117 : _value(x), _objects(nullptr, nullptr) { }
120 template <
typename U>
121 const Cmp<Projection>& operator=(
const Cmp<U>& x) {
130 operator CmpState()
const {
136 template <
typename U>
137 const Cmp<Projection>& operator||(
const Cmp<U>& c)
const {
139 if (_value == CmpState::EQ) _value = c;
146 void _compare()
const {
147 if (_value == CmpState::UNDEF) {
148 const std::type_info& id1 =
typeid(*_objects.first);
149 const std::type_info& id2 =
typeid(*_objects.second);
151 _value = CmpState::NEQ;
152 else if (id2.before(id1))
153 _value = CmpState::NEQ;
155 CmpState cmps = _objects.first->compare(*_objects.second);
156 if (cmps == CmpState::EQ)
157 _value = CmpState::EQ;
159 _value = CmpState::NEQ;
167 mutable CmpState _value;
170 const pair<const Projection*, const Projection*> _objects;
188 class Cmp<double> final {
194 Cmp(
const double p1,
const double p2)
195 : _value(CmpState::UNDEF), _numA(p1), _numB(p2) { }
198 template <
typename U>
200 : _value(x), _numA(0.0), _numB(0.0) { }
203 template <
typename U>
204 const Cmp<double>& operator=(
const Cmp<U>& x) {
213 operator CmpState()
const {
219 template <
typename U>
220 const Cmp<double>& operator||(
const Cmp<U>& c)
const {
222 if (_value == CmpState::EQ) _value = c;
229 void _compare()
const {
230 if (_value == CmpState::UNDEF) {
232 _value = CmpState::EQ;
234 _value = CmpState::NEQ;
241 mutable CmpState _value;
244 const double _numA, _numB;
252 template <
typename T>
253 inline Cmp<T>
cmp(
const T& t1,
const T& t2) {
254 return Cmp<T>(t1, t2);
264 return Cmp<Projection>(p1, p2);
const PROJ & getProjection(const std::string &name) const
Definition ProjectionApplier.hh:72
Base class for all Rivet projections.
Definition Projection.hh:29
Definition LHCbCommon.hh:9
Cmp< Projection > PCmp
Typedef for Cmp<Projection>.
Definition Cmp.hh:259
Cmp< Projection > pcmp(const Projection &p1, const Projection &p2)
Global helper function for easy creation of Cmp<Projection> objects.
Definition Cmp.hh:263
Cmp< T > cmp(const T &t1, const T &t2)
Global helper function for easy creation of Cmp objects.
Definition Cmp.hh:253
std::enable_if_t< std::is_arithmetic_v< N1 > &&std::is_arithmetic_v< N2 > &&(std::is_floating_point_v< N1 >||std::is_floating_point_v< N2 >), bool > fuzzyEquals(N1 a, N2 b, double tolerance=1e-5)
Compare two numbers for equality with a degree of fuzziness.
Definition MathUtils.hh:66