From f6b014582faf67d78a7ff84b429d77fb64cde74c Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 10 Jul 2023 14:59:09 +0200 Subject: [PATCH] Implement object comparison out of class --- src/ArduinoJson/Object/JsonObject.hpp | 5 ----- src/ArduinoJson/Object/JsonObjectConst.hpp | 24 +++++++++++++++++----- src/ArduinoJson/Object/ObjectData.hpp | 12 ----------- src/ArduinoJson/Object/ObjectImpl.hpp | 14 ------------- src/ArduinoJson/Variant/VariantCompare.hpp | 2 +- 5 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 06050197..0b790501 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -98,11 +98,6 @@ class JsonObject : public detail::VariantOperators { 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. // https://arduinojson.org/v6/api/jsonobject/subscript/ template diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 9bc974f3..099aee78 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -106,11 +106,6 @@ class JsonObjectConst : public detail::VariantOperators { detail::ObjectData::getMember(data_, detail::adaptString(key))); } - // Compares objects. - FORCE_INLINE bool operator==(JsonObjectConst rhs) const { - return detail::ObjectData::equals(data_, rhs.data_); - } - private: const detail::VariantData* getData() const { return collectionToVariant(data_); @@ -137,4 +132,23 @@ struct Converter : 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 diff --git a/src/ArduinoJson/Object/ObjectData.hpp b/src/ArduinoJson/Object/ObjectData.hpp index 29bfdb4a..f4ce5fa6 100644 --- a/src/ArduinoJson/Object/ObjectData.hpp +++ b/src/ArduinoJson/Object/ObjectData.hpp @@ -25,18 +25,6 @@ class ObjectData : public CollectionData { 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 VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources); diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index f1964dae..88cf88cf 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -57,20 +57,6 @@ inline bool ObjectData::copyFrom(const ObjectData& src, 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 inline VariantData* ObjectData::getMember(TAdaptedString key) const { return findKey(key).data(); diff --git a/src/ArduinoJson/Variant/VariantCompare.hpp b/src/ArduinoJson/Variant/VariantCompare.hpp index 6414e6f7..4c64b577 100644 --- a/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/src/ArduinoJson/Variant/VariantCompare.hpp @@ -97,7 +97,7 @@ struct ObjectComparer : ComparerBase { explicit ObjectComparer(const ObjectData& rhs) : rhs_(&rhs) {} CompareResult visitObject(const ObjectData& lhs) { - if (rhs_->equals(lhs)) + if (JsonObjectConst(&lhs) == JsonObjectConst(rhs_)) return COMPARE_RESULT_EQUAL; else return COMPARE_RESULT_DIFFER;