Fix call of overloaded 'String(const char*, int)' is ambiguous

This commit is contained in:
Benoit Blanchon
2022-02-17 10:47:42 +01:00
parent ef8379df1b
commit a880614a75
15 changed files with 47 additions and 31 deletions

View File

@ -1,6 +1,11 @@
ArduinoJson: change log
=======================
HEAD
----
* Fix `call of overloaded 'String(const char*, int)' is ambiguous`
v6.19.2 (2022-02-14)
-------

View File

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

View File

@ -136,7 +136,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<long>() == 42L);
REQUIRE(variant.as<JsonString>() == "42");
REQUIRE(variant.as<JsonString>().isStatic() == true);
REQUIRE(variant.as<JsonString>().isLinked() == true);
}
SECTION("set(\"hello\")") {
@ -159,7 +159,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<const char*>() == std::string("4.2"));
REQUIRE(variant.as<std::string>() == std::string("4.2"));
REQUIRE(variant.as<JsonString>() == "4.2");
REQUIRE(variant.as<JsonString>().isStatic() == false);
REQUIRE(variant.as<JsonString>().isLinked() == false);
}
SECTION("set(\"true\")") {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ namespace ARDUINOJSON_NAMESPACE {
struct LinkStringStoragePolicy {
template <typename TAdaptedString, typename TCallback>
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

View File

@ -14,15 +14,15 @@ namespace ARDUINOJSON_NAMESPACE {
class String : public SafeBoolIdom<String> {
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<String> {
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<String> {
private:
const char* _data;
size_t _size;
bool _isStatic;
Ownership _ownership;
};
} // namespace ARDUINOJSON_NAMESPACE

View File

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

View File

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

View File

@ -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 <typename TAdaptedString, typename TCallback>
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;
}

View File

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