From e16767af927befad12e57eb4d3fe5c13256e2211 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 16 Dec 2021 14:42:54 +0100 Subject: [PATCH] Avoid pool reallocation in `BasicJsonDocument`'s copy assignment --- .../tests/JsonDocument/BasicJsonDocument.cpp | 32 ++++++++++++++++++- .../Document/BasicJsonDocument.hpp | 3 ++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/extras/tests/JsonDocument/BasicJsonDocument.cpp b/extras/tests/JsonDocument/BasicJsonDocument.cpp index a30c8112..7580c85a 100644 --- a/extras/tests/JsonDocument/BasicJsonDocument.cpp +++ b/extras/tests/JsonDocument/BasicJsonDocument.cpp @@ -89,7 +89,7 @@ TEST_CASE("BasicJsonDocument") { } #endif - SECTION("Copy assign") { + SECTION("Copy assign larger") { { BasicJsonDocument doc1(4096, log); doc1.set(std::string("The size of this string is 32!!")); @@ -104,6 +104,36 @@ TEST_CASE("BasicJsonDocument") { REQUIRE(log.str() == "A4096A8FA4096FF"); } + SECTION("Copy assign smaller") { + { + BasicJsonDocument doc1(1024, log); + doc1.set(std::string("The size of this string is 32!!")); + BasicJsonDocument doc2(4096, log); + + doc2 = doc1; + + REQUIRE(doc1.as() == "The size of this string is 32!!"); + REQUIRE(doc2.as() == "The size of this string is 32!!"); + REQUIRE(doc2.capacity() == 1024); + } + REQUIRE(log.str() == "A1024A4096FA1024FF"); + } + + SECTION("Copy assign same size") { + { + BasicJsonDocument doc1(1024, log); + doc1.set(std::string("The size of this string is 32!!")); + BasicJsonDocument doc2(1024, log); + + doc2 = doc1; + + REQUIRE(doc1.as() == "The size of this string is 32!!"); + REQUIRE(doc2.as() == "The size of this string is 32!!"); + REQUIRE(doc2.capacity() == 1024); + } + REQUIRE(log.str() == "A1024A1024FF"); + } + #if ARDUINOJSON_HAS_RVALUE_REFERENCES SECTION("Move assign") { { diff --git a/src/ArduinoJson/Document/BasicJsonDocument.hpp b/src/ArduinoJson/Document/BasicJsonDocument.hpp index 2f7b382f..3ab250fb 100644 --- a/src/ArduinoJson/Document/BasicJsonDocument.hpp +++ b/src/ArduinoJson/Document/BasicJsonDocument.hpp @@ -139,6 +139,9 @@ class BasicJsonDocument : AllocatorOwner, public JsonDocument { } void reallocPool(size_t requiredSize) { + size_t capa = addPadding(requiredSize); + if (capa == _pool.capacity()) + return; freePool(); replacePool(allocPool(addPadding(requiredSize))); }