forked from bblanchon/ArduinoJson
Implement comparison out of VariantData
This commit is contained in:
@ -20,12 +20,4 @@ inline typename TVisitor::result_type arrayAccept(const CollectionData *arr,
|
||||
else
|
||||
return visitor.visitNull();
|
||||
}
|
||||
|
||||
inline bool arrayEquals(const CollectionData *lhs, const CollectionData *rhs) {
|
||||
if (lhs == rhs)
|
||||
return true;
|
||||
if (!lhs || !rhs)
|
||||
return false;
|
||||
return lhs->equalsArray(*rhs);
|
||||
}
|
||||
} // namespace ARDUINOJSON_NAMESPACE
|
||||
|
@ -83,7 +83,26 @@ class ArrayConstRef : public ArrayRefBase<const CollectionData>,
|
||||
FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {}
|
||||
|
||||
FORCE_INLINE bool operator==(ArrayConstRef rhs) const {
|
||||
return arrayEquals(_data, rhs._data);
|
||||
if (_data == rhs._data)
|
||||
return true;
|
||||
if (!_data || !rhs._data)
|
||||
return false;
|
||||
|
||||
iterator it1 = begin();
|
||||
iterator it2 = rhs.begin();
|
||||
|
||||
for (;;) {
|
||||
bool end1 = it1 == end();
|
||||
bool end2 = it2 == rhs.end();
|
||||
if (end1 && end2)
|
||||
return true;
|
||||
if (end1 || end2)
|
||||
return false;
|
||||
if (*it1 != *it2)
|
||||
return false;
|
||||
++it1;
|
||||
++it2;
|
||||
}
|
||||
}
|
||||
|
||||
FORCE_INLINE VariantConstRef operator[](size_t index) const {
|
||||
@ -138,7 +157,7 @@ class ArrayRef : public ArrayRefBase<CollectionData>,
|
||||
}
|
||||
|
||||
FORCE_INLINE bool operator==(ArrayRef rhs) const {
|
||||
return arrayEquals(_data, rhs._data);
|
||||
return ArrayConstRef(_data) == ArrayConstRef(rhs._data);
|
||||
}
|
||||
|
||||
// Internal use
|
||||
|
@ -36,8 +36,6 @@ class CollectionData {
|
||||
|
||||
void removeElement(size_t index);
|
||||
|
||||
bool equalsArray(const CollectionData &other) const;
|
||||
|
||||
// Object only
|
||||
|
||||
template <typename TAdaptedString, typename TStoragePolicy>
|
||||
@ -58,8 +56,6 @@ class CollectionData {
|
||||
template <typename TAdaptedString>
|
||||
bool containsKey(const TAdaptedString &key) const;
|
||||
|
||||
bool equalsObject(const CollectionData &other) const;
|
||||
|
||||
// Generic
|
||||
|
||||
void clear();
|
||||
|
@ -11,10 +11,6 @@
|
||||
|
||||
namespace ARDUINOJSON_NAMESPACE {
|
||||
|
||||
inline bool variantEquals(const VariantData* a, const VariantData* b) {
|
||||
return variantCompare(a, b) == COMPARE_RESULT_EQUAL;
|
||||
}
|
||||
|
||||
inline VariantSlot* CollectionData::addSlot(MemoryPool* pool) {
|
||||
VariantSlot* slot = pool->allocVariant();
|
||||
if (!slot)
|
||||
@ -77,33 +73,6 @@ inline bool CollectionData::copyFrom(const CollectionData& src,
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool CollectionData::equalsObject(const CollectionData& other) const {
|
||||
size_t count = 0;
|
||||
for (VariantSlot* slot = _head; slot; slot = slot->next()) {
|
||||
VariantData* v1 = slot->data();
|
||||
VariantData* v2 = other.getMember(adaptString(slot->key()));
|
||||
if (!variantEquals(v1, v2))
|
||||
return false;
|
||||
count++;
|
||||
}
|
||||
return count == other.size();
|
||||
}
|
||||
|
||||
inline bool CollectionData::equalsArray(const CollectionData& other) const {
|
||||
VariantSlot* s1 = _head;
|
||||
VariantSlot* s2 = other._head;
|
||||
for (;;) {
|
||||
if (s1 == s2)
|
||||
return true;
|
||||
if (!s1 || !s2)
|
||||
return false;
|
||||
if (!variantEquals(s1->data(), s2->data()))
|
||||
return false;
|
||||
s1 = s1->next();
|
||||
s2 = s2->next();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const {
|
||||
if (key.isNull())
|
||||
|
@ -17,14 +17,6 @@ typename TVisitor::result_type objectAccept(const CollectionData *obj,
|
||||
return visitor.visitNull();
|
||||
}
|
||||
|
||||
inline bool objectEquals(const CollectionData *lhs, const CollectionData *rhs) {
|
||||
if (lhs == rhs)
|
||||
return true;
|
||||
if (!lhs || !rhs)
|
||||
return false;
|
||||
return lhs->equalsObject(*rhs);
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
inline VariantData *objectGetMember(const CollectionData *obj,
|
||||
TAdaptedString key) {
|
||||
|
@ -127,7 +127,19 @@ class ObjectConstRef : public ObjectRefBase<const CollectionData>,
|
||||
}
|
||||
|
||||
FORCE_INLINE bool operator==(ObjectConstRef rhs) const {
|
||||
return objectEquals(_data, rhs._data);
|
||||
if (_data == rhs._data)
|
||||
return true;
|
||||
|
||||
if (!_data || !rhs._data)
|
||||
return false;
|
||||
|
||||
size_t count = 0;
|
||||
for (iterator it = begin(); it != end(); ++it) {
|
||||
if (it->value() != rhs[it->key()])
|
||||
return false;
|
||||
count++;
|
||||
}
|
||||
return count == rhs.size();
|
||||
}
|
||||
|
||||
private:
|
||||
@ -215,7 +227,7 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
|
||||
}
|
||||
|
||||
FORCE_INLINE bool operator==(ObjectRef rhs) const {
|
||||
return objectEquals(_data, rhs._data);
|
||||
return ObjectConstRef(_data) == ObjectConstRef(rhs._data);
|
||||
}
|
||||
|
||||
FORCE_INLINE void remove(iterator it) const {
|
||||
|
@ -89,7 +89,7 @@ struct ArrayComparer : ComparerBase {
|
||||
explicit ArrayComparer(const CollectionData &rhs) : _rhs(&rhs) {}
|
||||
|
||||
CompareResult visitArray(const CollectionData &lhs) {
|
||||
if (lhs.equalsArray(*_rhs))
|
||||
if (ArrayConstRef(&lhs) == ArrayConstRef(_rhs))
|
||||
return COMPARE_RESULT_EQUAL;
|
||||
else
|
||||
return COMPARE_RESULT_DIFFER;
|
||||
@ -102,7 +102,7 @@ struct ObjectComparer : ComparerBase {
|
||||
explicit ObjectComparer(const CollectionData &rhs) : _rhs(&rhs) {}
|
||||
|
||||
CompareResult visitObject(const CollectionData &lhs) {
|
||||
if (lhs.equalsObject(*_rhs))
|
||||
if (ObjectConstRef(&lhs) == ObjectConstRef(_rhs))
|
||||
return COMPARE_RESULT_EQUAL;
|
||||
else
|
||||
return COMPARE_RESULT_DIFFER;
|
||||
@ -201,8 +201,4 @@ CompareResult compare(const T1 &lhs, const T2 &rhs) {
|
||||
return lhs.accept(comparer);
|
||||
}
|
||||
|
||||
inline int variantCompare(const VariantData *a, const VariantData *b) {
|
||||
return compare(VariantConstRef(a), VariantConstRef(b));
|
||||
}
|
||||
|
||||
} // namespace ARDUINOJSON_NAMESPACE
|
||||
|
@ -43,8 +43,6 @@ inline bool variantCopyFrom(VariantData *dst, const VariantData *src,
|
||||
return dst->copyFrom(*src, pool);
|
||||
}
|
||||
|
||||
inline int variantCompare(const VariantData *a, const VariantData *b);
|
||||
|
||||
inline void variantSetNull(VariantData *var) {
|
||||
if (!var)
|
||||
return;
|
||||
|
Reference in New Issue
Block a user