mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Added nesting() to JsonArray, JsonDocument, JsonObject, and JsonVariant
This commit is contained in:
		| @@ -11,6 +11,7 @@ HEAD | ||||
| * `JsonVariant::set()` accepts `JsonArrayConst` and `JsonObjectConst` | ||||
| * `JsonDocument` was missing in the ArduinoJson namespace | ||||
| * Added `memoryUsage()` to `JsonArray`, `JsonObject`, and `JsonVariant` | ||||
| * Added `nesting()` to `JsonArray`, `JsonDocument`, `JsonObject`, and `JsonVariant` | ||||
|  | ||||
| > ### BREAKING CHANGES | ||||
| >  | ||||
|   | ||||
| @@ -38,6 +38,10 @@ class ArrayRefBase { | ||||
|     return _data ? _data->memoryUsage() : 0; | ||||
|   } | ||||
|  | ||||
|   FORCE_INLINE size_t nesting() const { | ||||
|     return _data ? _data->nesting() : 0; | ||||
|   } | ||||
|  | ||||
|   FORCE_INLINE size_t size() const { | ||||
|     return _data ? _data->size() : 0; | ||||
|   } | ||||
|   | ||||
| @@ -56,6 +56,7 @@ class CollectionData { | ||||
|   void remove(VariantSlot *slot); | ||||
|  | ||||
|   size_t memoryUsage() const; | ||||
|   size_t nesting() const; | ||||
|   size_t size() const; | ||||
|  | ||||
|  private: | ||||
|   | ||||
| @@ -147,6 +147,15 @@ inline size_t CollectionData::memoryUsage() const { | ||||
|   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 { | ||||
|   return slotSize(_head); | ||||
| } | ||||
|   | ||||
| @@ -43,6 +43,10 @@ class JsonDocument : public Visitable { | ||||
|     return _pool.size(); | ||||
|   } | ||||
|  | ||||
|   size_t nesting() const { | ||||
|     return _data.nesting(); | ||||
|   } | ||||
|  | ||||
|   size_t capacity() const { | ||||
|     return _pool.capacity(); | ||||
|   } | ||||
|   | ||||
| @@ -46,6 +46,10 @@ class ObjectRefBase { | ||||
|     return _data ? _data->memoryUsage() : 0; | ||||
|   } | ||||
|  | ||||
|   FORCE_INLINE size_t nesting() const { | ||||
|     return _data ? _data->nesting() : 0; | ||||
|   } | ||||
|  | ||||
|   FORCE_INLINE size_t size() const { | ||||
|     return _data ? _data->size() : 0; | ||||
|   } | ||||
|   | ||||
| @@ -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 { | ||||
|     if (type() == VALUE_IS_OBJECT || type() == VALUE_IS_ARRAY) | ||||
|       return _content.asCollection.size(); | ||||
|   | ||||
| @@ -99,6 +99,10 @@ class VariantRefBase { | ||||
|     return _data ? _data->memoryUsage() : 0; | ||||
|   } | ||||
|  | ||||
|   FORCE_INLINE size_t nesting() const { | ||||
|     return _data ? _data->nesting() : 0; | ||||
|   } | ||||
|  | ||||
|   size_t size() const { | ||||
|     return variantSize(_data); | ||||
|   } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ add_executable(JsonArrayTests | ||||
| 	isNull.cpp | ||||
| 	iterator.cpp | ||||
| 	memoryUsage.cpp | ||||
| 	nesting.cpp | ||||
| 	remove.cpp | ||||
| 	size.cpp | ||||
| 	std_string.cpp | ||||
|   | ||||
							
								
								
									
										35
									
								
								test/JsonArray/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								test/JsonArray/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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); | ||||
|   } | ||||
| } | ||||
| @@ -4,6 +4,7 @@ | ||||
|  | ||||
| add_executable(JsonDocumentTests | ||||
| 	DynamicJsonDocument.cpp | ||||
| 	nesting.cpp | ||||
| 	StaticJsonDocument.cpp | ||||
| ) | ||||
|  | ||||
|   | ||||
							
								
								
									
										30
									
								
								test/JsonDocument/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								test/JsonDocument/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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); | ||||
|   } | ||||
| } | ||||
| @@ -12,6 +12,7 @@ add_executable(JsonObjectTests | ||||
| 	isNull.cpp | ||||
| 	iterator.cpp | ||||
| 	memoryUsage.cpp | ||||
| 	nesting.cpp | ||||
| 	remove.cpp | ||||
| 	size.cpp | ||||
| 	std_string.cpp | ||||
|   | ||||
							
								
								
									
										35
									
								
								test/JsonObject/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								test/JsonObject/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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); | ||||
|   } | ||||
| } | ||||
| @@ -10,6 +10,7 @@ add_executable(JsonVariantTests | ||||
| 	is.cpp | ||||
| 	isnull.cpp | ||||
| 	memoryUsage.cpp | ||||
| 	nesting.cpp | ||||
| 	misc.cpp | ||||
| 	or.cpp | ||||
| 	set.cpp | ||||
|   | ||||
							
								
								
									
										31
									
								
								test/JsonVariant/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/JsonVariant/nesting.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user