From 8af294078f2f522aeb350543b4b1e4c69a98dc42 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 17 Sep 2025 21:51:03 +0200 Subject: [PATCH] Extract `asObject()` Before: 9874, 8796, 9694, 12634, 9970 After: 9874, 8736, 9694, 12634, 9970 Target: 9800, 8458, 9634, 12290, 9702 --- src/ArduinoJson/Document/JsonDocument.hpp | 20 ++++++++++++-------- src/ArduinoJson/Variant/VariantData.hpp | 10 ++++++++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 5da7b0a6..d568b01a 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -165,7 +165,7 @@ class JsonDocument : public detail::VariantOperators { template ARDUINOJSON_DEPRECATED("use doc[\"key\"].is() instead") bool containsKey(TChar* key) const { - return getVariantImpl().getMember(detail::adaptString(key)) != 0; + return getObjectImpl().getMember(detail::adaptString(key)) != 0; } // DEPRECATED: use obj[key].is() instead @@ -174,7 +174,7 @@ class JsonDocument : public detail::VariantOperators { detail::enable_if_t::value, int> = 0> ARDUINOJSON_DEPRECATED("use doc[key].is() instead") bool containsKey(const TString& key) const { - return getVariantImpl().getMember(detail::adaptString(key)) != 0; + return getObjectImpl().getMember(detail::adaptString(key)) != 0; } // DEPRECATED: use obj[key].is() instead @@ -211,8 +211,8 @@ class JsonDocument : public detail::VariantOperators { template ::value, int> = 0> JsonVariantConst operator[](const TString& key) const { - return JsonVariantConst( - getVariantImpl().getMember(detail::adaptString(key)), &resources_); + return JsonVariantConst(getObjectImpl().getMember(detail::adaptString(key)), + &resources_); } // Gets a root object's member. @@ -222,8 +222,8 @@ class JsonDocument : public detail::VariantOperators { !detail::is_const::value, int> = 0> JsonVariantConst operator[](TChar* key) const { - return JsonVariantConst( - getVariantImpl().getMember(detail::adaptString(key)), &resources_); + return JsonVariantConst(getObjectImpl().getMember(detail::adaptString(key)), + &resources_); } // Gets or sets a root array's element. @@ -300,7 +300,7 @@ class JsonDocument : public detail::VariantOperators { !detail::is_const::value, int> = 0> void remove(TChar* key) { - getVariantImpl().removeMember(detail::adaptString(key)); + getObjectImpl().removeMember(detail::adaptString(key)); } // Removes a member of the root object. @@ -308,7 +308,7 @@ class JsonDocument : public detail::VariantOperators { template ::value, int> = 0> void remove(const TString& key) { - getVariantImpl().removeMember(detail::adaptString(key)); + getObjectImpl().removeMember(detail::adaptString(key)); } // Removes a member of the root object or an element of the root array. @@ -416,6 +416,10 @@ class JsonDocument : public detail::VariantOperators { return &data_; } + detail::ObjectImpl getObjectImpl() const { + return detail::VariantImpl::asObject(&data_, &resources_); + } + mutable detail::ResourceManager resources_; mutable detail::VariantData data_; }; diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 09be5999..11632d16 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -295,8 +295,14 @@ class VariantImpl { } ObjectImpl asObject() { - return ObjectImpl(isObject() ? &data_->content.asCollection : nullptr, - resources_); + return asObject(data_, resources_); + } + + static ObjectImpl asObject(VariantData* data, ResourceManager* resources) { + return ObjectImpl(data && data->type == VariantType::Object + ? &data->content.asCollection + : nullptr, + resources); } JsonString asRawString() const {