Implement object comparison out of class

This commit is contained in:
Benoit Blanchon
2023-07-10 14:59:09 +02:00
parent 555f3dd5fe
commit f6b014582f
5 changed files with 20 additions and 37 deletions

View File

@ -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>

View File

@ -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

View File

@ -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);

View File

@ -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();

View File

@ -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;