diff --git a/extras/tests/JsonDocument/MemberProxy.cpp b/extras/tests/JsonDocument/MemberProxy.cpp index d59b5813..96c24a95 100644 --- a/extras/tests/JsonDocument/MemberProxy.cpp +++ b/extras/tests/JsonDocument/MemberProxy.cpp @@ -14,12 +14,9 @@ using ArduinoJson::detail::sizeofArray; using ArduinoJson::detail::sizeofObject; -using MemberProxy = - ArduinoJson::detail::MemberProxy; - TEST_CASE("MemberProxy::add()") { JsonDocument doc; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; SECTION("add(int)") { mp.add(42); @@ -48,7 +45,7 @@ TEST_CASE("MemberProxy::add()") { TEST_CASE("MemberProxy::clear()") { JsonDocument doc; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; SECTION("size goes back to zero") { mp.add(42); @@ -139,7 +136,7 @@ TEST_CASE("MemberProxy::operator|()") { TEST_CASE("MemberProxy::remove()") { JsonDocument doc; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; SECTION("remove(int)") { mp.add(1); @@ -186,7 +183,7 @@ TEST_CASE("MemberProxy::remove()") { TEST_CASE("MemberProxy::set()") { JsonDocument doc; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; SECTION("set(int)") { mp.set(42); @@ -223,7 +220,7 @@ TEST_CASE("MemberProxy::set()") { TEST_CASE("MemberProxy::size()") { JsonDocument doc; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; SECTION("returns 0") { REQUIRE(mp.size() == 0); @@ -246,7 +243,7 @@ TEST_CASE("MemberProxy::size()") { TEST_CASE("MemberProxy::operator[]") { JsonDocument doc; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; SECTION("set member") { mp["world"] = 42; @@ -265,7 +262,7 @@ TEST_CASE("MemberProxy cast to JsonVariantConst") { JsonDocument doc; doc["hello"] = "world"; - const MemberProxy mp = doc["hello"]; + const auto mp = doc["hello"]; JsonVariantConst var = mp; @@ -276,7 +273,7 @@ TEST_CASE("MemberProxy cast to JsonVariant") { JsonDocument doc; doc["hello"] = "world"; - MemberProxy mp = doc["hello"]; + auto mp = doc["hello"]; JsonVariant var = mp; diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index b145f0cb..9916e296 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -186,19 +186,21 @@ class JsonDocument : public detail::VariantOperators { // Gets or sets a root object's member. // https://arduinojson.org/v7/api/jsondocument/subscript/ template - detail::enable_if_t::value, - detail::MemberProxy> + detail::enable_if_t< + detail::IsString::value, + detail::MemberProxy>> operator[](const TString& key) { - return {*this, key}; + return {*this, detail::adaptString(key)}; } // Gets or sets a root object's member. // https://arduinojson.org/v7/api/jsondocument/subscript/ template - detail::enable_if_t::value, - detail::MemberProxy> + detail::enable_if_t< + detail::IsString::value, + detail::MemberProxy>> operator[](TChar* key) { - return {*this, key}; + return {*this, detail::adaptString(key)}; } // Gets a root object's member. diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 379e8e4a..afcb8d75 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -102,31 +102,31 @@ class JsonObject : public detail::VariantOperators { // Gets or sets the member with specified key. // https://arduinojson.org/v7/api/jsonobject/subscript/ template - detail::enable_if_t::value, - detail::MemberProxy> + detail::enable_if_t< + detail::IsString::value, + detail::MemberProxy>> operator[](const TString& key) const { - return {*this, key}; + return {*this, detail::adaptString(key)}; } // Gets or sets the member with specified key. // https://arduinojson.org/v7/api/jsonobject/subscript/ template - detail::enable_if_t::value, - detail::MemberProxy> + detail::enable_if_t< + detail::IsString::value, + detail::MemberProxy>> operator[](TChar* key) const { - return {*this, key}; + return {*this, detail::adaptString(key)}; } // Gets or sets the member with specified key. // https://arduinojson.org/v7/api/jsonobject/subscript/ template - detail::enable_if_t::value, - detail::MemberProxy> + detail::enable_if_t< + detail::IsVariant::value, + detail::MemberProxy>> operator[](const TVariant& key) const { - if (key.template is()) - return {*this, key.template as()}; - else - return {*this, nullptr}; + return {*this, detail::adaptString(key.template as())}; } // Removes the member at the specified iterator. diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index eb9feede..8c4313af 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -10,14 +10,14 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE // A proxy class to get or set a member of an object. // https://arduinojson.org/v7/api/jsonobject/subscript/ -template +template class MemberProxy - : public VariantRefBase>, - public VariantOperators> { + : public VariantRefBase>, + public VariantOperators> { friend class VariantAttorney; public: - MemberProxy(TUpstream upstream, TStringRef key) + MemberProxy(TUpstream upstream, AdaptedString key) : upstream_(upstream), key_(key) {} MemberProxy(const MemberProxy& src) @@ -47,7 +47,7 @@ class MemberProxy VariantData* getData() const { return VariantData::getMember( - VariantAttorney::getData(upstream_), adaptString(key_), + VariantAttorney::getData(upstream_), key_, VariantAttorney::getResourceManager(upstream_)); } @@ -55,13 +55,13 @@ class MemberProxy auto data = VariantAttorney::getOrCreateData(upstream_); if (!data) return nullptr; - return data->getOrAddMember(adaptString(key_), + return data->getOrAddMember(key_, VariantAttorney::getResourceManager(upstream_)); } private: TUpstream upstream_; - TStringRef key_; + AdaptedString key_; }; ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Strings/StringAdapters.hpp b/src/ArduinoJson/Strings/StringAdapters.hpp index 5da554ce..a558defd 100644 --- a/src/ArduinoJson/Strings/StringAdapters.hpp +++ b/src/ArduinoJson/Strings/StringAdapters.hpp @@ -70,4 +70,8 @@ static void stringGetChars(TAdaptedString s, char* p, size_t n) { } } +template +using AdaptedString = + typename StringAdapter>::AdaptedString; + ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index d8f5cfcb..5a4c59be 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -188,16 +188,16 @@ class VariantRefBase : public VariantTag { // Gets or sets an object member. // https://arduinojson.org/v7/api/jsonvariant/subscript/ template - FORCE_INLINE - enable_if_t::value, MemberProxy> - operator[](const TString& key) const; + FORCE_INLINE enable_if_t::value, + MemberProxy>> + operator[](const TString& key) const; // Gets or sets an object member. // https://arduinojson.org/v7/api/jsonvariant/subscript/ template - FORCE_INLINE - enable_if_t::value, MemberProxy> - operator[](TChar* key) const; + FORCE_INLINE enable_if_t::value, + MemberProxy>> + operator[](TChar* key) const; // Gets an object member or an array element. // https://arduinojson.org/v7/api/jsonvariant/subscript/ diff --git a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp index 594f317d..5838f9f3 100644 --- a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp +++ b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp @@ -123,17 +123,19 @@ inline ElementProxy VariantRefBase::operator[]( } template -template -inline enable_if_t::value, MemberProxy> -VariantRefBase::operator[](TString* key) const { - return MemberProxy(derived(), key); +template +inline enable_if_t::value, + MemberProxy>> +VariantRefBase::operator[](TChar* key) const { + return {derived(), adaptString(key)}; } template template -inline enable_if_t::value, MemberProxy> +inline enable_if_t::value, + MemberProxy>> VariantRefBase::operator[](const TString& key) const { - return MemberProxy(derived(), key); + return {derived(), adaptString(key)}; } template