forked from bblanchon/ArduinoJson
Implement object comparison out of class
This commit is contained in:
@ -98,11 +98,6 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
|
|||||||
return detail::ObjectData::copy(data_, src.data_, resources_);
|
return detail::ObjectData::copy(data_, src.data_, resources_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares the content of two objects.
|
|
||||||
FORCE_INLINE bool operator==(JsonObject rhs) const {
|
|
||||||
return detail::ObjectData::equals(data_, rhs.data_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets or sets the member with specified key.
|
// Gets or sets the member with specified key.
|
||||||
// https://arduinojson.org/v6/api/jsonobject/subscript/
|
// https://arduinojson.org/v6/api/jsonobject/subscript/
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
|
@ -106,11 +106,6 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
|
|||||||
detail::ObjectData::getMember(data_, detail::adaptString(key)));
|
detail::ObjectData::getMember(data_, detail::adaptString(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares objects.
|
|
||||||
FORCE_INLINE bool operator==(JsonObjectConst rhs) const {
|
|
||||||
return detail::ObjectData::equals(data_, rhs.data_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const detail::VariantData* getData() const {
|
const detail::VariantData* getData() const {
|
||||||
return collectionToVariant(data_);
|
return collectionToVariant(data_);
|
||||||
@ -137,4 +132,23 @@ struct Converter<JsonObjectConst> : private detail::VariantAttorney {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline bool operator==(JsonObjectConst lhs, JsonObjectConst rhs) {
|
||||||
|
if (!lhs && !rhs) // both are null
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!lhs || !rhs) // only one is null
|
||||||
|
return false;
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
for (auto kvp : lhs) {
|
||||||
|
auto rhsValue = rhs[kvp.key()];
|
||||||
|
if (rhsValue.isUnbound())
|
||||||
|
return false;
|
||||||
|
if (kvp.value() != rhsValue)
|
||||||
|
return false;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count == rhs.size();
|
||||||
|
}
|
||||||
|
|
||||||
ARDUINOJSON_END_PUBLIC_NAMESPACE
|
ARDUINOJSON_END_PUBLIC_NAMESPACE
|
||||||
|
@ -25,18 +25,6 @@ class ObjectData : public CollectionData {
|
|||||||
return dst->copyFrom(*src, resources);
|
return dst->copyFrom(*src, resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool equals(const ObjectData& other) const;
|
|
||||||
|
|
||||||
static bool equals(const ObjectData* lhs, const ObjectData* rhs) {
|
|
||||||
if (lhs == rhs)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!lhs || !rhs)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return lhs->equals(*rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
template <typename TAdaptedString>
|
||||||
VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources);
|
VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources);
|
||||||
|
|
||||||
|
@ -57,20 +57,6 @@ inline bool ObjectData::copyFrom(const ObjectData& src,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool ObjectData::equals(const ObjectData& other) const {
|
|
||||||
size_t count = 0;
|
|
||||||
for (auto it = begin(); it; ++it) {
|
|
||||||
auto a = it.data();
|
|
||||||
auto b = other.getMember(adaptString(it.key()));
|
|
||||||
if (!b)
|
|
||||||
return false;
|
|
||||||
if (compare(a, b) != COMPARE_RESULT_EQUAL)
|
|
||||||
return false;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count == other.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
template <typename TAdaptedString>
|
||||||
inline VariantData* ObjectData::getMember(TAdaptedString key) const {
|
inline VariantData* ObjectData::getMember(TAdaptedString key) const {
|
||||||
return findKey(key).data();
|
return findKey(key).data();
|
||||||
|
@ -97,7 +97,7 @@ struct ObjectComparer : ComparerBase {
|
|||||||
explicit ObjectComparer(const ObjectData& rhs) : rhs_(&rhs) {}
|
explicit ObjectComparer(const ObjectData& rhs) : rhs_(&rhs) {}
|
||||||
|
|
||||||
CompareResult visitObject(const ObjectData& lhs) {
|
CompareResult visitObject(const ObjectData& lhs) {
|
||||||
if (rhs_->equals(lhs))
|
if (JsonObjectConst(&lhs) == JsonObjectConst(rhs_))
|
||||||
return COMPARE_RESULT_EQUAL;
|
return COMPARE_RESULT_EQUAL;
|
||||||
else
|
else
|
||||||
return COMPARE_RESULT_DIFFER;
|
return COMPARE_RESULT_DIFFER;
|
||||||
|
Reference in New Issue
Block a user