forked from bblanchon/ArduinoJson
Added nesting() to JsonArray, JsonDocument, JsonObject, and JsonVariant
This commit is contained in:
@ -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
|
||||||
>
|
>
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
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
|
add_executable(JsonDocumentTests
|
||||||
DynamicJsonDocument.cpp
|
DynamicJsonDocument.cpp
|
||||||
|
nesting.cpp
|
||||||
StaticJsonDocument.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
|
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
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
|
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
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