From e22e62d184d809f5f5996957a80de108a878a623 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 25 Feb 2019 11:07:01 +0100 Subject: [PATCH] Added `JsonDocument::size()` --- CHANGELOG.md | 3 ++- src/ArduinoJson/Document/JsonDocument.hpp | 4 +++ src/ArduinoJson/Object/MemberProxy.hpp | 4 +++ test/ElementProxy/CMakeLists.txt | 1 + test/ElementProxy/size.cpp | 30 ++++++++++++++++++++++ test/JsonDocument/CMakeLists.txt | 1 + test/JsonDocument/size.cpp | 28 ++++++++++++++++++++ test/MemberProxy/CMakeLists.txt | 1 + test/MemberProxy/size.cpp | 31 +++++++++++++++++++++++ 9 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 test/ElementProxy/size.cpp create mode 100644 test/JsonDocument/size.cpp create mode 100644 test/MemberProxy/size.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 632a3b97..1ac1f372 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ HEAD * Decode escaped Unicode characters like \u00DE (issue #304, PR #791) Many thanks to Daniel Schulte (aka @trilader) who implemented this feature. -* Add option ARDUINOJSON_DECODE_UNICODE to enable it +* Added option ARDUINOJSON_DECODE_UNICODE to enable it * Converted `JsonArray::copyFrom()/copyTo()` to free functions `copyArray()` * Renamed `JsonArray::copyFrom()` and `JsonObject::copyFrom()` to `set()` * Renamed `JsonArray::get()` to `getElement()` @@ -16,6 +16,7 @@ HEAD * Fixed `JsonVariant::isNull()` not returning `true` after `set((char*)0)` * Fixed segfault after `variant.set(serialized((char*)0))` * Detect `IncompleteInput` in `false`, `true`, and `null` +* Added `JsonDocument::size()` v6.8.0-beta (2019-01-30) ----------- diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 4898731e..faf77fa5 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -57,6 +57,10 @@ class JsonDocument : public Visitable { return _pool.capacity(); } + size_t size() const { + return _data.size(); + } + bool set(const JsonDocument& src) { return to().set(src.as()); } diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index 5dea050c..cb95ddc3 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -63,6 +63,10 @@ class MemberProxy : public VariantOperators >, return getUpstreamMember().template is(); } + FORCE_INLINE size_t size() const { + return getUpstreamMember().size(); + } + template FORCE_INLINE typename VariantTo::type to() { return getOrAddUpstreamMember().template to(); diff --git a/test/ElementProxy/CMakeLists.txt b/test/ElementProxy/CMakeLists.txt index 1fc266c0..56d2a111 100644 --- a/test/ElementProxy/CMakeLists.txt +++ b/test/ElementProxy/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(ElementProxyTests add.cpp set.cpp + size.cpp ) target_link_libraries(ElementProxyTests catch) diff --git a/test/ElementProxy/size.cpp b/test/ElementProxy/size.cpp new file mode 100644 index 00000000..6ae235c8 --- /dev/null +++ b/test/ElementProxy/size.cpp @@ -0,0 +1,30 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include + +using namespace ARDUINOJSON_NAMESPACE; + +TEST_CASE("ElementProxy::size()") { + DynamicJsonDocument doc(4096); + doc.addElement(); + ElementProxy ep = doc[0]; + + SECTION("returns 0") { + REQUIRE(ep.size() == 0); + } + + SECTION("as an array, returns 2") { + ep.add(1); + ep.add(2); + REQUIRE(ep.size() == 2); + } + + SECTION("as an object, returns 2") { + ep["a"] = 1; + ep["b"] = 2; + REQUIRE(ep.size() == 2); + } +} diff --git a/test/JsonDocument/CMakeLists.txt b/test/JsonDocument/CMakeLists.txt index e7cd25b2..c9438201 100644 --- a/test/JsonDocument/CMakeLists.txt +++ b/test/JsonDocument/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable(JsonDocumentTests DynamicJsonDocument.cpp isNull.cpp nesting.cpp + size.cpp StaticJsonDocument.cpp subscript.cpp ) diff --git a/test/JsonDocument/size.cpp b/test/JsonDocument/size.cpp new file mode 100644 index 00000000..1366eb7b --- /dev/null +++ b/test/JsonDocument/size.cpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include + +TEST_CASE("JsonDocument::size()") { + DynamicJsonDocument doc(4096); + + SECTION("returns 0") { + REQUIRE(doc.size() == 0); + } + + SECTION("as an array, return 2") { + doc.add(1); + doc.add(2); + + REQUIRE(doc.size() == 2); + } + + SECTION("as an object, return 2") { + doc["a"] = 1; + doc["b"] = 2; + + REQUIRE(doc.size() == 2); + } +} diff --git a/test/MemberProxy/CMakeLists.txt b/test/MemberProxy/CMakeLists.txt index ac35827d..22cb075c 100644 --- a/test/MemberProxy/CMakeLists.txt +++ b/test/MemberProxy/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(MemberProxyTests add.cpp subscript.cpp set.cpp + size.cpp ) target_link_libraries(MemberProxyTests catch) diff --git a/test/MemberProxy/size.cpp b/test/MemberProxy/size.cpp new file mode 100644 index 00000000..639f125b --- /dev/null +++ b/test/MemberProxy/size.cpp @@ -0,0 +1,31 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include + +using namespace ARDUINOJSON_NAMESPACE; + +TEST_CASE("MemberProxy::size()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("returns 0") { + REQUIRE(mp.size() == 0); + } + + SECTION("as an array, return 2") { + mp.add(1); + mp.add(2); + + REQUIRE(mp.size() == 2); + } + + SECTION("as an object, return 2") { + mp["a"] = 1; + mp["b"] = 2; + + REQUIRE(mp.size() == 2); + } +}