فهرست منبع

Added `JsonDocument::size()`

Benoit Blanchon 7 سال پیش
والد
کامیت
e22e62d184

+ 2 - 1
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)
 -----------

+ 4 - 0
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<VariantRef>().set(src.as<VariantRef>());
   }

+ 4 - 0
src/ArduinoJson/Object/MemberProxy.hpp

@@ -63,6 +63,10 @@ class MemberProxy : public VariantOperators<MemberProxy<TObject, TStringRef> >,
     return getUpstreamMember().template is<TValue>();
   }
 
+  FORCE_INLINE size_t size() const {
+    return getUpstreamMember().size();
+  }
+
   template <typename TValue>
   FORCE_INLINE typename VariantTo<TValue>::type to() {
     return getOrAddUpstreamMember().template to<TValue>();

+ 1 - 0
test/ElementProxy/CMakeLists.txt

@@ -5,6 +5,7 @@
 add_executable(ElementProxyTests
 	add.cpp
 	set.cpp
+	size.cpp
 )
 
 target_link_libraries(ElementProxyTests catch)

+ 30 - 0
test/ElementProxy/size.cpp

@@ -0,0 +1,30 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2019
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+using namespace ARDUINOJSON_NAMESPACE;
+
+TEST_CASE("ElementProxy::size()") {
+  DynamicJsonDocument doc(4096);
+  doc.addElement();
+  ElementProxy<JsonDocument&> 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);
+  }
+}

+ 1 - 0
test/JsonDocument/CMakeLists.txt

@@ -8,6 +8,7 @@ add_executable(JsonDocumentTests
 	DynamicJsonDocument.cpp
 	isNull.cpp
 	nesting.cpp
+	size.cpp
 	StaticJsonDocument.cpp
 	subscript.cpp
 )

+ 28 - 0
test/JsonDocument/size.cpp

@@ -0,0 +1,28 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2019
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+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);
+  }
+}

+ 1 - 0
test/MemberProxy/CMakeLists.txt

@@ -6,6 +6,7 @@ add_executable(MemberProxyTests
 	add.cpp
 	subscript.cpp
 	set.cpp
+	size.cpp
 )
 
 target_link_libraries(MemberProxyTests catch)

+ 31 - 0
test/MemberProxy/size.cpp

@@ -0,0 +1,31 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2019
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+using namespace ARDUINOJSON_NAMESPACE;
+
+TEST_CASE("MemberProxy::size()") {
+  DynamicJsonDocument doc(4096);
+  MemberProxy<JsonDocument&, const char*> 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);
+  }
+}