From bf5d0c790c3418fa5c155fb9e946d5629b2f2801 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 23 Mar 2022 16:00:24 +0100 Subject: [PATCH] Add implicit conversion from `JsonDocument` to `JsonVariant` --- CHANGELOG.md | 1 + extras/tests/JsonDocument/CMakeLists.txt | 1 + extras/tests/JsonDocument/ElementProxy.cpp | 26 ++++++++++++++++++++++ extras/tests/JsonDocument/MemberProxy.cpp | 26 ++++++++++++++++++++++ extras/tests/JsonDocument/cast.cpp | 18 +++++++++++++++ src/ArduinoJson/Document/JsonDocument.hpp | 17 ++++++-------- 6 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 extras/tests/JsonDocument/cast.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d60ad55..1e88d08a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ HEAD * Add `ElementProxy::memoryUsage()` * Add `MemberProxy::memoryUsage()` (issue #1730) +* Add implicit conversion from `JsonDocument` to `JsonVariant` v6.19.3 (2022-03-08) ------- diff --git a/extras/tests/JsonDocument/CMakeLists.txt b/extras/tests/JsonDocument/CMakeLists.txt index e44689ce..53567803 100644 --- a/extras/tests/JsonDocument/CMakeLists.txt +++ b/extras/tests/JsonDocument/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(JsonDocumentTests add.cpp BasicJsonDocument.cpp + cast.cpp compare.cpp containsKey.cpp createNested.cpp diff --git a/extras/tests/JsonDocument/ElementProxy.cpp b/extras/tests/JsonDocument/ElementProxy.cpp index 6eb06256..0fe3c471 100644 --- a/extras/tests/JsonDocument/ElementProxy.cpp +++ b/extras/tests/JsonDocument/ElementProxy.cpp @@ -219,3 +219,29 @@ TEST_CASE("ElementProxy::operator[]") { REQUIRE(doc.as() == "[null,[null,null,42]]"); } } + +TEST_CASE("ElementProxy cast to JsonVariantConst") { + DynamicJsonDocument doc(4096); + doc[0] = "world"; + + const ElementProxy ep = doc[0]; + + JsonVariantConst var = ep; + + CHECK(var.as() == "world"); +} + +TEST_CASE("ElementProxy cast to JsonVariant") { + DynamicJsonDocument doc(4096); + doc[0] = "world"; + + ElementProxy ep = doc[0]; + + JsonVariant var = ep; + + CHECK(var.as() == "world"); + + var.set("toto"); + + CHECK(doc.as() == "[\"toto\"]"); +} diff --git a/extras/tests/JsonDocument/MemberProxy.cpp b/extras/tests/JsonDocument/MemberProxy.cpp index 93622ad8..64cd06a0 100644 --- a/extras/tests/JsonDocument/MemberProxy.cpp +++ b/extras/tests/JsonDocument/MemberProxy.cpp @@ -259,3 +259,29 @@ TEST_CASE("MemberProxy::operator[]") { REQUIRE(doc.as() == "{\"hello\":[null,null,42]}"); } } + +TEST_CASE("MemberProxy cast to JsonVariantConst") { + DynamicJsonDocument doc(4096); + doc["hello"] = "world"; + + const MemberProxy mp = doc["hello"]; + + JsonVariantConst var = mp; + + CHECK(var.as() == "world"); +} + +TEST_CASE("MemberProxy cast to JsonVariant") { + DynamicJsonDocument doc(4096); + doc["hello"] = "world"; + + MemberProxy mp = doc["hello"]; + + JsonVariant var = mp; + + CHECK(var.as() == "world"); + + var.set("toto"); + + CHECK(doc.as() == "{\"hello\":\"toto\"}"); +} diff --git a/extras/tests/JsonDocument/cast.cpp b/extras/tests/JsonDocument/cast.cpp new file mode 100644 index 00000000..e538f4bb --- /dev/null +++ b/extras/tests/JsonDocument/cast.cpp @@ -0,0 +1,18 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#include +#include + +#include + +TEST_CASE("Implicit cast to JsonVariant") { + StaticJsonDocument<128> doc; + + doc["hello"] = "world"; + + JsonVariant var = doc; + + CHECK(var.as() == "{\"hello\":\"world\"}"); +} diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 90e22e79..274cce71 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -14,7 +14,8 @@ namespace ARDUINOJSON_NAMESPACE { -class JsonDocument : public Visitable { +class JsonDocument : public Visitable, + public VariantOperators { public: template typename TVisitor::result_type accept(TVisitor& visitor) const { @@ -295,16 +296,12 @@ class JsonDocument : public Visitable { _data.remove(adaptString(key)); } + FORCE_INLINE operator VariantRef() { + return getVariant(); + } + FORCE_INLINE operator VariantConstRef() const { - return VariantConstRef(&_data); - } - - bool operator==(VariantConstRef rhs) const { - return getVariant() == rhs; - } - - bool operator!=(VariantConstRef rhs) const { - return getVariant() != rhs; + return getVariant(); } protected: