Arquivos
hhvm/hphp/runtime/base/comparisons.h
T
aalexandre 26178124a4 Eliminate int32, uint32, int16, uint16, int8, uint8.
This concludes the inttypes replacement.
These replacement have been mostly mechanical
with the use of cxx_replace.
2013-03-09 10:25:16 -08:00

816 linhas
38 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef __HPHP_COMPARISONS_H__
#define __HPHP_COMPARISONS_H__
#include <runtime/base/type_conversions.h>
#include <runtime/base/builtin_functions.h>
#include <runtime/base/complex_types.h>
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
// Variant
inline bool same(CVarRef v1, bool v2) { return v1.same(v2);}
inline bool same(CVarRef v1, int v2) { return v1.same(v2);}
inline bool same(CVarRef v1, int64_t v2) { return v1.same(v2);}
inline bool same(CVarRef v1, double v2) { return v1.same(v2);}
inline bool same(CVarRef v1, const StringData *v2) { return v1.same(v2);}
inline bool same(CVarRef v1, CStrRef v2) { return v1.same(v2);}
inline bool same(CVarRef v1, litstr v2) { return v1.same(v2);}
inline bool same(CVarRef v1, CArrRef v2) { return v1.same(v2);}
inline bool same(CVarRef v1, CObjRef v2) { return v1.same(v2);}
inline bool same(CVarRef v1, CVarRef v2) { return v1.same(v2);}
inline bool equal(CVarRef v1, bool v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, int v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, int64_t v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, double v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, const StringData *v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, CStrRef v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, litstr v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, CArrRef v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, CObjRef v2) { return v1.equal(v2);}
inline bool equal(CVarRef v1, CVarRef v2) { return v1.equal(v2);}
inline bool equalAsStr(CVarRef v1, bool v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, int v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, int64_t v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, double v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, const StringData *v2) {
return v1.equalAsStr(v2);
}
inline bool equalAsStr(CVarRef v1, CStrRef v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, litstr v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, CArrRef v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, CObjRef v2) { return v1.equalAsStr(v2);}
inline bool equalAsStr(CVarRef v1, CVarRef v2) { return v1.equalAsStr(v2);}
inline bool less(CVarRef v1, bool v2) { return v1.less(v2);}
inline bool less(CVarRef v1, int v2) { return v1.less(v2);}
inline bool less(CVarRef v1, int64_t v2) { return v1.less(v2);}
inline bool less(CVarRef v1, double v2) { return v1.less(v2);}
inline bool less(CVarRef v1, const StringData *v2) { return v1.less(v2);}
inline bool less(CVarRef v1, CStrRef v2) { return v1.less(v2);}
inline bool less(CVarRef v1, litstr v2) { return v1.less(v2);}
inline bool less(CVarRef v1, CArrRef v2) { return v1.less(v2);}
inline bool less(CVarRef v1, CObjRef v2) { return v1.less(v2);}
inline bool less(CVarRef v1, CVarRef v2) { return v1.less(v2);}
inline bool more(CVarRef v1, bool v2) { return v1.more(v2);}
inline bool more(CVarRef v1, int v2) { return v1.more(v2);}
inline bool more(CVarRef v1, int64_t v2) { return v1.more(v2);}
inline bool more(CVarRef v1, double v2) { return v1.more(v2);}
inline bool more(CVarRef v1, const StringData *v2) { return v1.more(v2);}
inline bool more(CVarRef v1, CStrRef v2) { return v1.more(v2);}
inline bool more(CVarRef v1, litstr v2) { return v1.more(v2);}
inline bool more(CVarRef v1, CArrRef v2) { return v1.more(v2);}
inline bool more(CVarRef v1, CObjRef v2) { return v1.more(v2);}
inline bool more(CVarRef v1, CVarRef v2) { return v1.more(v2);}
///////////////////////////////////////////////////////////////////////////////
// bool
inline bool same(bool v1, bool v2) { return v1 == v2;}
inline bool same(bool v1, int v2) { return false;}
inline bool same(bool v1, int64_t v2) { return false;}
inline bool same(bool v1, double v2) { return false;}
inline bool same(bool v1, const StringData *v2) { return false;}
inline bool same(bool v1, CStrRef v2) { return false;}
inline bool same(bool v1, litstr v2) { return false;}
inline bool same(bool v1, CArrRef v2) { return false;}
inline bool same(bool v1, CObjRef v2) { return false;}
inline bool same(bool v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(bool v1, bool v2) { return v1 == v2;}
inline bool equal(bool v1, int v2) { return v1 == (v2 != 0);}
inline bool equal(bool v1, int64_t v2) { return v1 == (v2 != 0);}
inline bool equal(bool v1, double v2) { return v1 == (v2 != 0.0);}
inline bool equal(bool v1, const StringData *v2) { return v1 == toBoolean(v2);}
inline bool equal(bool v1, CStrRef v2) { return v1 == v2.toBoolean();}
inline bool equal(bool v1, litstr v2) { return equal(v1, String(v2));}
inline bool equal(bool v1, CArrRef v2) { return v1 == v2.toBoolean();}
inline bool equal(bool v1, CObjRef v2) { return v1 == v2.toBoolean();}
inline bool equal(bool v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(bool v1, bool v2) { return v1 == v2;}
inline bool equalAsStr(bool v1, int v2) { return v1 && v2 == 1;}
inline bool equalAsStr(bool v1, int64_t v2) { return v1 && v2 == 1;}
inline bool equalAsStr(bool v1, double v2) { return v1 && v2 == 1;}
bool equalAsStr(bool v1, const StringData *v2);
inline bool equalAsStr(bool v1, CStrRef v2) { return equalAsStr(v1, v2.get());}
inline bool equalAsStr(bool v1, litstr v2) {
return equalAsStr(v1, String(v2));
}
inline bool equalAsStr(bool v1, CArrRef v2) { return false;}
inline bool equalAsStr(bool v1, CObjRef v2) { return false;}
inline bool equalAsStr(bool v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(bool v1, bool v2) { return (v1?1:0) < (v2?1:0);}
inline bool less(bool v1, int v2) { return less(v1,(v2 != 0));}
inline bool less(bool v1, int64_t v2) { return less(v1,(v2 != 0));}
inline bool less(bool v1, double v2) { return less(v1,(v2 != 0.0));}
inline bool less(bool v1, const StringData *v2) {
return less(v1,toBoolean(v2));
}
inline bool less(bool v1, CStrRef v2) { return less(v1,v2.toBoolean());}
inline bool less(bool v1, litstr v2) { return less(v1,String(v2));}
inline bool less(bool v1, CArrRef v2) { return less(v1,v2.toBoolean());}
inline bool less(bool v1, CObjRef v2) { return less(v1,v2.toBoolean());}
inline bool less(bool v1, CVarRef v2) { return more(v2,v1);}
inline bool more(bool v1, bool v2) { return (v1?1:0) > (v2?1:0);}
inline bool more(bool v1, int v2) { return more(v1,(v2 != 0));}
inline bool more(bool v1, int64_t v2) { return more(v1,(v2 != 0));}
inline bool more(bool v1, double v2) { return more(v1,(v2 != 0.0));}
inline bool more(bool v1, const StringData *v2) {
return more(v1,toBoolean(v2));
}
inline bool more(bool v1, CStrRef v2) { return more(v1,v2.toBoolean());}
inline bool more(bool v1, litstr v2) { return more(v1,String(v2));}
inline bool more(bool v1, CArrRef v2) { return more(v1,v2.toBoolean());}
inline bool more(bool v1, CObjRef v2) { return more(v1,v2.toBoolean());}
inline bool more(bool v1, CVarRef v2) { return less(v2,v1);}
///////////////////////////////////////////////////////////////////////////////
// int
inline bool same(int v1, bool v2) { return same(v2, v1);}
inline bool same(int v1, int v2) { return v1 == v2;}
inline bool same(int v1, int64_t v2) { return v1 == v2;}
inline bool same(int v1, double v2) { return (double)v1 == v2;}
inline bool same(int v1, const StringData *v2) { return false;}
inline bool same(int v1, CStrRef v2) { return false;}
inline bool same(int v1, litstr v2) { return false;}
inline bool same(int v1, CArrRef v2) { return false;}
inline bool same(int v1, CObjRef v2) { return false;}
inline bool same(int v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(int v1, bool v2) { return equal(v2, v1);}
inline bool equal(int v1, int v2) { return v1 == v2;}
inline bool equal(int v1, int64_t v2) { return v1 == v2;}
inline bool equal(int v1, double v2) { return (double)v1 == v2;}
bool equal(int v1, const StringData *v2);
inline bool equal(int v1, CStrRef v2) { return equal(v1, v2.get());}
inline bool equal(int v1, litstr v2) { return equal(v1, String(v2));}
inline bool equal(int v1, CArrRef v2) { return false;}
inline bool equal(int v1, CObjRef v2) {
return v2->isCollection() ? false : equal(v1, v2.toInt64());
}
inline bool equal(int v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(int v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(int v1, int v2) { return v1 == v2;}
inline bool equalAsStr(int v1, int64_t v2) { return v1 == v2;}
inline bool equalAsStr(int v1, double v2) { return v1 == v2;}
bool equalAsStr(int v1, const StringData *v2);
inline bool equalAsStr(int v1, CStrRef v2) { return equalAsStr(v1, v2.get());}
inline bool equalAsStr(int v1, litstr v2) { return equalAsStr(v1, String(v2));}
inline bool equalAsStr(int v1, CArrRef v2) { return false;}
inline bool equalAsStr(int v1, CObjRef v2) {
return equalAsStr(v1, v2.toString());
}
inline bool equalAsStr(int v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(int v1, bool v2) { return more(v2, v1);}
inline bool less(int v1, int v2) { return v1 < v2;}
inline bool less(int v1, int64_t v2) { return v1 < v2;}
inline bool less(int v1, double v2) { return v1 < v2;}
bool less(int v1, const StringData *v2);
inline bool less(int v1, CStrRef v2) { return less(v1, v2.get());}
inline bool less(int v1, litstr v2) { return less(v1, String(v2));}
inline bool less(int v1, CArrRef v2) { return true;}
inline bool less(int v1, CObjRef v2) {
return less(v1, v2.toInt64ForCompare());
}
inline bool less(int v1, CVarRef v2) { return more(v2, v1);}
inline bool more(int v1, bool v2) { return less(v2, v1);}
inline bool more(int v1, int v2) { return v1 > v2;}
inline bool more(int v1, int64_t v2) { return v1 > v2;}
inline bool more(int v1, double v2) { return v1 > v2;}
bool more(int v1, const StringData *v2);
inline bool more(int v1, CStrRef v2) { return more(v1, v2.get());}
inline bool more(int v1, litstr v2) { return more(v1, String(v2));}
inline bool more(int v1, CArrRef v2) { return false;}
inline bool more(int v1, CObjRef v2) {
return more(v1, v2.toInt64ForCompare());
}
inline bool more(int v1, CVarRef v2) { return less(v2, v1);}
///////////////////////////////////////////////////////////////////////////////
// int64
inline bool same(int64_t v1, bool v2) { return same(v2, v1);}
inline bool same(int64_t v1, int v2) { return same(v2, v1);}
inline bool same(int64_t v1, int64_t v2) { return v1 == v2;}
inline bool same(int64_t v1, double v2) { return (double)v1 == v2;}
inline bool same(int64_t v1, const StringData *v2) { return false;}
inline bool same(int64_t v1, CStrRef v2) { return false;}
inline bool same(int64_t v1, litstr v2) { return false;}
inline bool same(int64_t v1, CArrRef v2) { return false;}
inline bool same(int64_t v1, CObjRef v2) { return false;}
inline bool same(int64_t v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(int64_t v1, bool v2) { return equal(v2, v1);}
inline bool equal(int64_t v1, int v2) { return equal(v2, v1);}
inline bool equal(int64_t v1, int64_t v2) { return v1 == v2;}
inline bool equal(int64_t v1, double v2) { return (double)v1 == v2;}
bool equal(int64_t v1, const StringData *v2);
inline bool equal(int64_t v1, CStrRef v2) { return equal(v1, v2.get());}
inline bool equal(int64_t v1, litstr v2) { return equal(v1, String(v2));}
inline bool equal(int64_t v1, CArrRef v2) { return false;}
inline bool equal(int64_t v1, CObjRef v2) {
return v2->isCollection() ? false : equal(v1, v2.toInt64());
}
inline bool equal(int64_t v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(int64_t v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(int64_t v1, int v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(int64_t v1, int64_t v2) { return v1 == v2;}
inline bool equalAsStr(int64_t v1, double v2) {
return v1 == v2 && v1 == (int64_t)v2;
}
bool equalAsStr(int64_t v1, const StringData *v2);
inline bool equalAsStr(int64_t v1, CStrRef v2) { return equalAsStr(v1, v2.get());}
bool equalAsStr(int64_t v1, litstr v2);
inline bool equalAsStr(int64_t v1, CArrRef v2) { return false;}
inline bool equalAsStr(int64_t v1, CObjRef v2) {
return equalAsStr(v1, v2.toString());
}
inline bool equalAsStr(int64_t v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(int64_t v1, bool v2) { return more(v2, v1);}
inline bool less(int64_t v1, int v2) { return more(v2, v1);}
inline bool less(int64_t v1, int64_t v2) { return v1 < v2;}
inline bool less(int64_t v1, double v2) { return v1 < v2;}
bool less(int64_t v1, const StringData *v2);
inline bool less(int64_t v1, CStrRef v2) { return less(v1, v2.get());}
inline bool less(int64_t v1, litstr v2) { return less(v1, String(v2));}
inline bool less(int64_t v1, CArrRef v2) { return true;}
inline bool less(int64_t v1, CObjRef v2) {
return less(v1, v2.toInt64ForCompare());
}
inline bool less(int64_t v1, CVarRef v2) { return more(v2, v1);}
inline bool more(int64_t v1, bool v2) { return less(v2, v1);}
inline bool more(int64_t v1, int v2) { return less(v2, v1);}
inline bool more(int64_t v1, int64_t v2) { return v1 > v2;}
inline bool more(int64_t v1, double v2) { return v1 > v2;}
bool more(int64_t v1, const StringData *v2);
inline bool more(int64_t v1, CStrRef v2) { return more(v1, v2.get());}
inline bool more(int64_t v1, litstr v2) { return more(v1, String(v2));}
inline bool more(int64_t v1, CArrRef v2) { return false;}
inline bool more(int64_t v1, CObjRef v2) {
return more(v1, v2.toInt64ForCompare());
}
inline bool more(int64_t v1, CVarRef v2) { return less(v2, v1);}
///////////////////////////////////////////////////////////////////////////////
// double
inline bool same(double v1, bool v2) { return same(v2, v1);}
inline bool same(double v1, int v2) { return same(v2, v1);}
inline bool same(double v1, int64_t v2) { return same(v2, v1);}
inline bool same(double v1, double v2) { return v1 == v2;}
inline bool same(double v1, const StringData *v2) { return false;}
inline bool same(double v1, CStrRef v2) { return false;}
inline bool same(double v1, litstr v2) { return false;}
inline bool same(double v1, CArrRef v2) { return false;}
inline bool same(double v1, CObjRef v2) { return false;}
inline bool same(double v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(double v1, bool v2) { return equal(v2, v1);}
inline bool equal(double v1, int v2) { return equal(v2, v1);}
inline bool equal(double v1, int64_t v2) { return equal(v2, v1);}
inline bool equal(double v1, double v2) { return v1 == v2;}
inline bool equal(double v1, const StringData *v2) {
return v1 == toDouble(v2);
}
inline bool equal(double v1, CStrRef v2) { return v1 == v2.toDouble();}
inline bool equal(double v1, litstr v2) { return equal(v1,String(v2));}
inline bool equal(double v1, CArrRef v2) { return false;}
inline bool equal(double v1, CObjRef v2) {
if (v2->isCollection()) return false;
return equal(v1, v2.toDouble());
}
inline bool equal(double v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(double v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(double v1, int v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(double v1, int64_t v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(double v1, double v2) { return v1 == v2;}
bool equalAsStr(double v1, const StringData *v2);
inline bool equalAsStr(double v1, CStrRef v2) {
return equalAsStr(v1, v2.get());
}
bool equalAsStr(double v1, litstr v2);
inline bool equalAsStr(double v1, CArrRef v2) { return false;}
inline bool equalAsStr(double v1, CObjRef v2) {
return equalAsStr(v1, v2.toString());
}
inline bool equalAsStr(double v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(double v1, bool v2) { return more(v2, v1);}
inline bool less(double v1, int v2) { return more(v2, v1);}
inline bool less(double v1, int64_t v2) { return more(v2, v1);}
inline bool less(double v1, double v2) { return v1 < v2;}
inline bool less(double v1, const StringData *v2) {
return less(v1,toDouble(v2));
}
inline bool less(double v1, CStrRef v2) { return less(v1,v2.toDouble());}
inline bool less(double v1, litstr v2) { return less(v1,String(v2));}
inline bool less(double v1, CArrRef v2) { return true;}
inline bool less(double v1, CObjRef v2) {
return less(v1, v2.toDoubleForCompare());
}
inline bool less(double v1, CVarRef v2) { return more(v2, v1);}
inline bool more(double v1, bool v2) { return less(v2, v1);}
inline bool more(double v1, int v2) { return less(v2, v1);}
inline bool more(double v1, int64_t v2) { return less(v2, v1);}
inline bool more(double v1, double v2) { return v1 > v2;}
inline bool more(double v1, const StringData *v2) {
return more(v1,toDouble(v2));
}
inline bool more(double v1, CStrRef v2) { return more(v1,v2.toDouble());}
inline bool more(double v1, litstr v2) { return more(v1,String(v2));}
inline bool more(double v1, CArrRef v2) { return false;}
inline bool more(double v1, CObjRef v2) {
return more(v1, v2.toDoubleForCompare());
}
inline bool more(double v1, CVarRef v2) { return less(v2, v1);}
///////////////////////////////////////////////////////////////////////////////
// StringData *
inline bool same(const StringData *v1, bool v2) { return same(v2, v1);}
inline bool same(const StringData *v1, int v2) { return same(v2, v1);}
inline bool same(const StringData *v1, int64_t v2) { return same(v2, v1);}
inline bool same(const StringData *v1, double v2) { return same(v2, v1);}
inline bool same(const StringData *v1, const StringData *v2) {
if (v1 == v2) return true;
if (v1 && v2) return v1->same(v2);
return false;
}
inline bool same(const StringData *v1, CStrRef v2) {
return same(v1, v2.get());
}
inline bool same(const StringData *v1, litstr v2) {
StackStringData sd2(v2);
return same(v1, &sd2);
}
inline bool same(const StringData *v1, CArrRef v2) { return false; }
inline bool same(const StringData *v1, CObjRef v2) { return false; }
inline bool same(const StringData *v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(const StringData *v1, bool v2) { return equal(v2, v1);}
inline bool equal(const StringData *v1, int v2) { return equal(v2, v1);}
inline bool equal(const StringData *v1, int64_t v2) { return equal(v2, v1);}
inline bool equal(const StringData *v1, double v2) { return equal(v2, v1);}
inline bool equal(const StringData *v1, const StringData *v2) {
if (v1 == v2) return true;
if (v1 == nullptr) return v2->empty();
if (v2 == nullptr) return v1->empty();
return v1->compare(v2) == 0;
}
inline bool equal(const StringData *v1, CStrRef v2) {
return equal(v1, v2.get());
}
inline bool equal(const StringData *v1, litstr v2) {
StackStringData sd2(v2);
return equal(v1, &sd2);
}
inline bool equal(const StringData *v1, CArrRef v2) {
if (v1 == nullptr || v2.get() == nullptr) {
return equal(toBoolean(v1), v2.toBoolean());
}
return false;
}
inline bool equal(const StringData *v1, CObjRef v2) {
if (v1 == nullptr || v2.get() == nullptr) {
return equal(toBoolean(v1), v2.toBoolean());
}
if (v2.isResource()) return false;
if (v2->isCollection()) return false;
try {
return equal(v1, v2.toString());
} catch (BadTypeConversionException &e) {
return false;
}
return false;
}
inline bool equal(const StringData *v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(const StringData *v1, bool v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(const StringData *v1, int v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(const StringData *v1, int64_t v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(const StringData *v1, double v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(const StringData *v1, const StringData *v2) {
return same(v1, v2);
}
inline bool equalAsStr(const StringData *v1, CStrRef v2) {
return equalAsStr(v1, v2.get());
}
inline bool equalAsStr(const StringData *v1, litstr v2) {
return same(v1, v2);
}
inline bool equalAsStr(const StringData *v1, CArrRef v2) {
return equalAsStr(v1, "Array");
}
inline bool equalAsStr(const StringData *v1, CObjRef v2) {
return equalAsStr(v1, v2.toString());
}
inline bool equalAsStr(const StringData *v1, CVarRef v2) {
return equalAsStr(v2, v1);
}
inline bool less(const StringData *v1, bool v2) { return more(v2, v1);}
inline bool less(const StringData *v1, int v2) { return more(v2, v1);}
inline bool less(const StringData *v1, int64_t v2) { return more(v2, v1);}
inline bool less(const StringData *v1, double v2) { return more(v2, v1);}
inline bool less(const StringData *v1, const StringData *v2) {
if (v1 == v2 || v2 == nullptr) return false;
if (v1 == nullptr) return !v2->empty();
return v1->compare(v2) < 0;
}
inline bool less(const StringData *v1, CStrRef v2) {
return less(v1, v2.get());
}
inline bool less(const StringData *v1, litstr v2) {
StackStringData sd2(v2);
return less(v1, &sd2);
}
inline bool less(const StringData *v1, CArrRef v2) {
if (v1 == nullptr || v2.get() == nullptr) {
return less(toBoolean(v1), v2.toBoolean());
}
return true;
}
inline bool less(const StringData *v1, CObjRef v2) {
if (v1 == nullptr || v2.get() == nullptr) {
return less(toBoolean(v1), v2.toBoolean());
}
if (v2.isResource()) return true;
check_collection_compare(v2.get());
try {
return less(v1, v2.toString());
} catch (BadTypeConversionException &e) {
return true;
}
}
inline bool less(const StringData *v1, CVarRef v2) { return more(v2, v1);}
inline bool more(const StringData *v1, bool v2) { return less(v2, v1);}
inline bool more(const StringData *v1, int v2) { return less(v2, v1);}
inline bool more(const StringData *v1, int64_t v2) { return less(v2, v1);}
inline bool more(const StringData *v1, double v2) { return less(v2, v1);}
inline bool more(const StringData *v1, const StringData *v2) {
if (v1 == nullptr) return false;
if (v2 == nullptr) return !v1->empty();
return v1->compare(v2) > 0;
}
inline bool more(const StringData *v1, CStrRef v2) {
return more(v1, v2.get());
}
inline bool more(const StringData *v1, litstr v2) {
StackStringData sd2(v2);
return more(v1, &sd2);
}
inline bool more(const StringData *v1, CArrRef v2) {
if (v1 == nullptr || v2.get() == nullptr) {
return more(toBoolean(v1), v2.toBoolean());
}
return false;
}
inline bool more(const StringData *v1, CObjRef v2) {
if (v1 == nullptr || v2.get() == nullptr) {
return more(toBoolean(v1), v2.toBoolean());
}
if (v2.isResource()) return false;
check_collection_compare(v2.get());
try {
return more(v1, v2.toString());
} catch (BadTypeConversionException &e) {
return false;
}
}
inline bool more(const StringData *v1, CVarRef v2) { return less(v2, v1);}
///////////////////////////////////////////////////////////////////////////////
// String
inline bool same(CStrRef v1, bool v2) { return same(v2, v1);}
inline bool same(CStrRef v1, int v2) { return same(v2, v1);}
inline bool same(CStrRef v1, int64_t v2) { return same(v2, v1);}
inline bool same(CStrRef v1, double v2) { return same(v2, v1);}
inline bool same(CStrRef v1, const StringData *v2) {
return same(v2, v1.get());
}
inline bool same(CStrRef v1, CStrRef v2) { return v1.same(v2);}
inline bool same(CStrRef v1, litstr v2) { return v1.same(v2);}
inline bool same(CStrRef v1, CArrRef v2) { return v1.same(v2);}
inline bool same(CStrRef v1, CObjRef v2) { return v1.same(v2);}
inline bool same(CStrRef v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(CStrRef v1, bool v2) { return equal(v2, v1);}
inline bool equal(CStrRef v1, int v2) { return equal(v2, v1);}
inline bool equal(CStrRef v1, int64_t v2) { return equal(v2, v1);}
inline bool equal(CStrRef v1, double v2) { return equal(v2, v1);}
inline bool equal(CStrRef v1, const StringData *v2) {
return equal(v2, v1.get());
}
inline bool equal(CStrRef v1, CStrRef v2) { return v1.equal(v2);}
inline bool equal(CStrRef v1, litstr v2) { return v1.equal(v2);}
inline bool equal(CStrRef v1, CArrRef v2) { return v1.equal(v2);}
inline bool equal(CStrRef v1, CObjRef v2) { return v1.equal(v2);}
inline bool equal(CStrRef v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(CStrRef v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CStrRef v1, int v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CStrRef v1, int64_t v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CStrRef v1, double v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CStrRef v1, const StringData *v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(CStrRef v1, CStrRef v2) { return same(v1, v2);}
inline bool equalAsStr(CStrRef v1, litstr v2) {
return equalAsStr(v1, String(v2));
}
inline bool equalAsStr(CStrRef v1, CArrRef v2) {
return equalAsStr(v1.get(), v2);
}
inline bool equalAsStr(CStrRef v1, CObjRef v2) {
return equalAsStr(v1, v2.toString());
}
inline bool equalAsStr(CStrRef v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(CStrRef v1, bool v2) { return more(v2, v1);}
inline bool less(CStrRef v1, int v2) { return more(v2, v1);}
inline bool less(CStrRef v1, int64_t v2) { return more(v2, v1);}
inline bool less(CStrRef v1, double v2) { return more(v2, v1);}
inline bool less(CStrRef v1, const StringData *v2) {
return more(v2, v1.get());
}
inline bool less(CStrRef v1, CStrRef v2) { return v1.less(v2);}
inline bool less(CStrRef v1, litstr v2) { return v1.less(v2);}
inline bool less(CStrRef v1, CArrRef v2) { return v1.less(v2);}
inline bool less(CStrRef v1, CObjRef v2) { return v1.less(v2);}
inline bool less(CStrRef v1, CVarRef v2) { return more(v2, v1);}
inline bool more(CStrRef v1, bool v2) { return less(v2, v1);}
inline bool more(CStrRef v1, int v2) { return less(v2, v1);}
inline bool more(CStrRef v1, int64_t v2) { return less(v2, v1);}
inline bool more(CStrRef v1, double v2) { return less(v2, v1);}
inline bool more(CStrRef v1, const StringData *v2) {
return less(v2, v1.get());
}
inline bool more(CStrRef v1, CStrRef v2) { return v1.more(v2);}
inline bool more(CStrRef v1, litstr v2) { return v1.more(v2);}
inline bool more(CStrRef v1, CArrRef v2) { return v1.more(v2);}
inline bool more(CStrRef v1, CObjRef v2) { return v1.more(v2);}
inline bool more(CStrRef v1, CVarRef v2) { return less(v2, v1);}
///////////////////////////////////////////////////////////////////////////////
// litstr
inline bool same(litstr v1, bool v2) { return same(String(v1), v2);}
inline bool same(litstr v1, int v2) { return same(String(v1), v2);}
inline bool same(litstr v1, int64_t v2) { return same(String(v1), v2);}
inline bool same(litstr v1, double v2) { return same(String(v1), v2);}
inline bool same(litstr v1, const StringData *v2) {
StackStringData sd1(v1);
return same(&sd1, v2);
}
inline bool same(litstr v1, CStrRef v2) { return same(String(v1), v2);}
inline bool same(litstr v1, litstr v2) { return same(String(v1), v2);}
inline bool same(litstr v1, CArrRef v2) { return same(String(v1), v2);}
inline bool same(litstr v1, CObjRef v2) { return same(String(v1), v2);}
inline bool same(litstr v1, CVarRef v2) { return same(String(v1), v2);}
inline bool equal(litstr v1, bool v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, int v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, int64_t v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, double v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, const StringData *v2) {
StackStringData sd1(v1);
return equal(&sd1, v2);
}
inline bool equal(litstr v1, CStrRef v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, litstr v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, CArrRef v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, CObjRef v2) { return equal(String(v1),v2);}
inline bool equal(litstr v1, CVarRef v2) { return equal(String(v1),v2);}
inline bool equalAsStr(litstr v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(litstr v1, int v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(litstr v1, int64_t v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(litstr v1, double v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(litstr v1, const StringData *v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(litstr v1, CStrRef v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(litstr v1, litstr v2) { return same(v1, v2);}
inline bool equalAsStr(litstr v1, CArrRef v2) {
StackStringData sd1(v1);
return equalAsStr(&sd1, v2);
}
inline bool equalAsStr(litstr v1, CObjRef v2) {
return equalAsStr(v1, v2.toString());
}
inline bool equalAsStr(litstr v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(litstr v1, bool v2) { return less(String(v1), v2);}
inline bool less(litstr v1, int v2) { return less(String(v1), v2);}
inline bool less(litstr v1, int64_t v2) { return less(String(v1), v2);}
inline bool less(litstr v1, double v2) { return less(String(v1), v2);}
inline bool less(litstr v1, const StringData *v2) {
StackStringData sd1(v1);
return less(&sd1, v2);
}
inline bool less(litstr v1, CStrRef v2) { return less(String(v1), v2);}
inline bool less(litstr v1, litstr v2) { return less(String(v1), v2);}
inline bool less(litstr v1, CArrRef v2) { return less(String(v1), v2);}
inline bool less(litstr v1, CObjRef v2) { return less(String(v1), v2);}
inline bool less(litstr v1, CVarRef v2) { return less(String(v1), v2);}
inline bool more(litstr v1, bool v2) { return more(String(v1), v2);}
inline bool more(litstr v1, int v2) { return more(String(v1), v2);}
inline bool more(litstr v1, int64_t v2) { return more(String(v1), v2);}
inline bool more(litstr v1, double v2) { return more(String(v1), v2);}
inline bool more(litstr v1, const StringData *v2) {
StackStringData sd1(v1);
return more(&sd1, v2);
}
inline bool more(litstr v1, CStrRef v2) { return more(String(v1), v2);}
inline bool more(litstr v1, litstr v2) { return more(String(v1), v2);}
inline bool more(litstr v1, CArrRef v2) { return more(String(v1), v2);}
inline bool more(litstr v1, CObjRef v2) { return more(String(v1), v2);}
inline bool more(litstr v1, CVarRef v2) { return more(String(v1), v2);}
///////////////////////////////////////////////////////////////////////////////
// Array
inline bool same(CArrRef v1, bool v2) { return same(v2, v1);}
inline bool same(CArrRef v1, int v2) { return same(v2, v1);}
inline bool same(CArrRef v1, int64_t v2) { return same(v2, v1);}
inline bool same(CArrRef v1, double v2) { return same(v2, v1);}
inline bool same(CArrRef v1, const StringData *v2) { return same(v2, v1);}
inline bool same(CArrRef v1, CStrRef v2) { return same(v2, v1);}
inline bool same(CArrRef v1, litstr v2) { return same(v2, v1);}
inline bool same(CArrRef v1, CArrRef v2) { return v1.same(v2);}
inline bool same(CArrRef v1, CObjRef v2) { return v1.same(v2);}
inline bool same(CArrRef v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(CArrRef v1, bool v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, int v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, int64_t v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, double v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, const StringData *v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, CStrRef v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, litstr v2) { return equal(v2, v1);}
inline bool equal(CArrRef v1, CArrRef v2) { return v1.equal(v2);}
inline bool equal(CArrRef v1, CObjRef v2) { return v1.equal(v2);}
inline bool equal(CArrRef v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(CArrRef v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CArrRef v1, int v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CArrRef v1, int64_t v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CArrRef v1, double v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CArrRef v1, const StringData *v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(CArrRef v1, CStrRef v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CArrRef v1, litstr v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CArrRef v1, CArrRef v2) { return true;}
inline bool equalAsStr(CArrRef v1, CObjRef v2) {
return equalAsStr("Array", v2.toString());
}
inline bool equalAsStr(CArrRef v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(CArrRef v1, bool v2) { return more(v2, v1);}
inline bool less(CArrRef v1, int v2) { return more(v2, v1);}
inline bool less(CArrRef v1, int64_t v2) { return more(v2, v1);}
inline bool less(CArrRef v1, double v2) { return more(v2, v1);}
inline bool less(CArrRef v1, const StringData *v2) { return more(v2, v1);}
inline bool less(CArrRef v1, CStrRef v2) { return more(v2, v1);}
inline bool less(CArrRef v1, litstr v2) { return more(v2, v1);}
inline bool less(CArrRef v1, CArrRef v2) { return v1.less(v2);}
inline bool less(CArrRef v1, CObjRef v2) { return v1.less(v2);}
inline bool less(CArrRef v1, CVarRef v2) { return v1.less(v2);}
inline bool more(CArrRef v1, bool v2) { return less(v2, v1);}
inline bool more(CArrRef v1, int v2) { return less(v2, v1);}
inline bool more(CArrRef v1, int64_t v2) { return less(v2, v1);}
inline bool more(CArrRef v1, double v2) { return less(v2, v1);}
inline bool more(CArrRef v1, const StringData *v2) { return less(v2, v1);}
inline bool more(CArrRef v1, CStrRef v2) { return less(v2, v1);}
inline bool more(CArrRef v1, litstr v2) { return less(v2, v1);}
inline bool more(CArrRef v1, CArrRef v2) { return v1.more(v2);}
inline bool more(CArrRef v1, CObjRef v2) { return v1.more(v2);}
inline bool more(CArrRef v1, CVarRef v2) { return v1.more(v2);}
///////////////////////////////////////////////////////////////////////////////
// Object
inline bool same(CObjRef v1, bool v2) { return same(v2, v1);}
inline bool same(CObjRef v1, int v2) { return same(v2, v1);}
inline bool same(CObjRef v1, int64_t v2) { return same(v2, v1);}
inline bool same(CObjRef v1, double v2) { return same(v2, v1);}
inline bool same(CObjRef v1, const StringData *v2) { return same(v2, v1);}
inline bool same(CObjRef v1, CStrRef v2) { return same(v2, v1);}
inline bool same(CObjRef v1, litstr v2) { return same(v2, v1);}
inline bool same(CObjRef v1, CArrRef v2) { return same(v2, v1);}
inline bool same(CObjRef v1, CObjRef v2) { return v1.same(v2);}
inline bool same(CObjRef v1, CVarRef v2) { return same(v2, v1);}
inline bool equal(CObjRef v1, bool v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, int v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, int64_t v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, double v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, const StringData *v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, CStrRef v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, litstr v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, CArrRef v2) { return equal(v2, v1);}
inline bool equal(CObjRef v1, CObjRef v2) { return v1.equal(v2);}
inline bool equal(CObjRef v1, CVarRef v2) { return equal(v2, v1);}
inline bool equalAsStr(CObjRef v1, bool v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, int v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, int64_t v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, double v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, const StringData *v2) {
return equalAsStr(v2, v1);
}
inline bool equalAsStr(CObjRef v1, CStrRef v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, litstr v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, CArrRef v2) { return equalAsStr(v2, v1);}
inline bool equalAsStr(CObjRef v1, CObjRef v2) {
return equalAsStr(v1.toString(), v2.toString());
}
inline bool equalAsStr(CObjRef v1, CVarRef v2) { return equalAsStr(v2, v1);}
inline bool less(CObjRef v1, bool v2) { return more(v2, v1);}
inline bool less(CObjRef v1, int v2) { return more(v2, v1);}
inline bool less(CObjRef v1, int64_t v2) { return more(v2, v1);}
inline bool less(CObjRef v1, double v2) { return more(v2, v1);}
inline bool less(CObjRef v1, const StringData *v2) { return more(v2, v1);}
inline bool less(CObjRef v1, CStrRef v2) { return more(v2, v1);}
inline bool less(CObjRef v1, litstr v2) { return more(v2, v1);}
inline bool less(CObjRef v1, CArrRef v2) { return more(v2, v1);}
inline bool less(CObjRef v1, CObjRef v2) { return v1.less(v2);}
inline bool less(CObjRef v1, CVarRef v2) { return more(v2, v1);}
inline bool more(CObjRef v1, bool v2) { return less(v2, v1);}
inline bool more(CObjRef v1, int v2) { return less(v2, v1);}
inline bool more(CObjRef v1, int64_t v2) { return less(v2, v1);}
inline bool more(CObjRef v1, double v2) { return less(v2, v1);}
inline bool more(CObjRef v1, const StringData *v2) { return less(v2, v1);}
inline bool more(CObjRef v1, CStrRef v2) { return less(v2, v1);}
inline bool more(CObjRef v1, litstr v2) { return less(v2, v1);}
inline bool more(CObjRef v1, CArrRef v2) { return less(v2, v1);}
inline bool more(CObjRef v1, CObjRef v2) { return v1.more(v2);}
inline bool more(CObjRef v1, CVarRef v2) { return less(v2, v1);}
///////////////////////////////////////////////////////////////////////////////
/**
* Special-casing comparisons between arrays to get the same results from
* comparisons between uncomparable arrays.
*/
bool less_or_equal(CVarRef v1, CVarRef v2);
bool more_or_equal(CVarRef v1, CVarRef v2);
///////////////////////////////////////////////////////////////////////////////
}
#endif // __HPHP_COMPARISONS_H__