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

This commit is contained in:
Benoit Blanchon
2019-01-17 09:55:51 +01:00
parent c51cc91f92
commit 30b94493bb
16 changed files with 172 additions and 0 deletions

View File

@ -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
> >

View File

@ -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;
} }

View File

@ -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:

View File

@ -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);
} }

View File

@ -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();
} }

View File

@ -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;
} }

View File

@ -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();

View File

@ -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);
} }

View File

@ -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

View 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);
}
}

View File

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

View 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);
}
}

View File

@ -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

View 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);
}
}

View File

@ -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

View 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);
}
}