Эх сурвалжийг харах

Added nesting() to JsonArray, JsonDocument, JsonObject, and JsonVariant

Benoit Blanchon 7 жил өмнө
parent
commit
30b94493bb

+ 1 - 0
CHANGELOG.md

@@ -11,6 +11,7 @@ HEAD
 * `JsonVariant::set()` accepts `JsonArrayConst` and `JsonObjectConst`
 * `JsonVariant::set()` accepts `JsonArrayConst` and `JsonObjectConst`
 * `JsonDocument` was missing in the ArduinoJson namespace
 * `JsonDocument` was missing in the ArduinoJson namespace
 * Added `memoryUsage()` to `JsonArray`, `JsonObject`, and `JsonVariant`
 * Added `memoryUsage()` to `JsonArray`, `JsonObject`, and `JsonVariant`
+* Added `nesting()` to `JsonArray`, `JsonDocument`, `JsonObject`, and `JsonVariant`
 
 
 > ### BREAKING CHANGES
 > ### BREAKING CHANGES
 > 
 > 

+ 4 - 0
src/ArduinoJson/Array/ArrayRef.hpp

@@ -38,6 +38,10 @@ class ArrayRefBase {
     return _data ? _data->memoryUsage() : 0;
     return _data ? _data->memoryUsage() : 0;
   }
   }
 
 
+  FORCE_INLINE size_t nesting() const {
+    return _data ? _data->nesting() : 0;
+  }
+
   FORCE_INLINE size_t size() const {
   FORCE_INLINE size_t size() const {
     return _data ? _data->size() : 0;
     return _data ? _data->size() : 0;
   }
   }

+ 1 - 0
src/ArduinoJson/Collection/CollectionData.hpp

@@ -56,6 +56,7 @@ class CollectionData {
   void remove(VariantSlot *slot);
   void remove(VariantSlot *slot);
 
 
   size_t memoryUsage() const;
   size_t memoryUsage() const;
+  size_t nesting() const;
   size_t size() const;
   size_t size() const;
 
 
  private:
  private:

+ 9 - 0
src/ArduinoJson/Collection/CollectionImpl.hpp

@@ -147,6 +147,15 @@ inline size_t CollectionData::memoryUsage() const {
   return total;
   return total;
 }
 }
 
 
+inline size_t CollectionData::nesting() const {
+  size_t maxChildNesting = 0;
+  for (VariantSlot* s = _head; s; s = s->next()) {
+    size_t childNesting = s->data()->nesting();
+    if (childNesting > maxChildNesting) maxChildNesting = childNesting;
+  }
+  return maxChildNesting + 1;
+}
+
 inline size_t CollectionData::size() const {
 inline size_t CollectionData::size() const {
   return slotSize(_head);
   return slotSize(_head);
 }
 }

+ 4 - 0
src/ArduinoJson/Document/JsonDocument.hpp

@@ -43,6 +43,10 @@ class JsonDocument : public Visitable {
     return _pool.size();
     return _pool.size();
   }
   }
 
 
+  size_t nesting() const {
+    return _data.nesting();
+  }
+
   size_t capacity() const {
   size_t capacity() const {
     return _pool.capacity();
     return _pool.capacity();
   }
   }

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

@@ -46,6 +46,10 @@ class ObjectRefBase {
     return _data ? _data->memoryUsage() : 0;
     return _data ? _data->memoryUsage() : 0;
   }
   }
 
 
+  FORCE_INLINE size_t nesting() const {
+    return _data ? _data->nesting() : 0;
+  }
+
   FORCE_INLINE size_t size() const {
   FORCE_INLINE size_t size() const {
     return _data ? _data->size() : 0;
     return _data ? _data->size() : 0;
   }
   }

+ 10 - 0
src/ArduinoJson/Variant/VariantData.hpp

@@ -280,6 +280,16 @@ class VariantData {
     }
     }
   }
   }
 
 
+  size_t nesting() const {
+    switch (type()) {
+      case VALUE_IS_OBJECT:
+      case VALUE_IS_ARRAY:
+        return _content.asCollection.nesting();
+      default:
+        return 0;
+    }
+  }
+
   size_t size() const {
   size_t size() const {
     if (type() == VALUE_IS_OBJECT || type() == VALUE_IS_ARRAY)
     if (type() == VALUE_IS_OBJECT || type() == VALUE_IS_ARRAY)
       return _content.asCollection.size();
       return _content.asCollection.size();

+ 4 - 0
src/ArduinoJson/Variant/VariantRef.hpp

@@ -99,6 +99,10 @@ class VariantRefBase {
     return _data ? _data->memoryUsage() : 0;
     return _data ? _data->memoryUsage() : 0;
   }
   }
 
 
+  FORCE_INLINE size_t nesting() const {
+    return _data ? _data->nesting() : 0;
+  }
+
   size_t size() const {
   size_t size() const {
     return variantSize(_data);
     return variantSize(_data);
   }
   }

+ 1 - 0
test/JsonArray/CMakeLists.txt

@@ -12,6 +12,7 @@ add_executable(JsonArrayTests
 	isNull.cpp
 	isNull.cpp
 	iterator.cpp
 	iterator.cpp
 	memoryUsage.cpp
 	memoryUsage.cpp
+	nesting.cpp
 	remove.cpp
 	remove.cpp
 	size.cpp
 	size.cpp
 	std_string.cpp
 	std_string.cpp

+ 35 - 0
test/JsonArray/nesting.cpp

@@ -0,0 +1,35 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2018
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+TEST_CASE("JsonArray::nesting()") {
+  DynamicJsonDocument doc(4096);
+  JsonArray arr = doc.to<JsonArray>();
+
+  SECTION("return 0 if uninitialized") {
+    JsonArray unitialized;
+    REQUIRE(unitialized.nesting() == 0);
+  }
+
+  SECTION("returns 1 for empty array") {
+    REQUIRE(arr.nesting() == 1);
+  }
+
+  SECTION("returns 1 for flat array") {
+    arr.add("hello");
+    REQUIRE(arr.nesting() == 1);
+  }
+
+  SECTION("returns 2 with nested array") {
+    arr.createNestedArray();
+    REQUIRE(arr.nesting() == 2);
+  }
+
+  SECTION("returns 2 with nested object") {
+    arr.createNestedObject();
+    REQUIRE(arr.nesting() == 2);
+  }
+}

+ 1 - 0
test/JsonDocument/CMakeLists.txt

@@ -4,6 +4,7 @@
 
 
 add_executable(JsonDocumentTests
 add_executable(JsonDocumentTests
 	DynamicJsonDocument.cpp
 	DynamicJsonDocument.cpp
+	nesting.cpp
 	StaticJsonDocument.cpp
 	StaticJsonDocument.cpp
 )
 )
 
 

+ 30 - 0
test/JsonDocument/nesting.cpp

@@ -0,0 +1,30 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2018
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+TEST_CASE("JsonDocument::nesting()") {
+  DynamicJsonDocument doc(4096);
+
+  SECTION("return 0 if uninitialized") {
+    REQUIRE(doc.nesting() == 0);
+  }
+
+  SECTION("returns 0 for string") {
+    JsonVariant var = doc.to<JsonVariant>();
+    var.set("hello");
+    REQUIRE(doc.nesting() == 0);
+  }
+
+  SECTION("returns 1 for empty object") {
+    doc.to<JsonObject>();
+    REQUIRE(doc.nesting() == 1);
+  }
+
+  SECTION("returns 1 for empty array") {
+    doc.to<JsonArray>();
+    REQUIRE(doc.nesting() == 1);
+  }
+}

+ 1 - 0
test/JsonObject/CMakeLists.txt

@@ -12,6 +12,7 @@ add_executable(JsonObjectTests
 	isNull.cpp
 	isNull.cpp
 	iterator.cpp
 	iterator.cpp
 	memoryUsage.cpp
 	memoryUsage.cpp
+	nesting.cpp
 	remove.cpp
 	remove.cpp
 	size.cpp
 	size.cpp
 	std_string.cpp
 	std_string.cpp

+ 35 - 0
test/JsonObject/nesting.cpp

@@ -0,0 +1,35 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2018
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+TEST_CASE("JsonObject::nesting()") {
+  DynamicJsonDocument doc(4096);
+  JsonObject obj = doc.to<JsonObject>();
+
+  SECTION("return 0 if uninitialized") {
+    JsonObject unitialized;
+    REQUIRE(unitialized.nesting() == 0);
+  }
+
+  SECTION("returns 1 for empty object") {
+    REQUIRE(obj.nesting() == 1);
+  }
+
+  SECTION("returns 1 for flat object") {
+    obj["hello"] = "world";
+    REQUIRE(obj.nesting() == 1);
+  }
+
+  SECTION("returns 2 with nested array") {
+    obj.createNestedArray("nested");
+    REQUIRE(obj.nesting() == 2);
+  }
+
+  SECTION("returns 2 with nested object") {
+    obj.createNestedObject("nested");
+    REQUIRE(obj.nesting() == 2);
+  }
+}

+ 1 - 0
test/JsonVariant/CMakeLists.txt

@@ -10,6 +10,7 @@ add_executable(JsonVariantTests
 	is.cpp
 	is.cpp
 	isnull.cpp
 	isnull.cpp
 	memoryUsage.cpp
 	memoryUsage.cpp
+	nesting.cpp
 	misc.cpp
 	misc.cpp
 	or.cpp
 	or.cpp
 	set.cpp
 	set.cpp

+ 31 - 0
test/JsonVariant/nesting.cpp

@@ -0,0 +1,31 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2018
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+TEST_CASE("JsonVariant::nesting()") {
+  DynamicJsonDocument doc(4096);
+  JsonVariant var = doc.to<JsonVariant>();
+
+  SECTION("return 0 if uninitialized") {
+    JsonVariant unitialized;
+    REQUIRE(unitialized.nesting() == 0);
+  }
+
+  SECTION("returns 0 for string") {
+    var.set("hello");
+    REQUIRE(var.nesting() == 0);
+  }
+
+  SECTION("returns 1 for empty object") {
+    var.to<JsonObject>();
+    REQUIRE(var.nesting() == 1);
+  }
+
+  SECTION("returns 1 for empty array") {
+    var.to<JsonArray>();
+    REQUIRE(var.nesting() == 1);
+  }
+}