From d9c6a70595c9d98adebda1d4fb4c196a4bc5373a Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 15 Jun 2025 12:55:13 +0200 Subject: [PATCH] JsonObject: replace `ObjectData*` member with `VariantData*` --- src/ArduinoJson/Object/JsonObject.hpp | 44 ++++++++++++----------- src/ArduinoJson/Variant/ConverterImpl.hpp | 4 +-- src/ArduinoJson/Variant/VariantData.hpp | 9 +++-- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index d55ac38b..eff61e34 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -23,7 +23,7 @@ class JsonObject : public detail::VariantOperators { JsonObject() : data_(0), resources_(0) {} // INTERNAL USE ONLY - JsonObject(detail::ObjectData* data, detail::ResourceManager* resource) + JsonObject(detail::VariantData* data, detail::ResourceManager* resource) : data_(data), resources_(resource) {} operator JsonVariant() const { @@ -33,29 +33,29 @@ class JsonObject : public detail::VariantOperators { } operator JsonObjectConst() const { - return JsonObjectConst(collectionToVariant(data_), resources_); + return JsonObjectConst(data_, resources_); } operator JsonVariantConst() const { - return JsonVariantConst(collectionToVariant(data_), resources_); + return JsonVariantConst(data_, resources_); } // Returns true if the reference is unbound. // https://arduinojson.org/v7/api/jsonobject/isnull/ bool isNull() const { - return data_ == 0; + return !data_ || !data_->isObject(); } // Returns true if the reference is bound. // https://arduinojson.org/v7/api/jsonobject/isnull/ operator bool() const { - return data_ != 0; + return !isNull(); } // Returns the depth (nesting level) of the object. // https://arduinojson.org/v7/api/jsonobject/nesting/ size_t nesting() const { - return detail::VariantData::nesting(collectionToVariant(data_), resources_); + return detail::VariantData::nesting(data_, resources_); } // Returns the number of members in the object. @@ -67,9 +67,10 @@ class JsonObject : public detail::VariantOperators { // Returns an iterator to the first key-value pair of the object. // https://arduinojson.org/v7/api/jsonobject/begin/ iterator begin() const { - if (!data_) + auto obj = detail::VariantData::asObject(data_); + if (!obj) return iterator(); - return iterator(data_->createIterator(resources_), resources_); + return iterator(obj->createIterator(resources_), resources_); } // Returns an iterator following the last key-value pair of the object. @@ -81,7 +82,7 @@ class JsonObject : public detail::VariantOperators { // Removes all the members of the object. // https://arduinojson.org/v7/api/jsonobject/clear/ void clear() const { - detail::ObjectData::clear(data_, resources_); + detail::ObjectData::clear(detail::VariantData::asObject(data_), resources_); } // Copies an object. @@ -131,7 +132,8 @@ class JsonObject : public detail::VariantOperators { // Removes the member at the specified iterator. // https://arduinojson.org/v7/api/jsonobject/remove/ FORCE_INLINE void remove(iterator it) const { - detail::ObjectData::remove(data_, it.iterator_, resources_); + detail::ObjectData::remove(detail::VariantData::asObject(data_), + it.iterator_, resources_); } // Removes the member with the specified key. @@ -139,8 +141,8 @@ class JsonObject : public detail::VariantOperators { template ::value, int> = 0> void remove(const TString& key) const { - detail::ObjectData::removeMember(data_, detail::adaptString(key), - resources_); + detail::VariantData::removeMember(data_, detail::adaptString(key), + resources_); } // Removes the member with the specified key. @@ -156,8 +158,8 @@ class JsonObject : public detail::VariantOperators { // https://arduinojson.org/v7/api/jsonobject/remove/ template FORCE_INLINE void remove(TChar* key) const { - detail::ObjectData::removeMember(data_, detail::adaptString(key), - resources_); + detail::VariantData::removeMember(data_, detail::adaptString(key), + resources_); } // DEPRECATED: use obj[key].is() instead @@ -166,8 +168,8 @@ class JsonObject : public detail::VariantOperators { detail::enable_if_t::value, int> = 0> ARDUINOJSON_DEPRECATED("use obj[key].is() instead") bool containsKey(const TString& key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; + return detail::VariantData::getMember(data_, detail::adaptString(key), + resources_) != 0; } // DEPRECATED: use obj["key"].is() instead @@ -178,8 +180,8 @@ class JsonObject : public detail::VariantOperators { int> = 0> ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") bool containsKey(TChar* key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; + return detail::VariantData::getMember(data_, detail::adaptString(key), + resources_) != 0; } // DEPRECATED: use obj[key].is() instead @@ -231,14 +233,14 @@ class JsonObject : public detail::VariantOperators { } detail::VariantData* getData() const { - return detail::collectionToVariant(data_); + return data_; } detail::VariantData* getOrCreateData() const { - return detail::collectionToVariant(data_); + return data_; } - detail::ObjectData* data_; + detail::VariantData* data_; detail::ResourceManager* resources_; }; diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 26d57d5a..f21e05e7 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -386,9 +386,7 @@ struct Converter : private detail::VariantAttorney { } static JsonObject fromJson(JsonVariant src) { - auto data = getData(src); - auto resources = getResourceManager(src); - return JsonObject(data != 0 ? data->asObject() : 0, resources); + return JsonObject(getData(src), getResourceManager(src)); } static bool checkJson(JsonVariant src) { diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index f8b2be9d..c38b3b1e 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -296,6 +296,10 @@ class VariantData { return const_cast(this)->asObject(); } + static ObjectData* asObject(VariantData* var) { + return var ? var->asObject() : 0; + } + static const ObjectData* asObject(const VariantData* var) { return var ? var->asObject() : 0; } @@ -595,11 +599,12 @@ class VariantData { return content_.asObject; } - static ObjectData* toObject(VariantData* var, ResourceManager* resources) { + static VariantData* toObject(VariantData* var, ResourceManager* resources) { if (!var) return 0; var->clear(resources); - return &var->toObject(); + var->toObject(); + return var; } VariantType type() const {