diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ac1f372..9b64515c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ HEAD * Fixed segfault after `variant.set(serialized((char*)0))` * Detect `IncompleteInput` in `false`, `true`, and `null` * Added `JsonDocument::size()` +* Added `JsonVariant::clear()` v6.8.0-beta (2019-01-30) ----------- diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index eff7e5b6..c6a2a718 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -47,6 +47,10 @@ class ElementProxy : public VariantOperators >, return *this; } + FORCE_INLINE void clear() const { + getUpstreamElement().clear(); + } + FORCE_INLINE bool isNull() const { return getUpstreamElement().isNull(); } diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index cb95ddc3..047868b3 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -49,6 +49,10 @@ class MemberProxy : public VariantOperators >, return *this; } + FORCE_INLINE void clear() const { + getUpstreamMember().clear(); + } + FORCE_INLINE bool isNull() const { return getUpstreamMember().isNull(); } diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index ce65637e..27b723fa 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -136,6 +136,10 @@ class VariantRef : public VariantRefBase, // Creates an uninitialized VariantRef FORCE_INLINE VariantRef() : base_type(0), _pool(0) {} + FORCE_INLINE void clear() const { + return variantSetNull(_data); + } + // set(bool value) FORCE_INLINE bool set(bool value) const { return variantSetBoolean(_data, value); diff --git a/test/ElementProxy/CMakeLists.txt b/test/ElementProxy/CMakeLists.txt index 56d2a111..4b0f28c2 100644 --- a/test/ElementProxy/CMakeLists.txt +++ b/test/ElementProxy/CMakeLists.txt @@ -4,6 +4,7 @@ add_executable(ElementProxyTests add.cpp + clear.cpp set.cpp size.cpp ) diff --git a/test/ElementProxy/clear.cpp b/test/ElementProxy/clear.cpp new file mode 100644 index 00000000..2634d187 --- /dev/null +++ b/test/ElementProxy/clear.cpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include + +using namespace ARDUINOJSON_NAMESPACE; + +TEST_CASE("ElementProxy::clear()") { + DynamicJsonDocument doc(4096); + doc.addElement(); + ElementProxy ep = doc[0]; + + SECTION("size goes back to zero") { + ep.add(42); + ep.clear(); + + REQUIRE(ep.size() == 0); + } + + SECTION("isNull() return true") { + ep.add("hello"); + ep.clear(); + + REQUIRE(ep.isNull() == true); + } +} diff --git a/test/JsonVariant/CMakeLists.txt b/test/JsonVariant/CMakeLists.txt index 15767f8a..a95f0453 100644 --- a/test/JsonVariant/CMakeLists.txt +++ b/test/JsonVariant/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(JsonVariantTests add.cpp as.cpp + clear.cpp compare.cpp copy.cpp createNested.cpp diff --git a/test/JsonVariant/clear.cpp b/test/JsonVariant/clear.cpp new file mode 100644 index 00000000..d6231162 --- /dev/null +++ b/test/JsonVariant/clear.cpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include +#include + +static const char* null = 0; + +TEST_CASE("JsonVariant::clear()") { + DynamicJsonDocument doc(4096); + JsonVariant var = doc.to(); + + SECTION("size goes back to zero") { + var.add(42); + var.clear(); + + REQUIRE(var.size() == 0); + } + + SECTION("isNull() return true") { + var.add("hello"); + var.clear(); + + REQUIRE(var.isNull() == true); + } +} diff --git a/test/MemberProxy/CMakeLists.txt b/test/MemberProxy/CMakeLists.txt index 22cb075c..a3165c9a 100644 --- a/test/MemberProxy/CMakeLists.txt +++ b/test/MemberProxy/CMakeLists.txt @@ -4,6 +4,7 @@ add_executable(MemberProxyTests add.cpp + clear.cpp subscript.cpp set.cpp size.cpp diff --git a/test/MemberProxy/clear.cpp b/test/MemberProxy/clear.cpp new file mode 100644 index 00000000..bb78042f --- /dev/null +++ b/test/MemberProxy/clear.cpp @@ -0,0 +1,27 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include + +using namespace ARDUINOJSON_NAMESPACE; + +TEST_CASE("MemberProxy::clear()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("size goes back to zero") { + mp.add(42); + mp.clear(); + + REQUIRE(mp.size() == 0); + } + + SECTION("isNull() return true") { + mp.add("hello"); + mp.clear(); + + REQUIRE(mp.isNull() == true); + } +}