diff --git a/CHANGELOG.md b/CHANGELOG.md index f49c949d..d67a779e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Fix `call of overloaded 'String(const char*, int)' is ambiguous` + v6.19.2 (2022-02-14) ------- diff --git a/extras/tests/JsonObject/subscript.cpp b/extras/tests/JsonObject/subscript.cpp index b5792491..aa7dde35 100644 --- a/extras/tests/JsonObject/subscript.cpp +++ b/extras/tests/JsonObject/subscript.cpp @@ -141,13 +141,13 @@ TEST_CASE("JsonObject::operator[]") { } SECTION("should duplicate a non-static JsonString key") { - obj[JsonString("hello", false)] = "world"; + obj[JsonString("hello", JsonString::Copied)] = "world"; const size_t expectedSize = JSON_OBJECT_SIZE(1) + JSON_STRING_SIZE(5); REQUIRE(expectedSize == doc.memoryUsage()); } SECTION("should not duplicate a static JsonString key") { - obj[JsonString("hello", true)] = "world"; + obj[JsonString("hello", JsonString::Linked)] = "world"; const size_t expectedSize = JSON_OBJECT_SIZE(1); REQUIRE(expectedSize == doc.memoryUsage()); } diff --git a/extras/tests/JsonVariant/as.cpp b/extras/tests/JsonVariant/as.cpp index 455b8d81..c9956778 100644 --- a/extras/tests/JsonVariant/as.cpp +++ b/extras/tests/JsonVariant/as.cpp @@ -136,7 +136,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 42L); REQUIRE(variant.as() == "42"); - REQUIRE(variant.as().isStatic() == true); + REQUIRE(variant.as().isLinked() == true); } SECTION("set(\"hello\")") { @@ -159,7 +159,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == std::string("4.2")); REQUIRE(variant.as() == std::string("4.2")); REQUIRE(variant.as() == "4.2"); - REQUIRE(variant.as().isStatic() == false); + REQUIRE(variant.as().isLinked() == false); } SECTION("set(\"true\")") { diff --git a/extras/tests/JsonVariant/set.cpp b/extras/tests/JsonVariant/set.cpp index f0bfba39..eba15d43 100644 --- a/extras/tests/JsonVariant/set.cpp +++ b/extras/tests/JsonVariant/set.cpp @@ -98,7 +98,7 @@ TEST_CASE("JsonVariant::set() when there is enough memory") { char str[16]; strcpy(str, "hello"); - bool result = variant.set(JsonString(str, true)); + bool result = variant.set(JsonString(str, JsonString::Linked)); strcpy(str, "world"); REQUIRE(result == true); @@ -109,7 +109,7 @@ TEST_CASE("JsonVariant::set() when there is enough memory") { char str[16]; strcpy(str, "hello"); - bool result = variant.set(JsonString(str, false)); + bool result = variant.set(JsonString(str, JsonString::Copied)); strcpy(str, "world"); REQUIRE(result == true); diff --git a/extras/tests/Misc/JsonString.cpp b/extras/tests/Misc/JsonString.cpp index 10d08d36..b7d606fd 100644 --- a/extras/tests/Misc/JsonString.cpp +++ b/extras/tests/Misc/JsonString.cpp @@ -13,7 +13,7 @@ TEST_CASE("JsonString") { CHECK(s.isNull() == true); CHECK(s.c_str() == 0); - CHECK(s.isStatic() == true); + CHECK(s.isLinked() == true); } SECTION("Compare null with boolean") { @@ -82,4 +82,11 @@ TEST_CASE("JsonString") { ss << JsonString("hello world!"); CHECK(ss.str() == "hello world!"); } + + SECTION("Construct with a size") { + JsonString s("hello world", 5); + + CHECK(s.size() == 5); + CHECK(s.isLinked() == true); + } } diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 60f5cb11..35678eeb 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -64,7 +64,7 @@ inline bool CollectionData::copyFrom(const CollectionData& src, for (VariantSlot* s = src._head; s; s = s->next()) { VariantData* var; if (s->key() != 0) { - String key(s->key(), !s->ownsKey()); + String key(s->key(), s->ownsKey() ? String::Copied : String::Linked); var = addMember(adaptString(key), pool, getStringStoragePolicy(key)); } else { var = addElement(pool); diff --git a/src/ArduinoJson/Object/Pair.hpp b/src/ArduinoJson/Object/Pair.hpp index e9e71eb6..7e3ca32c 100644 --- a/src/ArduinoJson/Object/Pair.hpp +++ b/src/ArduinoJson/Object/Pair.hpp @@ -13,7 +13,8 @@ class Pair { public: Pair(MemoryPool* pool, VariantSlot* slot) { if (slot) { - _key = String(slot->key(), !slot->ownsKey()); + _key = String(slot->key(), + slot->ownsKey() ? String::Copied : String::Linked); _value = VariantRef(pool, slot->data()); } } @@ -35,7 +36,8 @@ class PairConst { public: PairConst(const VariantSlot* slot) { if (slot) { - _key = String(slot->key(), !slot->ownsKey()); + _key = String(slot->key(), + slot->ownsKey() ? String::Copied : String::Linked); _value = VariantConstRef(slot->data()); } } diff --git a/src/ArduinoJson/StringStorage/StringCopier.hpp b/src/ArduinoJson/StringStorage/StringCopier.hpp index 455a155a..f743e4ac 100644 --- a/src/ArduinoJson/StringStorage/StringCopier.hpp +++ b/src/ArduinoJson/StringStorage/StringCopier.hpp @@ -22,7 +22,7 @@ class StringCopier { String save() { ARDUINOJSON_ASSERT(_ptr); ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator - return String(_pool->saveStringFromFreeZone(_size), _size, false); + return String(_pool->saveStringFromFreeZone(_size), _size, String::Copied); } void append(const char* s) { @@ -52,7 +52,7 @@ class StringCopier { ARDUINOJSON_ASSERT(_ptr); ARDUINOJSON_ASSERT(_size < _capacity); _ptr[_size] = 0; - return String(_ptr, _size, false); + return String(_ptr, _size, String::Copied); } private: diff --git a/src/ArduinoJson/StringStorage/StringMover.hpp b/src/ArduinoJson/StringStorage/StringMover.hpp index 4ed7d92e..f4cd1bae 100644 --- a/src/ArduinoJson/StringStorage/StringMover.hpp +++ b/src/ArduinoJson/StringStorage/StringMover.hpp @@ -33,7 +33,7 @@ class StringMover { String str() const { _writePtr[0] = 0; // terminator - return String(_startPtr, size(), true); + return String(_startPtr, size(), String::Linked); } size_t size() const { diff --git a/src/ArduinoJson/Strings/StoragePolicy.hpp b/src/ArduinoJson/Strings/StoragePolicy.hpp index 2a01f0d5..d1e138c4 100644 --- a/src/ArduinoJson/Strings/StoragePolicy.hpp +++ b/src/ArduinoJson/Strings/StoragePolicy.hpp @@ -12,7 +12,7 @@ namespace ARDUINOJSON_NAMESPACE { struct LinkStringStoragePolicy { template bool store(TAdaptedString str, MemoryPool *, TCallback callback) { - String storedString(str.data(), str.size(), true); + String storedString(str.data(), str.size(), String::Linked); callback(storedString); return !str.isNull(); } @@ -50,7 +50,7 @@ inline LinkStringStoragePolicy getStringStoragePolicy(const char *) { } inline LinkOrCopyStringStoragePolicy getStringStoragePolicy(const String &s) { - return LinkOrCopyStringStoragePolicy(s.isStatic()); + return LinkOrCopyStringStoragePolicy(s.isLinked()); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Strings/String.hpp b/src/ArduinoJson/Strings/String.hpp index 1c71c67a..08956f05 100644 --- a/src/ArduinoJson/Strings/String.hpp +++ b/src/ArduinoJson/Strings/String.hpp @@ -14,15 +14,15 @@ namespace ARDUINOJSON_NAMESPACE { class String : public SafeBoolIdom { public: - String() : _data(0), _size(0), _isStatic(true) {} + enum Ownership { Copied, Linked }; - String(const char* data, bool isStaticData = true) - : _data(data), - _size(data ? ::strlen(data) : 0), - _isStatic(isStaticData) {} + String() : _data(0), _size(0), _ownership(Linked) {} - String(const char* data, size_t sz, bool isStaticData = true) - : _data(data), _size(sz), _isStatic(isStaticData) {} + String(const char* data, Ownership ownership = Linked) + : _data(data), _size(data ? ::strlen(data) : 0), _ownership(ownership) {} + + String(const char* data, size_t sz, Ownership ownership = Linked) + : _data(data), _size(sz), _ownership(ownership) {} const char* c_str() const { return _data; @@ -32,8 +32,8 @@ class String : public SafeBoolIdom { return !_data; } - bool isStatic() const { - return _isStatic; + bool isLinked() const { + return _ownership == Linked; } size_t size() const { @@ -75,7 +75,7 @@ class String : public SafeBoolIdom { private: const char* _data; size_t _size; - bool _isStatic; + Ownership _ownership; }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index a825760c..baf1187a 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -208,7 +208,7 @@ class MemoryPoolPrint : public Print { String str() { ARDUINOJSON_ASSERT(_size < _capacity); - return String(_pool->saveStringFromFreeZone(_size), _size, false); + return String(_pool->saveStringFromFreeZone(_size), _size, String::Copied); } size_t write(uint8_t c) { diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 6f807632..27128706 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -210,7 +210,7 @@ class VariantData { void setString(String s) { ARDUINOJSON_ASSERT(s); - if (s.isStatic()) + if (s.isLinked()) setType(VALUE_IS_LINKED_STRING); else setType(VALUE_IS_OWNED_STRING); diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index bd3ce07b..b5a62087 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -73,9 +73,11 @@ inline T VariantData::asFloat() const { inline String VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: - return String(_content.asString.data, _content.asString.size, true); + return String(_content.asString.data, _content.asString.size, + String::Linked); case VALUE_IS_OWNED_STRING: - return String(_content.asString.data, _content.asString.size, false); + return String(_content.asString.data, _content.asString.size, + String::Copied); default: return String(); } @@ -174,7 +176,7 @@ template bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool, TCallback callback) { const char *copy = pool->saveString(str); - String storedString(copy, str.size(), false); + String storedString(copy, str.size(), String::Copied); callback(storedString); return copy != 0; } diff --git a/src/ArduinoJson/Variant/VariantSlot.hpp b/src/ArduinoJson/Variant/VariantSlot.hpp index 8f4169cc..83ff1d78 100644 --- a/src/ArduinoJson/Variant/VariantSlot.hpp +++ b/src/ArduinoJson/Variant/VariantSlot.hpp @@ -78,7 +78,7 @@ class VariantSlot { void setKey(String k) { ARDUINOJSON_ASSERT(k); - if (k.isStatic()) + if (k.isLinked()) _flags &= VALUE_MASK; else _flags |= OWNED_KEY_BIT;