Skip to content

Commit

Permalink
Extract arrayEquals() and objectEquals()
Browse files Browse the repository at this point in the history
  • Loading branch information
bblanchon committed Jun 19, 2023
1 parent 87c96f9 commit 18ae8ab
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 26 deletions.
16 changes: 1 addition & 15 deletions src/ArduinoJson/Array/JsonArrayConst.hpp
Expand Up @@ -50,21 +50,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
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;
}
return arrayEquals(*data_, *rhs.data_);
}

// Returns the element at the specified index.
Expand Down
5 changes: 5 additions & 0 deletions src/ArduinoJson/Collection/CollectionData.hpp
Expand Up @@ -52,4 +52,9 @@ inline VariantData* collectionToVariant(CollectionData* collection) {
return reinterpret_cast<VariantData*>(data);
}

bool arrayEquals(const detail::CollectionData& lhs,
const detail::CollectionData& rhs);
bool objectEquals(const detail::CollectionData& lhs,
const detail::CollectionData& rhs);

ARDUINOJSON_END_PRIVATE_NAMESPACE
30 changes: 30 additions & 0 deletions src/ArduinoJson/Collection/CollectionImpl.hpp
Expand Up @@ -6,6 +6,7 @@

#include <ArduinoJson/Collection/CollectionData.hpp>
#include <ArduinoJson/Strings/StringAdapters.hpp>
#include <ArduinoJson/Variant/VariantCompare.hpp>
#include <ArduinoJson/Variant/VariantData.hpp>

ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
Expand Down Expand Up @@ -99,4 +100,33 @@ inline void CollectionData::movePointers(ptrdiff_t variantDistance) {
slot->data()->movePointers(variantDistance);
}

inline bool arrayEquals(const CollectionData& lhs, const CollectionData& rhs) {
auto a = lhs.head();
auto b = rhs.head();

for (;;) {
if (!a && !b) // both ended
return true;
if (!a || !b) // one ended
return false;
if (compare(a->data(), b->data()) != COMPARE_RESULT_EQUAL)
return false;
a = a->next();
b = b->next();
}
}

inline bool objectEquals(const CollectionData& lhs, const CollectionData& rhs) {
size_t count = 0;
for (auto a = lhs.head(); a; a = a->next()) {
auto b = rhs.get(adaptString(a->key()));
if (!b)
return false;
if (compare(a->data(), b->data()) != COMPARE_RESULT_EQUAL)
return false;
count++;
}
return count == rhs.size();
}

ARDUINOJSON_END_PRIVATE_NAMESPACE
8 changes: 1 addition & 7 deletions src/ArduinoJson/Object/JsonObjectConst.hpp
Expand Up @@ -114,13 +114,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
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();
return objectEquals(*data_, *rhs.data_);
}

private:
Expand Down
11 changes: 7 additions & 4 deletions src/ArduinoJson/Variant/VariantCompare.hpp
Expand Up @@ -12,8 +12,6 @@

ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE

class CollectionData;

struct ComparerBase : Visitor<CompareResult> {};

template <typename T, typename Enable = void>
Expand Down Expand Up @@ -86,7 +84,7 @@ struct ArrayComparer : ComparerBase {
explicit ArrayComparer(const CollectionData& rhs) : rhs_(&rhs) {}

CompareResult visitArray(const CollectionData& lhs) {
if (JsonArrayConst(&lhs) == JsonArrayConst(rhs_))
if (arrayEquals(lhs, *rhs_))
return COMPARE_RESULT_EQUAL;
else
return COMPARE_RESULT_DIFFER;
Expand All @@ -99,7 +97,7 @@ struct ObjectComparer : ComparerBase {
explicit ObjectComparer(const CollectionData& rhs) : rhs_(&rhs) {}

CompareResult visitObject(const CollectionData& lhs) {
if (JsonObjectConst(&lhs) == JsonObjectConst(rhs_))
if (objectEquals(lhs, *rhs_))
return COMPARE_RESULT_EQUAL;
else
return COMPARE_RESULT_DIFFER;
Expand Down Expand Up @@ -204,4 +202,9 @@ CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) {
return variantAccept(VariantAttorney::getData(lhs), comparer);
}

inline CompareResult compare(const VariantData* lhs, const VariantData* rhs) {
VariantComparer comparer(rhs);
return variantAccept(lhs, comparer);
}

ARDUINOJSON_END_PRIVATE_NAMESPACE

0 comments on commit 18ae8ab

Please sign in to comment.