MarlinTrkProcessors  2.4.1
fpcompare.h
1 // This file's extension implies that it's C, but it's really -*- C++ -*-.
2 // $Id: fpcompare.h 5156 2015-09-03 11:46:14Z Rosa.Simoniello@cern.ch $
3 
4 #include <cmath>
5 #include <functional>
6 
7 
8 #ifndef CXXUTILS_FPCOMPARE_H
9 #define CXXUTILS_FPCOMPARE_H
10 
11 
12 // Decide whether we need to use volatile or not.
13 #if defined(__FLT_EVAL_METHOD__) && \
14  (__FLT_EVAL_METHOD__ == 2 || __FLT_EVAL_METHOD__ < 0)
15  // __FLT_EVAL_METHOD__ < 0 means unspecified.
16  // Be pessimistic in that case.
17 # define CXXUTILS_FPCOMPARE_VOLATILE volatile
18 #elif defined(__i386__) && !defined(__SSE2__)
19  // On x86, gcc -msse -mfpmath=sse is observed to _not_ generate
20  // sse fp instructions, but does set __FLT_EVAL_METHOD__ to 0.
21  // -msse2 -mfpmath=sse does seem to work as expected.
22  // Special-case this for now; should follow up with a gcc bug report
23  // if this still happens in current releases.
24 # define CXXUTILS_FPCOMPARE_VOLATILE volatile
25 #else
26 # define CXXUTILS_FPCOMPARE_VOLATILE
27 #endif
28 
29 
30 namespace CxxUtils {
31 namespace fpcompare {
32 
33 
34 inline
35 bool equal (double a, double b)
36 {
37  CXXUTILS_FPCOMPARE_VOLATILE double va = a;
38  CXXUTILS_FPCOMPARE_VOLATILE double vb = b;
39  return va == vb;
40 }
41 
42 
43 inline
44 bool equal (float a, float b)
45 {
46  CXXUTILS_FPCOMPARE_VOLATILE float va = a;
47  CXXUTILS_FPCOMPARE_VOLATILE float vb = b;
48  return va == vb;
49 }
50 
51 
52 inline
53 bool greater (double a, double b)
54 {
55  CXXUTILS_FPCOMPARE_VOLATILE double va = a;
56  CXXUTILS_FPCOMPARE_VOLATILE double vb = b;
57  return va > vb;
58 }
59 
60 
61 inline
62 bool greater (float a, float b)
63 {
64  CXXUTILS_FPCOMPARE_VOLATILE float va = a;
65  CXXUTILS_FPCOMPARE_VOLATILE float vb = b;
66  return va > vb;
67 }
68 
69 
70 inline
71 bool less (double a, double b)
72 {
73  CXXUTILS_FPCOMPARE_VOLATILE double va = a;
74  CXXUTILS_FPCOMPARE_VOLATILE double vb = b;
75  return va < vb;
76 }
77 
78 
79 inline
80 bool less (float a, float b)
81 {
82  CXXUTILS_FPCOMPARE_VOLATILE float va = a;
83  CXXUTILS_FPCOMPARE_VOLATILE float vb = b;
84  return va < vb;
85 }
86 
87 
88 inline
89 bool greater_equal (double a, double b)
90 {
91  CXXUTILS_FPCOMPARE_VOLATILE double va = a;
92  CXXUTILS_FPCOMPARE_VOLATILE double vb = b;
93  return va >= vb;
94 }
95 
96 
97 inline
98 bool greater_equal (float a, float b)
99 {
100  CXXUTILS_FPCOMPARE_VOLATILE float va = a;
101  CXXUTILS_FPCOMPARE_VOLATILE float vb = b;
102  return va >= vb;
103 }
104 
105 
106 inline
107 bool less_equal (double a, double b)
108 {
109  CXXUTILS_FPCOMPARE_VOLATILE double va = a;
110  CXXUTILS_FPCOMPARE_VOLATILE double vb = b;
111  return va <= vb;
112 }
113 
114 
115 inline
116 bool less_equal (float a, float b)
117 {
118  CXXUTILS_FPCOMPARE_VOLATILE float va = a;
119  CXXUTILS_FPCOMPARE_VOLATILE float vb = b;
120  return va <= vb;
121 }
122 
123 
124 } // namespace fpcompare
125 
126 
127 namespace fpcompare_fn {
128 
129 
130 struct equal
131  : public std::binary_function<double, double, bool>
132 {
133  bool
134  operator()(double a, double b) const
135  { return fpcompare::equal (a, b); }
136 };
137 
138 
139 struct equalf
140  : public std::binary_function<float, float, bool>
141 {
142  bool
143  operator()(float a, float b) const
144  { return fpcompare::equal (a, b); }
145 };
146 
147 
148 struct greater
149  : public std::binary_function<double, double, bool>
150 {
151  bool
152  operator()(double a, double b) const
153  { return fpcompare::greater (a, b); }
154 };
155 
156 
157 struct greaterf
158  : public std::binary_function<float, float, bool>
159 {
160  bool
161  operator()(float a, float b) const
162  { return fpcompare::greater (a, b); }
163 };
164 
165 
166 struct less
167  : public std::binary_function<double, double, bool>
168 {
169  bool
170  operator()(double a, double b) const
171  { return fpcompare::less (a, b); }
172 };
173 
174 
175 struct lessf
176  : public std::binary_function<float, float, bool>
177 {
178  bool
179  operator()(float a, float b) const
180  { return fpcompare::less (a, b); }
181 };
182 
183 
185  : public std::binary_function<double, double, bool>
186 {
187  bool
188  operator()(double a, double b) const
189  { return fpcompare::greater_equal (a, b); }
190 };
191 
192 
194  : public std::binary_function<float, float, bool>
195 {
196  bool
197  operator()(float a, float b) const
198  { return fpcompare::greater_equal (a, b); }
199 };
200 
201 
203  : public std::binary_function<double, double, bool>
204 {
205  bool
206  operator()(double a, double b) const
207  { return fpcompare::less_equal (a, b); }
208 };
209 
210 
212  : public std::binary_function<float, float, bool>
213 {
214  bool
215  operator()(float a, float b) const
216  { return fpcompare::less_equal (a, b); }
217 };
218 
219 
220 } // namespace fpcompare_fn
221 } // namespace CxxUtils
222 
223 
224 #endif // not CXXUTILS_FPCOMPARE_H
Definition: fpcompare.h:211
Definition: fpcompare.h:157
Definition: fpcompare.h:193
Definition: fpcompare.h:202
Definition: fpcompare.h:139
Definition: fpcompare.h:148
Definition: fpcompare.h:184
Definition: fpcompare.h:130
Definition: fpcompare.h:175
Definition: fpcompare.h:166