2 +----------------------------------------------------------------------+
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #ifndef incl_HPHP_COMPARISONS_H_
18 #define incl_HPHP_COMPARISONS_H_
20 #include "hphp/runtime/base/builtin-functions.h"
21 #include "hphp/runtime/base/tv-comparisons.h"
22 #include "hphp/runtime/base/type-variant.h"
26 ///////////////////////////////////////////////////////////////////////////////
29 bool same(const Variant
& v1
, bool v2
);
30 bool same(const Variant
& v1
, int64_t v2
);
31 inline bool same(const Variant
& v1
, int v2
) = delete;
32 bool same(const Variant
& v1
, double v2
);
33 bool same(const Variant
& v1
, const StringData
* v2
);
34 bool same(const Variant
& v1
, const String
& v2
);
35 bool same(const Variant
& v1
, const char* v2
) = delete;
36 bool same(const Variant
& v1
, const Array
& v2
);
37 bool same(const Variant
& v1
, const Object
& v2
) = delete;
38 bool same(const Variant
& v1
, const ObjectData
* v2
) = delete;
39 bool same(const Variant
& v1
, const Resource
& v2
) = delete;
40 inline bool same(const Variant
& v1
, const Variant
& v2
) {
41 return tvSame(*v1
.asTypedValue(), *v2
.asTypedValue());
44 inline bool equal(const Variant
& v1
, bool v2
) {
45 return tvEqual(*v1
.asTypedValue(), v2
);
47 inline bool equal(const Variant
& v1
, int v2
) = delete;
48 inline bool equal(const Variant
& v1
, int64_t v2
) {
49 return tvEqual(*v1
.asTypedValue(), v2
);
51 inline bool equal(const Variant
& v1
, double v2
) {
52 return tvEqual(*v1
.asTypedValue(), v2
);
54 inline bool equal(const Variant
& v1
, const StringData
* v2
) {
55 return tvEqual(*v1
.asTypedValue(), v2
);
57 inline bool equal(const Variant
& v1
, const String
& v2
) {
58 if (!v2
.get()) return tvEqual(*v1
.asTypedValue(), false);
59 return tvEqual(*v1
.asTypedValue(), v2
.get());
61 inline bool equal(const Variant
& v1
, const char* v2
) = delete;
62 inline bool equal(const Variant
& v1
, const Array
& v2
) {
63 if (!v2
.get()) return tvEqual(*v1
.asTypedValue(), false);
64 return tvEqual(*v1
.asTypedValue(), v2
.get());
66 inline bool equal(const Variant
& v1
, const Object
& v2
) = delete;
67 inline bool equal(const Variant
& v1
, const Resource
& v2
) = delete;
68 inline bool equal(const Variant
& v1
, const Variant
& v2
) {
69 return tvEqual(*v1
.asTypedValue(), *v2
.asTypedValue());
72 inline bool less(const Variant
& v1
, bool v2
) {
73 return tvLess(*v1
.asTypedValue(), v2
);
75 inline bool less(const Variant
& v1
, int v2
) = delete;
76 inline bool less(const Variant
& v1
, int64_t v2
) {
77 return tvLess(*v1
.asTypedValue(), v2
);
79 inline bool less(const Variant
& v1
, double v2
) {
80 return tvLess(*v1
.asTypedValue(), v2
);
82 inline bool less(const Variant
& v1
, const StringData
* v2
) {
83 return tvLess(*v1
.asTypedValue(), v2
);
85 inline bool less(const Variant
& v1
, const String
& v2
) {
86 if (!v2
.get()) return tvLess(*v1
.asTypedValue(), false);
87 return tvLess(*v1
.asTypedValue(), v2
.get());
89 inline bool less(const Variant
& v1
, const char* v2
) = delete;
90 inline bool less(const Variant
& v1
, const Array
& v2
) {
91 if (!v2
.get()) return tvLess(*v1
.asTypedValue(), false);
92 return tvLess(*v1
.asTypedValue(), v2
.get());
94 inline bool less(const Variant
& v1
, const Object
& v2
) = delete;
95 inline bool less(const Variant
& v1
, const Resource
& v2
) = delete;
96 inline bool less(const Variant
& v1
, const Variant
& v2
) {
97 return tvLess(*v1
.asTypedValue(), *v2
.asTypedValue());
100 inline bool more(const Variant
& v1
, bool v2
) {
101 return tvGreater(*v1
.asTypedValue(), v2
);
103 inline bool more(const Variant
& v1
, int v2
) = delete;
104 inline bool more(const Variant
& v1
, int64_t v2
) {
105 return tvGreater(*v1
.asTypedValue(), v2
);
107 inline bool more(const Variant
& v1
, double v2
) {
108 return tvGreater(*v1
.asTypedValue(), v2
);
110 inline bool more(const Variant
& v1
, const StringData
* v2
) {
111 return tvGreater(*v1
.asTypedValue(), v2
);
113 inline bool more(const Variant
& v1
, const String
& v2
) {
114 if (!v2
.get()) return tvGreater(*v1
.asTypedValue(), false);
115 return tvGreater(*v1
.asTypedValue(), v2
.get());
117 inline bool more(const Variant
& v1
, const char* v2
) = delete;
118 inline bool more(const Variant
& v1
, const Array
& v2
) {
119 if (!v2
.get()) return tvGreater(*v1
.asTypedValue(), false);
120 return tvGreater(*v1
.asTypedValue(), v2
.get());
122 inline bool more(const Variant
& v1
, const Object
& v2
) = delete;
123 inline bool more(const Variant
& v1
, const Resource
& v2
) = delete;
124 inline bool more(const Variant
& v1
, const Variant
& v2
) {
125 return tvGreater(*v1
.asTypedValue(), *v2
.asTypedValue());
128 inline int64_t compare(const Variant
& v1
, const Variant
& v2
) {
129 return tvCompare(*v1
.asTypedValue(), *v2
.asTypedValue());
132 ///////////////////////////////////////////////////////////////////////////////
135 inline bool same(bool v1
, bool v2
) = delete;
136 inline bool same(bool v1
, int v2
) = delete;
137 inline bool same(bool v1
, int64_t v2
) = delete;
138 inline bool same(bool v1
, double v2
) = delete;
139 inline bool same(bool /*v1*/, const StringData
* /*v2*/) {
142 inline bool same(bool /*v1*/, const String
& /*v2*/) {
145 inline bool same(bool v1
, const char* v2
) = delete;
146 inline bool same(bool /*v1*/, const Array
& /*v2*/) {
149 inline bool same(bool /*v1*/, const Object
& /*v2*/) = delete;
150 inline bool same(bool /*v1*/, const Resource
& /*v2*/) = delete;
151 inline bool same(bool v1
, const Variant
& v2
) { return same(v2
, v1
); }
153 inline bool equal(bool v1
, bool v2
) { return v1
== v2
; }
154 inline bool equal(bool v1
, int v2
) = delete;
155 inline bool equal(bool v1
, int64_t v2
) { return v1
== (v2
!= 0); }
156 inline bool equal(bool v1
, double v2
) { return v1
== (v2
!= 0.0); }
157 inline bool equal(bool v1
, const StringData
*v2
) {
158 return v1
== (v2
? v2
->toBoolean() : false);
160 inline bool equal(bool v1
, const String
& v2
) { return v1
== v2
.toBoolean(); }
161 inline bool equal(bool v1
, const char* v2
) = delete;
162 inline bool equal(bool v1
, const Array
& v2
) {
163 if (LIKELY(v2
.isPHPArray())) return v1
== v2
.toBoolean();
166 inline bool equal(bool v1
, const Object
& v2
) = delete;
167 inline bool equal(bool v1
, const Resource
& v2
) = delete;
168 inline bool equal(bool v1
, const Variant
& v2
) { return equal(v2
, v1
); }
170 inline bool less(bool v1
, bool v2
) { return (v1
?1:0) < (v2
?1:0); }
171 inline bool less(bool v1
, int v2
) = delete;
172 inline bool less(bool v1
, int64_t v2
) { return less(v1
,(v2
!= 0)); }
173 inline bool less(bool v1
, double v2
) { return less(v1
,(v2
!= 0.0)); }
174 inline bool less(bool v1
, const StringData
*v2
) {
175 return less(v1
, (v2
? v2
->toBoolean() : false));
177 inline bool less(bool v1
, const String
& v2
) { return less(v1
,v2
.toBoolean()); }
178 inline bool less(bool v1
, const char* v2
) = delete;
179 inline bool less(bool v1
, const Array
& v2
) {
180 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
181 if (v2
.isVecArray()) throw_vec_compare_exception();
182 if (v2
.isDict()) throw_dict_compare_exception();
183 assertx(v2
.isKeyset());
184 throw_keyset_compare_exception();
186 inline bool less(bool v1
, const Object
& v2
) = delete;
187 inline bool less(bool v1
, const Resource
& v2
) = delete;
188 inline bool less(bool v1
, const Variant
& v2
) { return more(v2
,v1
); }
190 inline bool more(bool v1
, bool v2
) { return (v1
?1:0) > (v2
?1:0); }
191 inline bool more(bool v1
, int v2
) = delete;
192 inline bool more(bool v1
, int64_t v2
) { return more(v1
,(v2
!= 0)); }
193 inline bool more(bool v1
, double v2
) { return more(v1
,(v2
!= 0.0)); }
194 inline bool more(bool v1
, const StringData
*v2
) {
195 return more(v1
, (v2
? v2
->toBoolean() : false));
197 inline bool more(bool v1
, const String
& v2
) { return more(v1
,v2
.toBoolean()); }
198 inline bool more(bool v1
, const char* v2
) = delete;
199 inline bool more(bool v1
, const Array
& v2
) {
200 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
201 if (v2
.isVecArray()) throw_vec_compare_exception();
202 if (v2
.isDict()) throw_dict_compare_exception();
203 assertx(v2
.isKeyset());
204 throw_keyset_compare_exception();
206 inline bool more(bool v1
, const Object
& v2
) = delete;
207 inline bool more(bool v1
, const Resource
& v2
) = delete;
208 inline bool more(bool v1
, const Variant
& v2
) { return less(v2
,v1
); }
210 inline int64_t compare(bool v1
, bool v2
) { return v1
- v2
; }
212 ///////////////////////////////////////////////////////////////////////////////
215 inline bool same(int v1
, bool v2
) = delete;
216 inline bool same(int v1
, int v2
) = delete;
217 inline bool same(int v1
, int64_t v2
) = delete;
218 inline bool same(int v1
, double v2
) = delete;
219 inline bool same(int /*v1*/, const StringData
* /*v2*/) = delete;
220 inline bool same(int /*v1*/, const String
& /*v2*/) = delete;
221 inline bool same(int v1
, const char* v2
) = delete;
222 inline bool same(int /*v1*/, const Array
& /*v2*/) = delete;
223 inline bool same(int /*v1*/, const Object
& /*v2*/) = delete;
224 inline bool same(int /*v1*/, const Resource
& /*v2*/) = delete;
225 inline bool same(int v1
, const Variant
& v2
) = delete;
227 inline bool equal(int v1
, bool v2
) = delete;
228 inline bool equal(int v1
, int v2
) = delete;
229 inline bool equal(int v1
, int64_t v2
) = delete;
230 inline bool equal(int v1
, double v2
) = delete;
231 inline bool equal(int v1
, const StringData
*v2
) = delete;
232 inline bool equal(int v1
, const String
& v2
) = delete;
233 inline bool equal(int v1
, const char* v2
) = delete;
234 inline bool equal(int /*v1*/, const Array
& /*v2*/) = delete;
235 inline bool equal(int v1
, const Object
& v2
) = delete;
236 inline bool equal(int v1
, const Resource
& v2
) = delete;
237 inline bool equal(int v1
, const Variant
& v2
) = delete;
239 inline bool less(int v1
, bool v2
) = delete;
240 inline bool less(int v1
, int v2
) = delete;
241 inline bool less(int v1
, int64_t v2
) = delete;
242 inline bool less(int v1
, double v2
) = delete;
243 inline bool less(int v1
, const StringData
*v2
) = delete;
244 inline bool less(int v1
, const String
& v2
) = delete;
245 inline bool less(int v1
, const char* v2
) = delete;
246 inline bool less(int /*v1*/, const Array
& v2
) = delete;
247 inline bool less(int v1
, const Object
& v2
) = delete;
248 inline bool less(int v1
, const Resource
& v2
) = delete;
249 inline bool less(int v1
, const Variant
& v2
) = delete;
251 inline bool more(int v1
, bool v2
) = delete;
252 inline bool more(int v1
, int v2
) = delete;
253 inline bool more(int v1
, int64_t v2
) = delete;
254 inline bool more(int v1
, double v2
) = delete;
255 inline bool more(int v1
, const StringData
*v2
) = delete;
256 inline bool more(int v1
, const String
& v2
) = delete;
257 inline bool more(int v1
, const char* v2
) = delete;
258 inline bool more(int /*v1*/, const Array
& v2
) = delete;
259 inline bool more(int v1
, const Object
& v2
) = delete;
260 inline bool more(int v1
, const Resource
& v2
) = delete;
261 inline bool more(int v1
, const Variant
& v2
) = delete;
263 inline int64_t compare(int v1
, int v2
) = delete;
265 ///////////////////////////////////////////////////////////////////////////////
268 inline bool same(int64_t v1
, bool v2
) = delete;
269 inline bool same(int64_t v1
, int v2
) = delete;
270 inline bool same(int64_t v1
, int64_t v2
) = delete;
271 inline bool same(int64_t v1
, double v2
) = delete;
272 inline bool same(int64_t /*v1*/, const StringData
* /*v2*/) {
275 inline bool same(int64_t /*v1*/, const String
& /*v2*/) {
278 inline bool same(int64_t v1
, const char* v2
) = delete;
279 inline bool same(int64_t /*v1*/, const Array
& /*v2*/) {
282 inline bool same(int64_t /*v1*/, const Object
& /*v2*/) = delete;
283 inline bool same(int64_t /*v1*/, const Resource
& /*v2*/) = delete;
284 inline bool same(int64_t v1
, const Variant
& v2
) { return same(v2
, v1
); }
286 inline bool equal(int64_t v1
, bool v2
) { return equal(v2
, v1
); }
287 inline bool equal(int64_t v1
, int v2
) = delete;
288 inline bool equal(int64_t v1
, int64_t v2
) { return v1
== v2
; }
289 inline bool equal(int64_t v1
, double v2
) { return (double)v1
== v2
; }
290 bool equal(int64_t v1
, const StringData
*v2
);
291 inline bool equal(int64_t v1
, const String
& v2
) { return equal(v1
, v2
.get()); }
292 inline bool equal(int64_t v1
, const char* v2
) = delete;
293 inline bool equal(int64_t /*v1*/, const Array
& /*v2*/) {
296 inline bool equal(int64_t v1
, const Object
& v2
) = delete;
297 inline bool equal(int64_t v1
, const Resource
& v2
) = delete;
298 inline bool equal(int64_t v1
, const Variant
& v2
) {
299 return equal(v2
, v1
);
302 inline bool nequal(int64_t v1
, const StringData
* v2
) {
303 return !equal(v1
, v2
);
306 inline bool less(int64_t v1
, bool v2
) { return more(v2
, v1
); }
307 inline bool less(int64_t v1
, int v2
) = delete;
308 inline bool less(int64_t v1
, int64_t v2
) { return v1
< v2
; }
309 inline bool less(int64_t v1
, double v2
) { return v1
< v2
; }
310 bool less(int64_t v1
, const StringData
*v2
);
311 inline bool less(int64_t v1
, const String
& v2
) { return less(v1
, v2
.get()); }
312 inline bool less(int64_t v1
, const char* v2
) = delete;
313 inline bool less(int64_t /*v1*/, const Array
& v2
) {
314 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
315 if (v2
.isVecArray()) throw_vec_compare_exception();
316 if (v2
.isDict()) throw_dict_compare_exception();
317 assertx(v2
.isKeyset());
318 throw_keyset_compare_exception();
320 inline bool less(int64_t v1
, const Object
& v2
) = delete;
321 inline bool less(int64_t v1
, const Resource
& v2
) = delete;
322 inline bool less(int64_t v1
, const Variant
& v2
) {
326 bool lessEqual(int64_t v1
, const StringData
* v2
);
328 inline bool more(int64_t v1
, bool v2
) { return less(v2
, v1
); }
329 inline bool more(int64_t v1
, int v2
) = delete;
330 inline bool more(int64_t v1
, int64_t v2
) { return v1
> v2
; }
331 inline bool more(int64_t v1
, double v2
) { return v1
> v2
; }
332 bool more(int64_t v1
, const StringData
*v2
);
333 inline bool more(int64_t v1
, const String
& v2
) { return more(v1
, v2
.get()); }
334 inline bool more(int64_t v1
, const char* v2
) = delete;
335 inline bool more(int64_t /*v1*/, const Array
& v2
) {
336 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
337 if (v2
.isVecArray()) throw_vec_compare_exception();
338 if (v2
.isDict()) throw_dict_compare_exception();
339 assertx(v2
.isKeyset());
340 throw_keyset_compare_exception();
342 inline bool more(int64_t v1
, const Object
& v2
) = delete;
343 inline bool more(int64_t v1
, const Resource
& v2
) = delete;
344 inline bool more(int64_t v1
, const Variant
& v2
) { return less(v2
, v1
); }
346 bool moreEqual(int64_t v1
, const StringData
* v2
);
348 inline int64_t compare(int64_t v1
, int64_t v2
) {
349 return (v1
< v2
) ? -1 : ((v1
> v2
) ? 1 : 0);
352 ///////////////////////////////////////////////////////////////////////////////
355 inline bool same(double v1
, bool v2
) = delete;
356 inline bool same(double v1
, int v2
) = delete;
357 inline bool same(double v1
, int64_t v2
) = delete;
358 inline bool same(double v1
, double v2
) = delete;
359 inline bool same(double /*v1*/, const StringData
* /*v2*/) {
362 inline bool same(double /*v1*/, const String
& /*v2*/) {
365 inline bool same(double v1
, const char* v2
) = delete;
366 inline bool same(double /*v1*/, const Array
& /*v2*/) {
369 inline bool same(double /*v1*/, const Object
& /*v2*/) = delete;
370 inline bool same(double /*v1*/, const Resource
& /*v2*/) = delete;
371 inline bool same(double v1
, const Variant
& v2
) { return same(v2
, v1
); }
373 inline bool equal(double v1
, bool v2
) { return equal(v2
, v1
); }
374 inline bool equal(double v1
, int v2
) = delete;
375 inline bool equal(double v1
, int64_t v2
) { return equal(v2
, v1
); }
376 inline bool equal(double v1
, double v2
) { return v1
== v2
; }
377 inline bool equal(double v1
, const StringData
* v2
) {
378 return v1
== (v2
? v2
->toDouble() : 0.0);
380 inline bool equal(double v1
, const String
& v2
) { return v1
== v2
.toDouble(); }
381 inline bool equal(double v1
, const char* v2
) = delete;
382 inline bool equal(double /*v1*/, const Array
& /*v2*/) {
385 inline bool equal(double v1
, const Object
& v2
) = delete;
386 inline bool equal(double v1
, const Resource
& v2
) = delete;
387 inline bool equal(double v1
, const Variant
& v2
) {
388 return equal(v2
, v1
);
391 inline bool less(double v1
, bool v2
) { return more(v2
, v1
); }
392 inline bool less(double v1
, int v2
) = delete;
393 inline bool less(double v1
, int64_t v2
) { return more(v2
, v1
); }
394 inline bool less(double v1
, double v2
) { return v1
< v2
; }
395 inline bool less(double v1
, const StringData
*v2
) {
396 return less(v1
, (v2
? v2
->toDouble() : 0.0));
398 inline bool less(double v1
, const String
& v2
) { return less(v1
,v2
.toDouble()); }
399 inline bool less(double v1
, const char* v2
) = delete;
400 inline bool less(double /*v1*/, const Array
& v2
) {
401 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
402 if (v2
.isVecArray()) throw_vec_compare_exception();
403 if (v2
.isDict()) throw_dict_compare_exception();
404 assertx(v2
.isKeyset());
405 throw_keyset_compare_exception();
407 inline bool less(double v1
, const Object
& v2
) = delete;
408 inline bool less(double v1
, const Resource
& v2
) = delete;
409 inline bool less(double v1
, const Variant
& v2
) {
413 inline bool more(double v1
, bool v2
) { return less(v2
, v1
); }
414 inline bool more(double v1
, int v2
) = delete;
415 inline bool more(double v1
, int64_t v2
) { return less(v2
, v1
); }
416 inline bool more(double v1
, double v2
) { return v1
> v2
; }
417 inline bool more(double v1
, const StringData
*v2
) {
418 return more(v1
, (v2
? v2
->toDouble() : 0.0));
420 inline bool more(double v1
, const String
& v2
) { return more(v1
,v2
.toDouble()); }
421 inline bool more(double v1
, const char* v2
) = delete;
422 inline bool more(double /*v1*/, const Array
& v2
) {
423 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
424 if (v2
.isVecArray()) throw_vec_compare_exception();
425 if (v2
.isDict()) throw_dict_compare_exception();
426 assertx(v2
.isKeyset());
427 throw_keyset_compare_exception();
429 inline bool more(double v1
, const Object
& v2
) = delete;
430 inline bool more(double v1
, const Resource
& v2
) = delete;
431 inline bool more(double v1
, const Variant
& v2
) { return less(v2
, v1
); }
433 inline int64_t compare(double v1
, double v2
) {
434 // This ordering is required so that -1 is returned for NaNs (to match PHP7
436 return (v1
== v2
) ? 0 : ((v1
> v2
) ? 1 : -1);
439 ///////////////////////////////////////////////////////////////////////////////
442 inline bool same(const StringData
*v1
, bool v2
) { return same(v2
, v1
); }
443 inline bool same(const StringData
*v1
, int v2
) = delete;
444 inline bool same(const StringData
*v1
, int64_t v2
) { return same(v2
, v1
); }
445 inline bool same(const StringData
*v1
, double v2
) { return same(v2
, v1
); }
446 inline bool same(const StringData
*v1
, const StringData
*v2
) {
447 if (v1
== v2
) return true;
448 if (v1
&& v2
) return v1
->same(v2
);
451 inline bool same(const StringData
*v1
, const String
& v2
) {
452 return same(v1
, v2
.get());
454 inline bool same(const StringData
*v1
, const char* v2
) = delete;
455 inline bool same(const StringData
* /*v1*/, const Array
& /*v2*/) {
458 inline bool same(const StringData
* /*v1*/, const Object
& /*v2*/) = delete;
459 inline bool same(const StringData
* /*v1*/, const Resource
& /*v2*/) = delete;
460 inline bool same(const StringData
*v1
, const Variant
& v2
) {
464 inline bool nsame(const StringData
* v1
, const StringData
* v2
) {
465 return !same(v1
, v2
);
468 inline bool equal(const StringData
*v1
, bool v2
) { return equal(v2
, v1
); }
469 inline bool equal(const StringData
*v1
, int v2
) = delete;
470 inline bool equal(const StringData
*v1
, int64_t v2
) { return equal(v2
, v1
); }
471 inline bool equal(const StringData
*v1
, double v2
) { return equal(v2
, v1
); }
472 inline bool equal(const StringData
*v1
, const StringData
*v2
) {
473 if (v1
== v2
) return true;
474 if (v1
== nullptr) return v2
->empty();
475 if (v2
== nullptr) return v1
->empty();
476 return v1
->equal(v2
);
478 inline bool equal(const StringData
*v1
, const String
& v2
) {
479 return equal(v1
, v2
.get());
481 inline bool equal(const StringData
*v1
, const char* v2
) = delete;
482 inline bool equal(const StringData
*v1
, const Array
& v2
) {
483 if (LIKELY(v2
.isPHPArray())) {
484 if (v1
== nullptr || v2
.get() == nullptr) {
485 return equal(v1
? v1
->toBoolean() : false, v2
.toBoolean());
490 inline bool equal(const StringData
*v1
, const Object
& v2
) = delete;
491 inline bool equal(const StringData
*v1
, const Resource
& v2
) = delete;
492 inline bool equal(const StringData
*v1
, const Variant
& v2
) {
493 return equal(v2
, v1
);
496 inline bool nequal(const StringData
* v1
, const StringData
* v2
) {
497 return !equal(v1
, v2
);
499 inline bool nequal(const StringData
* v1
, int64_t v2
) {
500 return !equal(v1
, v2
);
503 inline bool less(const StringData
*v1
, bool v2
) { return more(v2
, v1
); }
504 inline bool less(const StringData
*v1
, int v2
) = delete;
505 inline bool less(const StringData
*v1
, int64_t v2
) { return more(v2
, v1
); }
506 inline bool less(const StringData
*v1
, double v2
) { return more(v2
, v1
); }
507 inline bool less(const StringData
*v1
, const StringData
*v2
) {
508 if (v1
== v2
|| v2
== nullptr) return false;
509 if (v1
== nullptr) return !v2
->empty();
510 return v1
->compare(v2
) < 0;
512 inline bool less(const StringData
*v1
, const String
& v2
) {
513 return less(v1
, v2
.get());
515 inline bool less(const StringData
*v1
, const char* v2
) = delete;
516 inline bool less(const StringData
*v1
, const Array
& v2
) {
517 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
518 if (v2
.isVecArray()) throw_vec_compare_exception();
519 if (v2
.isDict()) throw_dict_compare_exception();
520 assertx(v2
.isKeyset());
521 throw_keyset_compare_exception();
523 inline bool less(const StringData
*v1
, const Object
& v2
) = delete;
524 inline bool less(const StringData
*v1
, const Resource
& v2
) = delete;
525 inline bool less(const StringData
*v1
, const Variant
& v2
) {
529 inline bool lessEqual(const StringData
* v1
, const StringData
* v2
) {
530 if (v1
== v2
|| v1
== nullptr) return true;
531 if (v2
== nullptr) return v1
->empty();
532 return v1
->compare(v2
) <= 0;
534 inline bool lessEqual(const StringData
* v1
, int64_t v2
) {
535 return moreEqual(v2
, v1
);
538 inline bool more(const StringData
*v1
, bool v2
) { return less(v2
, v1
); }
539 inline bool more(const StringData
*v1
, int v2
) = delete;
540 inline bool more(const StringData
*v1
, int64_t v2
) { return less(v2
, v1
); }
541 inline bool more(const StringData
*v1
, double v2
) { return less(v2
, v1
); }
542 inline bool more(const StringData
*v1
, const StringData
*v2
) {
543 if (v1
== nullptr) return false;
544 if (v2
== nullptr) return !v1
->empty();
545 return v1
->compare(v2
) > 0;
547 inline bool more(const StringData
*v1
, const String
& v2
) {
548 return more(v1
, v2
.get());
550 inline bool more(const StringData
*v1
, const char* v2
) = delete;
551 inline bool more(const StringData
*v1
, const Array
& v2
) {
552 if (v2
.isPHPArray()) throw_arr_non_arr_compare_exception();
553 if (v2
.isVecArray()) throw_vec_compare_exception();
554 if (v2
.isDict()) throw_dict_compare_exception();
555 assertx(v2
.isKeyset());
556 throw_keyset_compare_exception();
558 inline bool more(const StringData
*v1
, const Object
& v2
) = delete;
559 inline bool more(const StringData
*v1
, const Resource
& v2
) = delete;
560 inline bool more(const StringData
*v1
, const Variant
& v2
) {
564 inline bool moreEqual(const StringData
* v1
, const StringData
* v2
) {
565 return lessEqual(v2
, v1
);
567 inline bool moreEqual(const StringData
* v1
, int64_t v2
) {
568 return lessEqual(v2
, v1
);
571 int64_t compare(const StringData
* v1
, int64_t v2
);
572 inline int64_t compare(const StringData
* v1
, const StringData
* v2
) {
575 // Clamp return values to just -1, 0, 1.
576 auto cmp
= v1
->compare(v2
);
577 return (cmp
< 0) ? -1 : ((cmp
> 0) ? 1 : 0);
580 ///////////////////////////////////////////////////////////////////////////////
583 inline bool same(const String
& v1
, bool v2
) { return same(v2
, v1
); }
584 inline bool same(const String
& v1
, int v2
) = delete;
585 inline bool same(const String
& v1
, int64_t v2
) { return same(v2
, v1
); }
586 inline bool same(const String
& v1
, double v2
) { return same(v2
, v1
); }
587 inline bool same(const String
& v1
, const StringData
*v2
) {
588 return same(v2
, v1
.get());
590 inline bool same(const String
& v1
, const String
& v2
) { return v1
.same(v2
); }
591 inline bool same(const String
& v1
, const char* v2
) = delete;
592 inline bool same(const String
& v1
, const Array
& v2
) {
593 return same(v1
.get(), v2
);
595 inline bool same(const String
& v1
, const Object
& v2
) = delete;
596 inline bool same(const String
& v1
, const Resource
& v2
) = delete;
597 inline bool same(const String
& v1
, const Variant
& v2
) { return same(v2
, v1
); }
599 inline bool equal(const String
& v1
, bool v2
) { return equal(v2
, v1
); }
600 inline bool equal(const String
& v1
, int v2
) = delete;
601 inline bool equal(const String
& v1
, int64_t v2
) { return equal(v2
, v1
); }
602 inline bool equal(const String
& v1
, double v2
) { return equal(v2
, v1
); }
603 inline bool equal(const String
& v1
, const StringData
*v2
) {
604 return equal(v2
, v1
.get());
606 inline bool equal(const String
& v1
, const String
& v2
) { return v1
.equal(v2
); }
607 inline bool equal(const String
& v1
, const char* v2
) = delete;
608 inline bool equal(const String
& v1
, const Array
& v2
) {
609 return equal(v1
.get(), v2
);
611 inline bool equal(const String
& v1
, const Object
& v2
) = delete;
612 inline bool equal(const String
& v1
, const Resource
& v2
) = delete;
613 inline bool equal(const String
& v1
, const Variant
& v2
) { return equal(v2
, v1
); }
615 inline bool less(const String
& v1
, bool v2
) { return more(v2
, v1
); }
616 inline bool less(const String
& v1
, int v2
) = delete;
617 inline bool less(const String
& v1
, int64_t v2
) { return more(v2
, v1
); }
618 inline bool less(const String
& v1
, double v2
) { return more(v2
, v1
); }
619 inline bool less(const String
& v1
, const StringData
*v2
) {
620 return more(v2
, v1
.get());
622 inline bool less(const String
& v1
, const String
& v2
) { return v1
.less(v2
); }
623 inline bool less(const String
& v1
, const char* v2
) = delete;
624 inline bool less(const String
& v1
, const Array
& v2
) {
625 return less(v1
.get(), v2
);
627 inline bool less(const String
& v1
, const Object
& v2
) = delete;
628 inline bool less(const String
& v1
, const Resource
& v2
) = delete;
629 inline bool less(const String
& v1
, const Variant
& v2
) { return more(v2
, v1
); }
631 inline bool more(const String
& v1
, bool v2
) { return less(v2
, v1
); }
632 inline bool more(const String
& v1
, int v2
) = delete;
633 inline bool more(const String
& v1
, int64_t v2
) { return less(v2
, v1
); }
634 inline bool more(const String
& v1
, double v2
) { return less(v2
, v1
); }
635 inline bool more(const String
& v1
, const StringData
*v2
) {
636 return less(v2
, v1
.get());
638 inline bool more(const String
& v1
, const String
& v2
) { return v1
.more(v2
); }
639 inline bool more(const String
& v1
, const char* v2
) = delete;
640 inline bool more(const String
& v1
, const Array
& v2
) {
641 return more(v1
.get(), v2
);
643 inline bool more(const String
& v1
, const Object
& v2
) = delete;
644 inline bool more(const String
& v1
, const Resource
& v2
) = delete;
645 inline bool more(const String
& v1
, const Variant
& v2
) { return less(v2
, v1
); }
647 ///////////////////////////////////////////////////////////////////////////////
648 // const char* as first arg (deprecated)
650 inline bool same(const char* v1
, bool v2
) = delete;
651 inline bool same(const char* v1
, int v2
) = delete;
652 inline bool same(const char* v1
, int64_t v2
) = delete;
653 inline bool same(const char* v1
, double v2
) = delete;
654 inline bool same(const char* v1
, const StringData
*v2
) = delete;
655 inline bool same(const char* v1
, const String
& v2
) = delete;
656 inline bool same(const char* v1
, const char* v2
) = delete;
657 inline bool same(const char* v1
, const Array
& v2
) = delete;
658 inline bool same(const char* v1
, const Object
& v2
) = delete;
659 inline bool same(const char* v1
, const Resource
& v2
) = delete;
660 inline bool same(const char* v1
, const Variant
& v2
) = delete;
662 inline bool equal(const char* v1
, bool v2
)= delete;
663 inline bool equal(const char* v1
, int v2
)= delete;
664 inline bool equal(const char* v1
, int64_t v2
)= delete;
665 inline bool equal(const char* v1
, double v2
)= delete;
666 inline bool equal(const char* v1
, const StringData
*v2
)= delete;
667 inline bool equal(const char* v1
, const String
& v2
)= delete;
668 inline bool equal(const char* v1
, const char* v2
)= delete;
669 inline bool equal(const char* v1
, const Array
& v2
)= delete;
670 inline bool equal(const char* v1
, const Object
& v2
)= delete;
671 inline bool equal(const char* v1
, const Resource
& v2
)= delete;
672 inline bool equal(const char* v1
, const Variant
& v2
)= delete;
674 inline bool less(const char* v1
, bool v2
) = delete;
675 inline bool less(const char* v1
, int v2
) = delete;
676 inline bool less(const char* v1
, int64_t v2
) = delete;
677 inline bool less(const char* v1
, double v2
) = delete;
678 inline bool less(const char* v1
, const StringData
*v2
) = delete;
679 inline bool less(const char* v1
, const String
& v2
) = delete;
680 inline bool less(const char* v1
, const char* v2
) = delete;
681 inline bool less(const char* v1
, const Array
& v2
) = delete;
682 inline bool less(const char* v1
, const Object
& v2
) = delete;
683 inline bool less(const char* v1
, const Resource
& v2
) = delete;
684 inline bool less(const char* v1
, const Variant
& v2
) = delete;
686 inline bool more(const char* v1
, bool v2
) = delete;
687 inline bool more(const char* v1
, int v2
) = delete;
688 inline bool more(const char* v1
, int64_t v2
) = delete;
689 inline bool more(const char* v1
, double v2
) = delete;
690 inline bool more(const char* v1
, const StringData
*v2
) = delete;
691 inline bool more(const char* v1
, const String
& v2
) = delete;
692 inline bool more(const char* v1
, const char* v2
) = delete;
693 inline bool more(const char* v1
, const Array
& v2
) = delete;
694 inline bool more(const char* v1
, const Object
& v2
) = delete;
695 inline bool more(const char* v1
, const Resource
& v2
) = delete;
696 inline bool more(const char* v1
, const Variant
& v2
) = delete;
698 ///////////////////////////////////////////////////////////////////////////////
701 inline bool same(const Array
& v1
, bool v2
) { return same(v2
, v1
); }
702 inline bool same(const Array
& v1
, int v2
) = delete;
703 inline bool same(const Array
& v1
, int64_t v2
) { return same(v2
, v1
); }
704 inline bool same(const Array
& v1
, double v2
) { return same(v2
, v1
); }
705 inline bool same(const Array
& v1
, const StringData
*v2
) { return same(v2
, v1
); }
706 inline bool same(const Array
& v1
, const String
& v2
) { return same(v2
, v1
); }
707 inline bool same(const Array
& v1
, const char* v2
) = delete;
708 inline bool same(const Array
& v1
, const Array
& v2
) { return v1
.same(v2
); }
709 inline bool same(const Array
& v1
, const Object
& v2
) = delete;
710 inline bool same(const Array
& /*v1*/, const Resource
& /*v2*/) = delete;
711 inline bool same(const Array
& v1
, const Variant
& v2
) { return same(v2
, v1
); }
713 inline bool equal(const Array
& v1
, bool v2
) { return equal(v2
, v1
); }
714 inline bool equal(const Array
& v1
, int v2
) = delete;
715 inline bool equal(const Array
& v1
, int64_t v2
) { return equal(v2
, v1
); }
716 inline bool equal(const Array
& v1
, double v2
) { return equal(v2
, v1
); }
717 inline bool equal(const Array
& v1
, const StringData
*v2
) {
718 return equal(v2
, v1
);
720 inline bool equal(const Array
& v1
, const String
& v2
) { return equal(v2
, v1
); }
721 inline bool equal(const Array
& v1
, const char* v2
) = delete;
722 inline bool equal(const Array
& v1
, const Array
& v2
) { return v1
.equal(v2
); }
723 inline bool equal(const Array
& v1
, const Object
& v2
) = delete;
724 inline bool equal(const Array
& /*v1*/, const Resource
& /*v2*/) = delete;
725 inline bool equal(const Array
& v1
, const Variant
& v2
) { return equal(v2
, v1
); }
727 inline bool less(const Array
& v1
, bool v2
) { return more(v2
, v1
); }
728 inline bool less(const Array
& v1
, int v2
) = delete;
729 inline bool less(const Array
& v1
, int64_t v2
) { return more(v2
, v1
); }
730 inline bool less(const Array
& v1
, double v2
) { return more(v2
, v1
); }
731 inline bool less(const Array
& v1
, const StringData
*v2
) { return more(v2
, v1
); }
732 inline bool less(const Array
& v1
, const String
& v2
) { return more(v2
, v1
); }
733 inline bool less(const Array
& v1
, const char* v2
) = delete;
734 inline bool less(const Array
& v1
, const Array
& v2
) { return v1
.less(v2
); }
735 inline bool less(const Array
& v1
, const Object
& v2
) = delete;
736 inline bool less(const Array
& v1
, const Resource
& /*v2*/) = delete;
737 inline bool less(const Array
& v1
, const Variant
& v2
) { return v1
.less(v2
); }
739 inline bool more(const Array
& v1
, bool v2
) { return less(v2
, v1
); }
740 inline bool more(const Array
& v1
, int v2
) = delete;
741 inline bool more(const Array
& v1
, int64_t v2
) { return less(v2
, v1
); }
742 inline bool more(const Array
& v1
, double v2
) { return less(v2
, v1
); }
743 inline bool more(const Array
& v1
, const StringData
*v2
) { return less(v2
, v1
); }
744 inline bool more(const Array
& v1
, const String
& v2
) { return less(v2
, v1
); }
745 inline bool more(const Array
& v1
, const char* v2
) = delete;
746 inline bool more(const Array
& v1
, const Array
& v2
) { return v1
.more(v2
); }
747 inline bool more(const Array
& v1
, const Object
& v2
) = delete;
748 inline bool more(const Array
& v1
, const Resource
& /*v2*/) = delete;
749 inline bool more(const Array
& v1
, const Variant
& v2
) { return v1
.more(v2
); }
751 ///////////////////////////////////////////////////////////////////////////////
754 inline bool same(const Object
& v1
, bool v2
) = delete;
755 inline bool same(const Object
& v1
, int v2
) = delete;
756 inline bool same(const Object
& v1
, int64_t v2
) = delete;
757 inline bool same(const Object
& v1
, double v2
) = delete;
758 inline bool same(const Object
& v1
, const StringData
*v2
) = delete;
759 inline bool same(const Object
& v1
, const String
& v2
) = delete;
760 inline bool same(const Object
& v1
, const char* v2
) = delete;
761 inline bool same(const Object
& v1
, const Array
& v2
) = delete;
762 inline bool same(const Object
& v1
, const Object
& v2
) = delete;
763 inline bool same(const Object
& /*v1*/, const Resource
& /*v2*/) = delete;
764 inline bool same(const Object
& v1
, const Variant
& v2
) = delete;
766 inline bool equal(const Object
& v1
, bool v2
) = delete;
767 inline bool equal(const Object
& v1
, int v2
) = delete;
768 inline bool equal(const Object
& v1
, int64_t v2
) = delete;
769 inline bool equal(const Object
& v1
, double v2
) = delete;
770 inline bool equal(const Object
& v1
, const StringData
*v2
) = delete;
771 inline bool equal(const Object
& v1
, const String
& v2
) = delete;
772 inline bool equal(const Object
& v1
, const char* v2
) = delete;
773 inline bool equal(const Object
& v1
, const Array
& v2
) = delete;
774 inline bool equal(const Object
& v1
, const Object
& v2
) = delete;
775 inline bool equal(const Object
& /*v1*/, const Resource
& /*v2*/) = delete;
776 inline bool equal(const Object
& v1
, const Variant
& v2
) = delete;
778 inline bool less(const Object
& v1
, bool v2
) = delete;
779 inline bool less(const Object
& v1
, int v2
) = delete;
780 inline bool less(const Object
& v1
, int64_t v2
) = delete;
781 inline bool less(const Object
& v1
, double v2
) = delete;
782 inline bool less(const Object
& v1
, const StringData
*v2
) = delete;
783 inline bool less(const Object
& v1
, const String
& v2
) = delete;
784 inline bool less(const Object
& v1
, const char* v2
) = delete;
785 inline bool less(const Object
& v1
, const Array
& v2
) = delete;
786 inline bool less(const Object
& v1
, const Object
& v2
) = delete;
787 inline bool less(const Object
& /*v1*/, const Resource
& /*v2*/) = delete;
788 inline bool less(const Object
& v1
, const Variant
& v2
) = delete;
790 inline bool more(const Object
& v1
, bool v2
) = delete;
791 inline bool more(const Object
& v1
, int v2
) = delete;
792 inline bool more(const Object
& v1
, int64_t v2
) = delete;
793 inline bool more(const Object
& v1
, double v2
) = delete;
794 inline bool more(const Object
& v1
, const StringData
*v2
) = delete;
795 inline bool more(const Object
& v1
, const String
& v2
) = delete;
796 inline bool more(const Object
& v1
, const char* v2
) = delete;
797 inline bool more(const Object
& v1
, const Array
& v2
) = delete;
798 inline bool more(const Object
& v1
, const Object
& v2
) = delete;
799 inline bool more(const Object
& /*v1*/, const Resource
& /*v2*/) = delete;
800 inline bool more(const Object
& v1
, const Variant
& v2
) = delete;
802 ///////////////////////////////////////////////////////////////////////////////
805 bool same(const ObjectData
* v1
, const Variant
& v2
) = delete;
807 inline bool equal(const ObjectData
* v1
, const ObjectData
* v2
) {
810 return v1
->equal(*v2
);
813 inline bool nequal(const ObjectData
* v1
, const ObjectData
* v2
) {
814 return !equal(v1
, v2
);
817 inline bool less(const ObjectData
* v1
, const ObjectData
* v2
) {
820 return v1
->less(*v2
);
823 inline bool lessEqual(const ObjectData
* v1
, const ObjectData
* v2
) {
826 return v1
->lessEqual(*v2
);
829 inline bool more(const ObjectData
* v1
, const ObjectData
* v2
) {
832 return v1
->more(*v2
);
835 inline bool moreEqual(const ObjectData
* v1
, const ObjectData
* v2
) {
838 return v1
->moreEqual(*v2
);
841 inline int64_t compare(const ObjectData
* v1
, const ObjectData
* v2
) {
844 return v1
->compare(*v2
);
847 ///////////////////////////////////////////////////////////////////////////////
850 inline bool same(const Resource
& v1
, bool v2
) = delete;
851 inline bool same(const Resource
& v1
, int v2
) = delete;
852 inline bool same(const Resource
& v1
, int64_t v2
) = delete;
853 inline bool same(const Resource
& v1
, double v2
) = delete;
854 inline bool same(const Resource
& v1
, const StringData
*v2
) = delete;
855 inline bool same(const Resource
& v1
, const String
& v2
) = delete;
856 inline bool same(const Resource
& v1
, const char* v2
) = delete;
857 inline bool same(const Resource
& /*v1*/, const Array
& /*v2*/) = delete;
858 inline bool same(const Resource
& /*v1*/, const Object
& /*v2*/) = delete;
859 inline bool same(const Resource
& v1
, const Resource
& v2
) = delete;
860 inline bool same(const Resource
& v1
, const Variant
& v2
) = delete;
862 inline bool equal(const Resource
& v1
, bool v2
) = delete;
863 inline bool equal(const Resource
& v1
, int v2
) = delete;
864 inline bool equal(const Resource
& v1
, int64_t v2
) = delete;
865 inline bool equal(const Resource
& v1
, double v2
) = delete;
866 inline bool equal(const Resource
& v1
, const StringData
*v2
) = delete;
867 inline bool equal(const Resource
& v1
, const String
& v2
) = delete;
868 inline bool equal(const Resource
& v1
, const char* v2
) = delete;
869 inline bool equal(const Resource
& /*v1*/, const Array
& /*v2*/) = delete;
870 inline bool equal(const Resource
& /*v1*/, const Object
& /*v2*/) = delete;
871 inline bool equal(const Resource
& v1
, const Resource
& v2
) = delete;
872 inline bool equal(const Resource
& v1
, const Variant
& v2
) = delete;
874 inline bool less(const Resource
& v1
, bool v2
) = delete;
875 inline bool less(const Resource
& v1
, int v2
) = delete;
876 inline bool less(const Resource
& v1
, int64_t v2
) = delete;
877 inline bool less(const Resource
& v1
, double v2
) = delete;
878 inline bool less(const Resource
& v1
, const StringData
*v2
) = delete;
879 inline bool less(const Resource
& v1
, const String
& v2
) = delete;
880 inline bool less(const Resource
& v1
, const char* v2
) = delete;
881 inline bool less(const Resource
& /*v1*/, const Array
& v2
) = delete;
882 inline bool less(const Resource
& /*v1*/, const Object
& /*v2*/) = delete;
883 inline bool less(const Resource
& v1
, const Resource
& v2
) = delete;
884 inline bool less(const Resource
& v1
, const Variant
& v2
) = delete;
886 inline bool more(const Resource
& v1
, bool v2
) = delete;
887 inline bool more(const Resource
& v1
, int v2
) = delete;
888 inline bool more(const Resource
& v1
, int64_t v2
) = delete;
889 inline bool more(const Resource
& v1
, double v2
) = delete;
890 inline bool more(const Resource
& v1
, const StringData
*v2
) = delete;
891 inline bool more(const Resource
& v1
, const String
& v2
) = delete;
892 inline bool more(const Resource
& v1
, const char* v2
) = delete;
893 inline bool more(const Resource
& /*v1*/, const Array
& v2
) = delete;
894 inline bool more(const Resource
& /*v1*/, const Object
& /*v2*/) = delete;
895 inline bool more(const Resource
& v1
, const Resource
& v2
) = delete;
896 inline bool more(const Resource
& v1
, const Variant
& v2
) = delete;
898 ///////////////////////////////////////////////////////////////////////////////
901 inline bool equal(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
905 inline bool nequal(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
909 inline bool less(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
912 return v1
->data()->o_toInt64() < v2
->data()->o_toInt64();
915 inline bool lessEqual(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
916 return less(v1
, v2
) || equal(v1
, v2
);
919 inline bool more(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
922 return v1
->data()->o_toInt64() > v2
->data()->o_toInt64();
925 inline bool moreEqual(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
926 return more(v1
, v2
) || equal(v1
, v2
);
929 inline int64_t compare(const ResourceHdr
* v1
, const ResourceHdr
* v2
) {
932 auto id1
= v1
->data()->o_toInt64();
933 auto id2
= v2
->data()->o_toInt64();
934 return (id1
< id2
) ? -1 : ((id1
> id2
) ? 1 : 0);
937 ///////////////////////////////////////////////////////////////////////////////
940 #endif // incl_HPHP_COMPARISONS_H_