This source file includes following definitions.
- isValid
- compareNumbers
- compare
- isLessThan
- isEqual
#include "config.h"
#include "modules/indexeddb/IDBKey.h"
namespace WebCore {
IDBKey::~IDBKey()
{
}
bool IDBKey::isValid() const
{
if (m_type == InvalidType)
return false;
if (m_type == ArrayType) {
for (size_t i = 0; i < m_array.size(); i++) {
if (!m_array[i]->isValid())
return false;
}
}
return true;
}
template <typename T>
static int compareNumbers(const T& a, const T& b)
{
if (a < b)
return -1;
if (b < a)
return 1;
return 0;
}
int IDBKey::compare(const IDBKey* other) const
{
ASSERT(other);
if (m_type != other->m_type)
return m_type > other->m_type ? -1 : 1;
switch (m_type) {
case ArrayType:
for (size_t i = 0; i < m_array.size() && i < other->m_array.size(); ++i) {
if (int result = m_array[i]->compare(other->m_array[i].get()))
return result;
}
return compareNumbers(m_array.size(), other->m_array.size());
case BinaryType:
if (int result = memcmp(m_binary->data(), other->m_binary->data(), std::min(m_binary->size(), other->m_binary->size())))
return result < 0 ? -1 : 1;
return compareNumbers(m_binary->size(), other->m_binary->size());
case StringType:
return codePointCompare(m_string, other->m_string);
case DateType:
case NumberType:
return compareNumbers(m_number, other->m_number);
case InvalidType:
case MinType:
ASSERT_NOT_REACHED();
return 0;
}
ASSERT_NOT_REACHED();
return 0;
}
bool IDBKey::isLessThan(const IDBKey* other) const
{
ASSERT(other);
return compare(other) == -1;
}
bool IDBKey::isEqual(const IDBKey* other) const
{
if (!other)
return false;
return !compare(other);
}
}