From f422b7b37ddf589a047a804ec9c96a4d51066204 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 9 Aug 2023 10:57:52 +0200 Subject: [PATCH] Replace `add()` with `add()` (`add(T)` is still supported) --- CHANGELOG.md | 1 + extras/tests/JsonArray/add.cpp | 27 +++++++++++++++++++++- extras/tests/JsonDocument/ElementProxy.cpp | 8 +++---- extras/tests/JsonDocument/add.cpp | 25 +++++++++++++++++++- extras/tests/JsonVariant/add.cpp | 26 ++++++++++++++++++++- extras/tests/JsonVariant/compare.cpp | 6 ++--- src/ArduinoJson/Array/JsonArray.hpp | 19 +++++++++++---- src/ArduinoJson/Array/JsonArrayImpl.hpp | 6 ++--- src/ArduinoJson/Array/Utilities.hpp | 2 +- src/ArduinoJson/Document/JsonDocument.hpp | 21 +++++++++++++---- src/ArduinoJson/Variant/JsonVariant.hpp | 4 +++- src/ArduinoJson/Variant/VariantRefBase.hpp | 16 +++++++++---- 12 files changed, 133 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 931365c0..be4e0e4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,3 +27,4 @@ HEAD * Add `deserializeJson(JsonVariant, ...)` and `deserializeMsgPack(JsonVariant, ...)` (#1226) * Call `shrinkToFit()` in `deserializeJson()` and `deserializeMsgPack()` * `serializeJson()` and `serializeMsgPack()` replace the content of `std::string` and `String` instead of appending to it +* Replace `add()` with `add()` (`add(T)` is still supported) diff --git a/extras/tests/JsonArray/add.cpp b/extras/tests/JsonArray/add.cpp index 5ef38797..4ab47bda 100644 --- a/extras/tests/JsonArray/add.cpp +++ b/extras/tests/JsonArray/add.cpp @@ -9,7 +9,7 @@ using ArduinoJson::detail::sizeofArray; -TEST_CASE("JsonArray::add()") { +TEST_CASE("JsonArray::add(T)") { SpyingAllocator spy; JsonDocument doc(&spy); JsonArray array = doc.to(); @@ -154,3 +154,28 @@ TEST_CASE("JsonArray::add()") { }); } } + +TEST_CASE("JsonArray::add()") { + JsonDocument doc; + JsonArray array = doc.to(); + + SECTION("add()") { + JsonArray nestedArray = array.add(); + nestedArray.add(1); + nestedArray.add(2); + REQUIRE(doc.as() == "[[1,2]]"); + } + + SECTION("add()") { + JsonObject nestedObject = array.add(); + nestedObject["a"] = 1; + nestedObject["b"] = 2; + REQUIRE(doc.as() == "[{\"a\":1,\"b\":2}]"); + } + + SECTION("add()") { + JsonVariant nestedVariant = array.add(); + nestedVariant.set(42); + REQUIRE(doc.as() == "[42]"); + } +} diff --git a/extras/tests/JsonDocument/ElementProxy.cpp b/extras/tests/JsonDocument/ElementProxy.cpp index d3f276d4..8552d8d5 100644 --- a/extras/tests/JsonDocument/ElementProxy.cpp +++ b/extras/tests/JsonDocument/ElementProxy.cpp @@ -9,7 +9,7 @@ typedef ArduinoJson::detail::ElementProxy ElementProxy; TEST_CASE("ElementProxy::add()") { JsonDocument doc; - doc.add(); + doc.add(); ElementProxy ep = doc[0]; SECTION("add(int)") { @@ -35,7 +35,7 @@ TEST_CASE("ElementProxy::add()") { TEST_CASE("ElementProxy::clear()") { JsonDocument doc; - doc.add(); + doc.add(); ElementProxy ep = doc[0]; SECTION("size goes back to zero") { @@ -95,7 +95,7 @@ TEST_CASE("ElementProxy::operator==()") { TEST_CASE("ElementProxy::remove()") { JsonDocument doc; - doc.add(); + doc.add(); ElementProxy ep = doc[0]; SECTION("remove(int)") { @@ -168,7 +168,7 @@ TEST_CASE("ElementProxy::set()") { TEST_CASE("ElementProxy::size()") { JsonDocument doc; - doc.add(); + doc.add(); ElementProxy ep = doc[0]; SECTION("returns 0") { diff --git a/extras/tests/JsonDocument/add.cpp b/extras/tests/JsonDocument/add.cpp index 65c6fc3b..89992b6a 100644 --- a/extras/tests/JsonDocument/add.cpp +++ b/extras/tests/JsonDocument/add.cpp @@ -12,7 +12,7 @@ using ArduinoJson::detail::sizeofArray; -TEST_CASE("JsonDocument::add()") { +TEST_CASE("JsonDocument::add(T)") { SpyingAllocator spy; JsonDocument doc(&spy); @@ -79,3 +79,26 @@ TEST_CASE("JsonDocument::add()") { }); } } + +TEST_CASE("JsonDocument::add()") { + JsonDocument doc; + + SECTION("JsonArray") { + JsonArray array = doc.add(); + array.add(1); + array.add(2); + REQUIRE(doc.as() == "[[1,2]]"); + } + + SECTION("JsonObject") { + JsonObject object = doc.add(); + object["hello"] = "world"; + REQUIRE(doc.as() == "[{\"hello\":\"world\"}]"); + } + + SECTION("JsonVariant") { + JsonVariant variant = doc.add(); + variant.set(42); + REQUIRE(doc.as() == "[42]"); + } +} diff --git a/extras/tests/JsonVariant/add.cpp b/extras/tests/JsonVariant/add.cpp index 140784a8..e63e809e 100644 --- a/extras/tests/JsonVariant/add.cpp +++ b/extras/tests/JsonVariant/add.cpp @@ -6,7 +6,7 @@ #include #include -TEST_CASE("JsonVariant::add()") { +TEST_CASE("JsonVariant::add(T)") { JsonDocument doc; JsonVariant var = doc.to(); @@ -44,3 +44,27 @@ TEST_CASE("JsonVariant::add()") { REQUIRE(var.as() == "{\"val\":123}"); } } + +TEST_CASE("JsonVariant::add()") { + JsonDocument doc; + JsonVariant var = doc.to(); + + SECTION("JsonArray") { + JsonArray array = var.add(); + array.add(1); + array.add(2); + REQUIRE(doc.as() == "[[1,2]]"); + } + + SECTION("JsonObject") { + JsonObject object = var.add(); + object["hello"] = "world"; + REQUIRE(doc.as() == "[{\"hello\":\"world\"}]"); + } + + SECTION("JsonVariant") { + JsonVariant variant = var.add(); + variant.set(42); + REQUIRE(doc.as() == "[42]"); + } +} diff --git a/extras/tests/JsonVariant/compare.cpp b/extras/tests/JsonVariant/compare.cpp index 95c12191..9d4169f8 100644 --- a/extras/tests/JsonVariant/compare.cpp +++ b/extras/tests/JsonVariant/compare.cpp @@ -10,7 +10,7 @@ TEST_CASE("Compare JsonVariant with value") { JsonDocument doc; - JsonVariant a = doc.add(); + JsonVariant a = doc.add(); SECTION("null vs (char*)0") { char* b = 0; @@ -38,8 +38,8 @@ TEST_CASE("Compare JsonVariant with value") { TEST_CASE("Compare JsonVariant with JsonVariant") { JsonDocument doc; - JsonVariant a = doc.add(); - JsonVariant b = doc.add(); + JsonVariant a = doc.add(); + JsonVariant b = doc.add(); SECTION("'abc' vs 'abc'") { a.set("abc"); diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index 40a89db2..50044817 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -41,10 +41,21 @@ class JsonArray : public detail::VariantOperators { return JsonArrayConst(data_, resources_); } + // Appends a new (empty) element to the array. + // Returns a reference to the new element. + // https://arduinojson.org/v6/api/jsonarray/add/ + template + typename detail::enable_if::value, T>::type + add() const { + return add().to(); + } + // Appends a new (null) element to the array. // Returns a reference to the new element. // https://arduinojson.org/v6/api/jsonarray/add/ - JsonVariant add() const { + template + typename detail::enable_if::value, T>::type + add() const { return JsonVariant(detail::ArrayData::addElement(data_, resources_), resources_); } @@ -53,14 +64,14 @@ class JsonArray : public detail::VariantOperators { // https://arduinojson.org/v6/api/jsonarray/add/ template FORCE_INLINE bool add(const T& value) const { - return add().set(value); + return add().set(value); } // Appends a value to the array. // https://arduinojson.org/v6/api/jsonarray/add/ template FORCE_INLINE bool add(T* value) const { - return add().set(value); + return add().set(value); } // Returns an iterator to the first element of the array. @@ -126,7 +137,7 @@ class JsonArray : public detail::VariantOperators { // Creates an array and appends it to the array. // https://arduinojson.org/v6/api/jsonarray/createnestedarray/ FORCE_INLINE JsonArray createNestedArray() const { - return add().to(); + return add(); } operator JsonVariantConst() const { diff --git a/src/ArduinoJson/Array/JsonArrayImpl.hpp b/src/ArduinoJson/Array/JsonArrayImpl.hpp index dc0487af..c3165d01 100644 --- a/src/ArduinoJson/Array/JsonArrayImpl.hpp +++ b/src/ArduinoJson/Array/JsonArrayImpl.hpp @@ -10,7 +10,7 @@ ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE inline JsonObject JsonArray::createNestedObject() const { - return add().to(); + return add(); } ARDUINOJSON_END_PUBLIC_NAMESPACE @@ -19,12 +19,12 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template inline JsonArray VariantRefBase::createNestedArray() const { - return add().template to(); + return add(); } template inline JsonObject VariantRefBase::createNestedObject() const { - return add().template to(); + return add(); } template diff --git a/src/ArduinoJson/Array/Utilities.hpp b/src/ArduinoJson/Array/Utilities.hpp index 398e11d4..5d145c3d 100644 --- a/src/ArduinoJson/Array/Utilities.hpp +++ b/src/ArduinoJson/Array/Utilities.hpp @@ -34,7 +34,7 @@ inline typename detail::enable_if< copyArray(const T* src, size_t len, const TDestination& dst) { bool ok = true; for (size_t i = 0; i < len; i++) { - ok &= copyArray(src[i], dst.add()); + ok &= copyArray(src[i], dst.template add()); } return ok; } diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 26aa089e..98b2c567 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -161,7 +161,7 @@ class JsonDocument : public detail::VariantOperators { // Creates an array and appends it to the root array. // https://arduinojson.org/v6/api/jsondocument/createnestedarray/ JsonArray createNestedArray() { - return add().to(); + return add(); } // Creates an array and adds it to the root object. @@ -181,7 +181,7 @@ class JsonDocument : public detail::VariantOperators { // Creates an object and appends it to the root array. // https://arduinojson.org/v6/api/jsondocument/createnestedobject/ JsonObject createNestedObject() { - return add().to(); + return add(); } // Creates an object and adds it to the root object. @@ -264,10 +264,21 @@ class JsonDocument : public detail::VariantOperators { return JsonVariantConst(data_.getElement(index, &resources_), &resources_); } + // Appends a new (empty) element to the root array. + // Returns a reference to the new element. + // https://arduinojson.org/v6/api/jsondocument/add/ + template + typename detail::enable_if::value, T>::type + add() { + return add().to(); + } + // Appends a new (null) element to the root array. // Returns a reference to the new element. // https://arduinojson.org/v6/api/jsondocument/add/ - FORCE_INLINE JsonVariant add() { + template + typename detail::enable_if::value, T>::type + add() { return JsonVariant(data_.addElement(&resources_), &resources_); } @@ -275,14 +286,14 @@ class JsonDocument : public detail::VariantOperators { // https://arduinojson.org/v6/api/jsondocument/add/ template FORCE_INLINE bool add(const TValue& value) { - return add().set(value); + return add().set(value); } // Appends a value to the root array. // https://arduinojson.org/v6/api/jsondocument/add/ template FORCE_INLINE bool add(TChar* value) { - return add().set(value); + return add().set(value); } // Removes an element of the root array. diff --git a/src/ArduinoJson/Variant/JsonVariant.hpp b/src/ArduinoJson/Variant/JsonVariant.hpp index 637148ec..d7b240ab 100644 --- a/src/ArduinoJson/Variant/JsonVariant.hpp +++ b/src/ArduinoJson/Variant/JsonVariant.hpp @@ -87,7 +87,9 @@ ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -inline JsonVariant VariantRefBase::add() const { +template +inline typename enable_if::value, T>::type +VariantRefBase::add() const { return JsonVariant( detail::VariantData::addElement(getOrCreateData(), getResourceManager()), getResourceManager()); diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index 09cb5da8..ddcb5874 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -136,23 +136,32 @@ class VariantRefBase : public VariantTag { return VariantData::nesting(getData(), getResourceManager()); } + // Appends a new (empty) element to the array. + // Returns a reference to the new element. + // https://arduinojson.org/v6/api/jsonvariant/add/ + template + typename enable_if::value, T>::type add() const { + return add().template to(); + } + // Appends a new (null) element to the array. // Returns a reference to the new element. // https://arduinojson.org/v6/api/jsonvariant/add/ - FORCE_INLINE JsonVariant add() const; + template + typename enable_if::value, T>::type add() const; // Appends a value to the array. // https://arduinojson.org/v6/api/jsonvariant/add/ template FORCE_INLINE bool add(const T& value) const { - return add().set(value); + return add().set(value); } // Appends a value to the array. // https://arduinojson.org/v6/api/jsonvariant/add/ template FORCE_INLINE bool add(T* value) const { - return add().set(value); + return add().set(value); } // Removes an element of the array. @@ -261,7 +270,6 @@ class VariantRefBase : public VariantTag { return VariantAttorney::getOrCreateData(derived()); } - private: FORCE_INLINE ArduinoJson::JsonVariant getVariant() const; FORCE_INLINE ArduinoJson::JsonVariantConst getVariantConst() const {