track total size of static array and Unit/Class/Func
[hiphop-php.git] / hphp / runtime / base / comparisons.h
blobd98701b3abc05326f36f9c9e5e2398531ec9a5f3
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
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"
24 namespace HPHP {
26 ///////////////////////////////////////////////////////////////////////////////
27 // Variant
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 ///////////////////////////////////////////////////////////////////////////////
133 // bool
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*/) {
140 return false;
142 inline bool same(bool /*v1*/, const String& /*v2*/) {
143 return false;
145 inline bool same(bool v1, const char* v2) = delete;
146 inline bool same(bool /*v1*/, const Array& /*v2*/) {
147 return false;
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();
164 return false;
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 ///////////////////////////////////////////////////////////////////////////////
213 // int
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 ///////////////////////////////////////////////////////////////////////////////
266 // int64
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*/) {
273 return false;
275 inline bool same(int64_t /*v1*/, const String& /*v2*/) {
276 return false;
278 inline bool same(int64_t v1, const char* v2) = delete;
279 inline bool same(int64_t /*v1*/, const Array& /*v2*/) {
280 return false;
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*/) {
294 return false;
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) {
323 return more(v2, v1);
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 ///////////////////////////////////////////////////////////////////////////////
353 // double
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*/) {
360 return false;
362 inline bool same(double /*v1*/, const String& /*v2*/) {
363 return false;
365 inline bool same(double v1, const char* v2) = delete;
366 inline bool same(double /*v1*/, const Array& /*v2*/) {
367 return false;
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*/) {
383 return false;
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) {
410 return more(v2, v1);
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
435 // behavior).
436 return (v1 == v2) ? 0 : ((v1 > v2) ? 1 : -1);
439 ///////////////////////////////////////////////////////////////////////////////
440 // StringData *
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);
449 return false;
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*/) {
456 return false;
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) {
461 return same(v2, v1);
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());
488 return false;
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) {
526 return more(v2, v1);
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) {
561 return less(v2, v1);
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) {
573 assertx(v1);
574 assertx(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 ///////////////////////////////////////////////////////////////////////////////
581 // String
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 ///////////////////////////////////////////////////////////////////////////////
699 // Array
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 ///////////////////////////////////////////////////////////////////////////////
752 // Object
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 ///////////////////////////////////////////////////////////////////////////////
803 // ObjectData*
805 bool same(const ObjectData* v1, const Variant& v2) = delete;
807 inline bool equal(const ObjectData* v1, const ObjectData* v2) {
808 assertx(v1);
809 assertx(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) {
818 assertx(v1);
819 assertx(v2);
820 return v1->less(*v2);
823 inline bool lessEqual(const ObjectData* v1, const ObjectData* v2) {
824 assertx(v1);
825 assertx(v2);
826 return v1->lessEqual(*v2);
829 inline bool more(const ObjectData* v1, const ObjectData* v2) {
830 assertx(v1);
831 assertx(v2);
832 return v1->more(*v2);
835 inline bool moreEqual(const ObjectData* v1, const ObjectData* v2) {
836 assertx(v1);
837 assertx(v2);
838 return v1->moreEqual(*v2);
841 inline int64_t compare(const ObjectData* v1, const ObjectData* v2) {
842 assertx(v1);
843 assertx(v2);
844 return v1->compare(*v2);
847 ///////////////////////////////////////////////////////////////////////////////
848 // Resource
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 ///////////////////////////////////////////////////////////////////////////////
899 // ResourceHdr*
901 inline bool equal(const ResourceHdr* v1, const ResourceHdr* v2) {
902 return v1 == v2;
905 inline bool nequal(const ResourceHdr* v1, const ResourceHdr* v2) {
906 return v1 != v2;
909 inline bool less(const ResourceHdr* v1, const ResourceHdr* v2) {
910 assertx(v1);
911 assertx(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) {
920 assertx(v1);
921 assertx(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) {
930 assertx(v1);
931 assertx(v1);
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_