From 035c913c72c2f802978adaa2d28c6fda6fc7d3d9 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 29 Mar 2023 19:28:44 +0200 Subject: [PATCH] Remove `ARDUINOJSON_ENABLE_STRING_DEDUPLICATION` --- CHANGELOG.md | 1 + extras/tests/JsonDeserializer/string.cpp | 20 +++ extras/tests/JsonDocument/MemberProxy.cpp | 57 ++++++++ extras/tests/JsonDocument/add.cpp | 40 ++++++ .../tests/MixedConfiguration/CMakeLists.txt | 2 - .../enable_string_deduplication_0.cpp | 123 ------------------ .../enable_string_deduplication_1.cpp | 122 ----------------- src/ArduinoJson/Configuration.hpp | 4 - src/ArduinoJson/Memory/MemoryPool.hpp | 6 - src/ArduinoJson/Namespace.hpp | 22 ++-- 10 files changed, 129 insertions(+), 268 deletions(-) delete mode 100644 extras/tests/MixedConfiguration/enable_string_deduplication_0.cpp delete mode 100644 extras/tests/MixedConfiguration/enable_string_deduplication_1.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 41b2a5ce..7857b142 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ HEAD * Add abstract `Allocator` class * Merge `DynamicJsonDocument` with `JsonDocument` * Remove `JSON_ARRAY_SIZE()`, `JSON_OBJECT_SIZE()`, and `JSON_STRING_SIZE()` +* Remove `ARDUINOJSON_ENABLE_STRING_DEDUPLICATION` (string deduplication cannot be enabled anymore) diff --git a/extras/tests/JsonDeserializer/string.cpp b/extras/tests/JsonDeserializer/string.cpp index 7d7707c8..f26dca39 100644 --- a/extras/tests/JsonDeserializer/string.cpp +++ b/extras/tests/JsonDeserializer/string.cpp @@ -6,6 +6,7 @@ #include #include +using ArduinoJson::detail::sizeofArray; using ArduinoJson::detail::sizeofObject; using ArduinoJson::detail::sizeofString; @@ -133,3 +134,22 @@ TEST_CASE("Empty memory pool") { REQUIRE(deserializeJson(doc, empty) == DeserializationError::Ok); } } + +TEST_CASE("Deduplicate values") { + JsonDocument doc(1024); + deserializeJson(doc, "[\"example\",\"example\"]"); + + CHECK(doc.memoryUsage() == sizeofArray(2) + 8); + CHECK(doc[0].as() == doc[1].as()); +} + +TEST_CASE("Deduplicate keys") { + JsonDocument doc(1024); + deserializeJson(doc, "[{\"example\":1},{\"example\":2}]"); + + CHECK(doc.memoryUsage() == 2 * sizeofObject(1) + sizeofArray(2) + 8); + + const char* key1 = doc[0].as().begin()->key().c_str(); + const char* key2 = doc[1].as().begin()->key().c_str(); + CHECK(key1 == key2); +} diff --git a/extras/tests/JsonDocument/MemberProxy.cpp b/extras/tests/JsonDocument/MemberProxy.cpp index 486a310c..3b54c561 100644 --- a/extras/tests/JsonDocument/MemberProxy.cpp +++ b/extras/tests/JsonDocument/MemberProxy.cpp @@ -2,9 +2,17 @@ // Copyright © 2014-2023, Benoit BLANCHON // MIT License +#include "progmem_emulation.hpp" + +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 +#define ARDUINOJSON_ENABLE_PROGMEM 1 #include + #include +using ArduinoJson::detail::sizeofArray; +using ArduinoJson::detail::sizeofObject; + typedef ArduinoJson::detail::MemberProxy MemberProxy; @@ -326,3 +334,52 @@ TEST_CASE("MemberProxy::shallowCopy()") { CHECK(doc1.as() == "{\"obj\":{\"hello\":\"world\"}}"); } + +TEST_CASE("Deduplicate keys") { + JsonDocument doc(1024); + + SECTION("std::string") { + doc[0][std::string("example")] = 1; + doc[1][std::string("example")] = 2; + + CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); + + const char* key1 = doc[0].as().begin()->key().c_str(); + const char* key2 = doc[1].as().begin()->key().c_str(); + CHECK(key1 == key2); + } + + SECTION("char*") { + char key[] = "example"; + doc[0][key] = 1; + doc[1][key] = 2; + + CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); + + const char* key1 = doc[0].as().begin()->key().c_str(); + const char* key2 = doc[1].as().begin()->key().c_str(); + CHECK(key1 == key2); + } + + SECTION("Arduino String") { + doc[0][String("example")] = 1; + doc[1][String("example")] = 2; + + CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); + + const char* key1 = doc[0].as().begin()->key().c_str(); + const char* key2 = doc[1].as().begin()->key().c_str(); + CHECK(key1 == key2); + } + + SECTION("Flash string") { + doc[0][F("example")] = 1; + doc[1][F("example")] = 2; + + CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); + + const char* key1 = doc[0].as().begin()->key().c_str(); + const char* key2 = doc[1].as().begin()->key().c_str(); + CHECK(key1 == key2); + } +} diff --git a/extras/tests/JsonDocument/add.cpp b/extras/tests/JsonDocument/add.cpp index 56aa0c53..fdd6e5da 100644 --- a/extras/tests/JsonDocument/add.cpp +++ b/extras/tests/JsonDocument/add.cpp @@ -2,9 +2,16 @@ // Copyright © 2014-2023, Benoit BLANCHON // MIT License +#include "progmem_emulation.hpp" + +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 +#define ARDUINOJSON_ENABLE_PROGMEM 1 #include + #include +using ArduinoJson::detail::sizeofArray; + TEST_CASE("JsonDocument::add()") { JsonDocument doc(4096); @@ -19,4 +26,37 @@ TEST_CASE("JsonDocument::add()") { REQUIRE(doc.as() == "[\"hello\"]"); } + + SECTION("std::string") { + doc.add(std::string("example")); + doc.add(std::string("example")); + + CHECK(doc.memoryUsage() == sizeofArray(2) + 8); + CHECK(doc[0].as() == doc[1].as()); + } + + SECTION("char*") { + char value[] = "example"; + doc.add(value); + doc.add(value); + + CHECK(doc.memoryUsage() == sizeofArray(2) + 8); + CHECK(doc[0].as() == doc[1].as()); + } + + SECTION("Arduino String") { + doc.add(String("example")); + doc.add(String("example")); + + CHECK(doc.memoryUsage() == sizeofArray(2) + 8); + CHECK(doc[0].as() == doc[1].as()); + } + + SECTION("Flash string") { + doc.add(F("example")); + doc.add(F("example")); + + CHECK(doc.memoryUsage() == sizeofArray(2) + 8); + CHECK(doc[0].as() == doc[1].as()); + } } diff --git a/extras/tests/MixedConfiguration/CMakeLists.txt b/extras/tests/MixedConfiguration/CMakeLists.txt index c2c9dc5c..4d03ffdd 100644 --- a/extras/tests/MixedConfiguration/CMakeLists.txt +++ b/extras/tests/MixedConfiguration/CMakeLists.txt @@ -14,8 +14,6 @@ add_executable(MixedConfigurationTests enable_nan_0.cpp enable_nan_1.cpp enable_progmem_1.cpp - enable_string_deduplication_0.cpp - enable_string_deduplication_1.cpp issue1707.cpp use_double_0.cpp use_double_1.cpp diff --git a/extras/tests/MixedConfiguration/enable_string_deduplication_0.cpp b/extras/tests/MixedConfiguration/enable_string_deduplication_0.cpp deleted file mode 100644 index 7e4e5f7b..00000000 --- a/extras/tests/MixedConfiguration/enable_string_deduplication_0.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2023, Benoit BLANCHON -// MIT License - -#include "progmem_emulation.hpp" - -#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 -#define ARDUINOJSON_ENABLE_PROGMEM 1 -#define ARDUINOJSON_ENABLE_STRING_DEDUPLICATION 0 -#include - -#include - -using ArduinoJson::detail::sizeofArray; -using ArduinoJson::detail::sizeofObject; - -TEST_CASE("ARDUINOJSON_ENABLE_STRING_DEDUPLICATION = 0") { - JsonDocument doc(1024); - - SECTION("deserializeJson()") { - SECTION("Deduplicate values") { - deserializeJson(doc, "[\"example\",\"example\"]"); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 16); - CHECK(doc[0].as() != doc[1].as()); - } - - SECTION("Deduplicate keys") { - deserializeJson(doc, "[{\"example\":1},{\"example\":2}]"); - - CHECK(doc.memoryUsage() == 2 * sizeofObject(1) + sizeofArray(2) + 16); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - - CHECK(key1 != key2); - } - } - - SECTION("JsonDocument") { - SECTION("values") { - SECTION("std::string") { - doc.add(std::string("example")); - doc.add(std::string("example")); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 16); - CHECK(doc[0].as() != doc[1].as()); - } - - SECTION("char*") { - char value[] = "example"; - doc.add(value); - doc.add(value); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 16); - CHECK(doc[0].as() != doc[1].as()); - } - - SECTION("Arduino String") { - doc.add(String("example")); - doc.add(String("example")); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 16); - CHECK(doc[0].as() != doc[1].as()); - } - - SECTION("Flash string") { - doc.add(F("example")); - doc.add(F("example")); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 16); - CHECK(doc[0].as() != doc[1].as()); - } - } - - SECTION("keys") { - SECTION("std::string") { - doc[0][std::string("example")] = 1; - doc[1][std::string("example")] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 16); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 != key2); - } - - SECTION("char*") { - char key[] = "example"; - doc[0][key] = 1; - doc[1][key] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 16); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 != key2); - } - - SECTION("Arduino String") { - doc[0][String("example")] = 1; - doc[1][String("example")] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 16); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 != key2); - } - - SECTION("Flash string") { - doc[0][F("example")] = 1; - doc[1][F("example")] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 16); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 != key2); - } - } - } -} diff --git a/extras/tests/MixedConfiguration/enable_string_deduplication_1.cpp b/extras/tests/MixedConfiguration/enable_string_deduplication_1.cpp deleted file mode 100644 index a68e579d..00000000 --- a/extras/tests/MixedConfiguration/enable_string_deduplication_1.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2023, Benoit BLANCHON -// MIT License - -#include "progmem_emulation.hpp" - -#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 -#define ARDUINOJSON_ENABLE_PROGMEM 1 -#define ARDUINOJSON_ENABLE_STRING_DEDUPLICATION 1 -#include - -#include - -using ArduinoJson::detail::sizeofArray; -using ArduinoJson::detail::sizeofObject; - -TEST_CASE("ARDUINOJSON_ENABLE_STRING_DEDUPLICATION = 1") { - JsonDocument doc(1024); - - SECTION("deserializeJson()") { - SECTION("Deduplicate values") { - deserializeJson(doc, "[\"example\",\"example\"]"); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 8); - CHECK(doc[0].as() == doc[1].as()); - } - - SECTION("Deduplicate keys") { - deserializeJson(doc, "[{\"example\":1},{\"example\":2}]"); - - CHECK(doc.memoryUsage() == 2 * sizeofObject(1) + sizeofArray(2) + 8); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 == key2); - } - } - - SECTION("JsonDocument") { - SECTION("values") { - SECTION("std::string") { - doc.add(std::string("example")); - doc.add(std::string("example")); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 8); - CHECK(doc[0].as() == doc[1].as()); - } - - SECTION("char*") { - char value[] = "example"; - doc.add(value); - doc.add(value); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 8); - CHECK(doc[0].as() == doc[1].as()); - } - - SECTION("Arduino String") { - doc.add(String("example")); - doc.add(String("example")); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 8); - CHECK(doc[0].as() == doc[1].as()); - } - - SECTION("Flash string") { - doc.add(F("example")); - doc.add(F("example")); - - CHECK(doc.memoryUsage() == sizeofArray(2) + 8); - CHECK(doc[0].as() == doc[1].as()); - } - } - - SECTION("keys") { - SECTION("std::string") { - doc[0][std::string("example")] = 1; - doc[1][std::string("example")] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 == key2); - } - - SECTION("char*") { - char key[] = "example"; - doc[0][key] = 1; - doc[1][key] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 == key2); - } - - SECTION("Arduino String") { - doc[0][String("example")] = 1; - doc[1][String("example")] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 == key2); - } - - SECTION("Flash string") { - doc[0][F("example")] = 1; - doc[1][F("example")] = 2; - - CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8); - - const char* key1 = doc[0].as().begin()->key().c_str(); - const char* key2 = doc[1].as().begin()->key().c_str(); - CHECK(key1 == key2); - } - } - } -} diff --git a/src/ArduinoJson/Configuration.hpp b/src/ArduinoJson/Configuration.hpp index b33a8339..56b23f8d 100644 --- a/src/ArduinoJson/Configuration.hpp +++ b/src/ArduinoJson/Configuration.hpp @@ -191,10 +191,6 @@ # define ARDUINOJSON_TAB " " #endif -#ifndef ARDUINOJSON_ENABLE_STRING_DEDUPLICATION -# define ARDUINOJSON_ENABLE_STRING_DEDUPLICATION 1 -#endif - #ifndef ARDUINOJSON_STRING_BUFFER_SIZE # define ARDUINOJSON_STRING_BUFFER_SIZE 32 #endif diff --git a/src/ArduinoJson/Memory/MemoryPool.hpp b/src/ArduinoJson/Memory/MemoryPool.hpp index d20d0a7c..4964f8e9 100644 --- a/src/ArduinoJson/Memory/MemoryPool.hpp +++ b/src/ArduinoJson/Memory/MemoryPool.hpp @@ -105,11 +105,9 @@ class MemoryPool { if (str.isNull()) return 0; -#if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION const char* existingCopy = findString(str); if (existingCopy) return existingCopy; -#endif size_t n = str.size(); @@ -127,11 +125,9 @@ class MemoryPool { } const char* saveStringFromFreeZone(size_t len) { -#if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION const char* dup = findString(adaptString(_left, len)); if (dup) return dup; -#endif const char* str = _left; _left += len; @@ -221,7 +217,6 @@ class MemoryPool { ARDUINOJSON_ASSERT(isAligned(_right)); } -#if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION template const char* findString(const TAdaptedString& str) const { size_t n = str.size(); @@ -235,7 +230,6 @@ class MemoryPool { } return 0; } -#endif char* allocString(size_t n) { if (!canAlloc(n)) { diff --git a/src/ArduinoJson/Namespace.hpp b/src/ArduinoJson/Namespace.hpp index 7f3b8b49..8d6cfb85 100644 --- a/src/ArduinoJson/Namespace.hpp +++ b/src/ArduinoJson/Namespace.hpp @@ -10,17 +10,17 @@ #ifndef ARDUINOJSON_VERSION_NAMESPACE -# define ARDUINOJSON_VERSION_NAMESPACE \ - ARDUINOJSON_CONCAT3( \ - ARDUINOJSON_CONCAT4(V, ARDUINOJSON_VERSION_MAJOR, \ - ARDUINOJSON_VERSION_MINOR, \ - ARDUINOJSON_VERSION_REVISION), \ - ARDUINOJSON_BIN2ALPHA( \ - ARDUINOJSON_ENABLE_PROGMEM, ARDUINOJSON_USE_LONG_LONG, \ - ARDUINOJSON_USE_DOUBLE, ARDUINOJSON_ENABLE_STRING_DEDUPLICATION), \ - ARDUINOJSON_BIN2ALPHA( \ - ARDUINOJSON_ENABLE_NAN, ARDUINOJSON_ENABLE_INFINITY, \ - ARDUINOJSON_ENABLE_COMMENTS, ARDUINOJSON_DECODE_UNICODE)) +# define ARDUINOJSON_VERSION_NAMESPACE \ + ARDUINOJSON_CONCAT3(ARDUINOJSON_CONCAT4(V, ARDUINOJSON_VERSION_MAJOR, \ + ARDUINOJSON_VERSION_MINOR, \ + ARDUINOJSON_VERSION_REVISION), \ + ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_PROGMEM, \ + ARDUINOJSON_USE_LONG_LONG, \ + ARDUINOJSON_USE_DOUBLE, 1), \ + ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_NAN, \ + ARDUINOJSON_ENABLE_INFINITY, \ + ARDUINOJSON_ENABLE_COMMENTS, \ + ARDUINOJSON_DECODE_UNICODE)) #endif