diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a9ed809..17616d1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ HEAD * Fixed incorrect string comparison on some platforms (issue #1198) * Added move-constructor and move-assignment to `BasicJsonDocument` * Added `BasicJsonDocument::garbageCollect()` (issue #1195) +* Added `StaticJsonDocument::garbageCollect()` * Changed copy-constructor of `BasicJsonDocument` to preserve the capacity of the source. > ### BREAKING CHANGES diff --git a/extras/tests/JsonDocument/StaticJsonDocument.cpp b/extras/tests/JsonDocument/StaticJsonDocument.cpp index b2cb73d1..dc6a1d41 100644 --- a/extras/tests/JsonDocument/StaticJsonDocument.cpp +++ b/extras/tests/JsonDocument/StaticJsonDocument.cpp @@ -209,4 +209,16 @@ TEST_CASE("StaticJsonDocument") { REQUIRE_JSON(doc2, "42"); } } + + SECTION("garbageCollect()") { + StaticJsonDocument<256> doc; + doc[std::string("example")] = std::string("example"); + doc.remove("example"); + REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1) + 16); + + doc.garbageCollect(); + + REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(0)); + REQUIRE_JSON(doc, "{}"); + } } diff --git a/src/ArduinoJson/Document/BasicJsonDocument.hpp b/src/ArduinoJson/Document/BasicJsonDocument.hpp index a539659f..ebebf47c 100644 --- a/src/ArduinoJson/Document/BasicJsonDocument.hpp +++ b/src/ArduinoJson/Document/BasicJsonDocument.hpp @@ -120,7 +120,7 @@ class BasicJsonDocument : AllocatorOwner, public JsonDocument { bool garbageCollect() { // make a temporary clone and move assign - BasicJsonDocument tmp(*this); + BasicJsonDocument tmp(*this); if (!tmp.capacity()) return false; tmp.set(*this); diff --git a/src/ArduinoJson/Document/StaticJsonDocument.hpp b/src/ArduinoJson/Document/StaticJsonDocument.hpp index 052de7f4..02e6e119 100644 --- a/src/ArduinoJson/Document/StaticJsonDocument.hpp +++ b/src/ArduinoJson/Document/StaticJsonDocument.hpp @@ -44,6 +44,11 @@ class StaticJsonDocument : public JsonDocument { return *this; } + void garbageCollect() { + StaticJsonDocument tmp(*this); + set(tmp); + } + private: char _buffer[_capacity]; };