From 589bbbfccae71029c0344f85259a43b3ad2fbff6 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 24 Jul 2025 18:40:38 +0200 Subject: [PATCH] VariantImpl: add `toArrayIfNull()` and `toObjectIfNull()` --- src/ArduinoJson/Array/ElementProxy.hpp | 4 +--- src/ArduinoJson/Array/JsonArray.hpp | 4 ---- src/ArduinoJson/Document/JsonDocument.hpp | 4 +++- src/ArduinoJson/Object/MemberProxy.hpp | 4 +--- src/ArduinoJson/Variant/VariantData.hpp | 22 ------------------- src/ArduinoJson/Variant/VariantImpl.hpp | 10 +++++++++ .../Variant/VariantRefBaseImpl.hpp | 4 +--- 7 files changed, 16 insertions(+), 36 deletions(-) diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index e2256b08..b8e0d912 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -57,9 +57,7 @@ class ElementProxy : public VariantRefBase>, VariantImpl getOrCreateImpl() const { auto impl = VariantAttorney::getOrCreateImpl(upstream_); - auto data = impl.data(); - if (data) - data->getOrCreateArray(); + impl.toArrayIfNull(); return VariantImpl(impl.getOrAddElement(index_), impl.resources()); } diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index e66b9306..86b6c40a 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -25,10 +25,6 @@ class JsonArray : public detail::VariantOperators { // INTERNAL USE ONLY JsonArray(detail::VariantImpl impl) : impl_(impl) {} - // INTERNAL USE ONLY - JsonArray(detail::VariantData* data, detail::ResourceManager* resources) - : impl_(data, resources) {} - // Returns a JsonVariant pointing to the array. // https://arduinojson.org/v7/api/jsonvariant/ operator JsonVariant() { diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 1e6c4783..be5f1ec0 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -397,7 +397,9 @@ class JsonDocument : public detail::VariantOperators { } JsonArray getOrCreateArray() { - return JsonArray(data_.getOrCreateArray(), &resources_); + auto impl = getImpl(); + impl.toArrayIfNull(); + return JsonArray(impl); } JsonVariant getVariant() { diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index 2649177c..5255a475 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -58,9 +58,7 @@ class MemberProxy VariantImpl getOrCreateImpl() const { auto impl = VariantAttorney::getOrCreateImpl(upstream_); - auto data = impl.data(); - if (data) - data->getOrCreateObject(); + impl.toObjectIfNull(); return VariantImpl(impl.getOrAddMember(key_), impl.resources()); } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index fb4046d2..7501ba74 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -99,28 +99,6 @@ struct VariantData { VariantData* toObject() { return toCollection(VariantType::Object); } - - VariantData* getOrCreateArray() { - switch (type) { - case VariantType::Null: - return toArray(); - case VariantType::Array: - return this; - default: - return nullptr; - } - } - - VariantData* getOrCreateObject() { - switch (type) { - case VariantType::Null: - return toObject(); - case VariantType::Object: - return this; - default: - return nullptr; - } - } }; ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 10ec623a..05f5a9d2 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -528,6 +528,16 @@ class VariantImpl { return true; } + void toArrayIfNull() { + if (data_ && data_->type == VariantType::Null) + data_->toArray(); + } + + void toObjectIfNull() { + if (data_ && data_->type == VariantType::Null) + data_->toObject(); + } + void empty() { auto coll = getCollectionData(); diff --git a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp index 709c5fc1..91056cfd 100644 --- a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp +++ b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp @@ -143,9 +143,7 @@ inline bool VariantRefBase::doSet(const T& value, true_type) const { template inline JsonArray VariantRefBase::getOrCreateArray() const { auto impl = getOrCreateImpl(); - auto data = impl.data(); - if (data) - data->getOrCreateArray(); + impl.toArrayIfNull(); return JsonArray(impl); }