mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-16 12:02:14 +02:00
Fix call of overloaded 'String(const char*, int)' is ambiguous
This commit is contained in:
@ -1,6 +1,11 @@
|
|||||||
ArduinoJson: change log
|
ArduinoJson: change log
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
HEAD
|
||||||
|
----
|
||||||
|
|
||||||
|
* Fix `call of overloaded 'String(const char*, int)' is ambiguous`
|
||||||
|
|
||||||
v6.19.2 (2022-02-14)
|
v6.19.2 (2022-02-14)
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
@ -141,13 +141,13 @@ TEST_CASE("JsonObject::operator[]") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("should duplicate a non-static JsonString key") {
|
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);
|
const size_t expectedSize = JSON_OBJECT_SIZE(1) + JSON_STRING_SIZE(5);
|
||||||
REQUIRE(expectedSize == doc.memoryUsage());
|
REQUIRE(expectedSize == doc.memoryUsage());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("should not duplicate a static JsonString key") {
|
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);
|
const size_t expectedSize = JSON_OBJECT_SIZE(1);
|
||||||
REQUIRE(expectedSize == doc.memoryUsage());
|
REQUIRE(expectedSize == doc.memoryUsage());
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ TEST_CASE("JsonVariant::as()") {
|
|||||||
|
|
||||||
REQUIRE(variant.as<long>() == 42L);
|
REQUIRE(variant.as<long>() == 42L);
|
||||||
REQUIRE(variant.as<JsonString>() == "42");
|
REQUIRE(variant.as<JsonString>() == "42");
|
||||||
REQUIRE(variant.as<JsonString>().isStatic() == true);
|
REQUIRE(variant.as<JsonString>().isLinked() == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(\"hello\")") {
|
SECTION("set(\"hello\")") {
|
||||||
@ -159,7 +159,7 @@ TEST_CASE("JsonVariant::as()") {
|
|||||||
REQUIRE(variant.as<const char*>() == std::string("4.2"));
|
REQUIRE(variant.as<const char*>() == std::string("4.2"));
|
||||||
REQUIRE(variant.as<std::string>() == std::string("4.2"));
|
REQUIRE(variant.as<std::string>() == std::string("4.2"));
|
||||||
REQUIRE(variant.as<JsonString>() == "4.2");
|
REQUIRE(variant.as<JsonString>() == "4.2");
|
||||||
REQUIRE(variant.as<JsonString>().isStatic() == false);
|
REQUIRE(variant.as<JsonString>().isLinked() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(\"true\")") {
|
SECTION("set(\"true\")") {
|
||||||
|
@ -98,7 +98,7 @@ TEST_CASE("JsonVariant::set() when there is enough memory") {
|
|||||||
char str[16];
|
char str[16];
|
||||||
|
|
||||||
strcpy(str, "hello");
|
strcpy(str, "hello");
|
||||||
bool result = variant.set(JsonString(str, true));
|
bool result = variant.set(JsonString(str, JsonString::Linked));
|
||||||
strcpy(str, "world");
|
strcpy(str, "world");
|
||||||
|
|
||||||
REQUIRE(result == true);
|
REQUIRE(result == true);
|
||||||
@ -109,7 +109,7 @@ TEST_CASE("JsonVariant::set() when there is enough memory") {
|
|||||||
char str[16];
|
char str[16];
|
||||||
|
|
||||||
strcpy(str, "hello");
|
strcpy(str, "hello");
|
||||||
bool result = variant.set(JsonString(str, false));
|
bool result = variant.set(JsonString(str, JsonString::Copied));
|
||||||
strcpy(str, "world");
|
strcpy(str, "world");
|
||||||
|
|
||||||
REQUIRE(result == true);
|
REQUIRE(result == true);
|
||||||
|
@ -13,7 +13,7 @@ TEST_CASE("JsonString") {
|
|||||||
|
|
||||||
CHECK(s.isNull() == true);
|
CHECK(s.isNull() == true);
|
||||||
CHECK(s.c_str() == 0);
|
CHECK(s.c_str() == 0);
|
||||||
CHECK(s.isStatic() == true);
|
CHECK(s.isLinked() == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("Compare null with boolean") {
|
SECTION("Compare null with boolean") {
|
||||||
@ -82,4 +82,11 @@ TEST_CASE("JsonString") {
|
|||||||
ss << JsonString("hello world!");
|
ss << JsonString("hello world!");
|
||||||
CHECK(ss.str() == "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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ inline bool CollectionData::copyFrom(const CollectionData& src,
|
|||||||
for (VariantSlot* s = src._head; s; s = s->next()) {
|
for (VariantSlot* s = src._head; s; s = s->next()) {
|
||||||
VariantData* var;
|
VariantData* var;
|
||||||
if (s->key() != 0) {
|
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));
|
var = addMember(adaptString(key), pool, getStringStoragePolicy(key));
|
||||||
} else {
|
} else {
|
||||||
var = addElement(pool);
|
var = addElement(pool);
|
||||||
|
@ -13,7 +13,8 @@ class Pair {
|
|||||||
public:
|
public:
|
||||||
Pair(MemoryPool* pool, VariantSlot* slot) {
|
Pair(MemoryPool* pool, VariantSlot* slot) {
|
||||||
if (slot) {
|
if (slot) {
|
||||||
_key = String(slot->key(), !slot->ownsKey());
|
_key = String(slot->key(),
|
||||||
|
slot->ownsKey() ? String::Copied : String::Linked);
|
||||||
_value = VariantRef(pool, slot->data());
|
_value = VariantRef(pool, slot->data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -35,7 +36,8 @@ class PairConst {
|
|||||||
public:
|
public:
|
||||||
PairConst(const VariantSlot* slot) {
|
PairConst(const VariantSlot* slot) {
|
||||||
if (slot) {
|
if (slot) {
|
||||||
_key = String(slot->key(), !slot->ownsKey());
|
_key = String(slot->key(),
|
||||||
|
slot->ownsKey() ? String::Copied : String::Linked);
|
||||||
_value = VariantConstRef(slot->data());
|
_value = VariantConstRef(slot->data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class StringCopier {
|
|||||||
String save() {
|
String save() {
|
||||||
ARDUINOJSON_ASSERT(_ptr);
|
ARDUINOJSON_ASSERT(_ptr);
|
||||||
ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator
|
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) {
|
void append(const char* s) {
|
||||||
@ -52,7 +52,7 @@ class StringCopier {
|
|||||||
ARDUINOJSON_ASSERT(_ptr);
|
ARDUINOJSON_ASSERT(_ptr);
|
||||||
ARDUINOJSON_ASSERT(_size < _capacity);
|
ARDUINOJSON_ASSERT(_size < _capacity);
|
||||||
_ptr[_size] = 0;
|
_ptr[_size] = 0;
|
||||||
return String(_ptr, _size, false);
|
return String(_ptr, _size, String::Copied);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -33,7 +33,7 @@ class StringMover {
|
|||||||
|
|
||||||
String str() const {
|
String str() const {
|
||||||
_writePtr[0] = 0; // terminator
|
_writePtr[0] = 0; // terminator
|
||||||
return String(_startPtr, size(), true);
|
return String(_startPtr, size(), String::Linked);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const {
|
size_t size() const {
|
||||||
|
@ -12,7 +12,7 @@ namespace ARDUINOJSON_NAMESPACE {
|
|||||||
struct LinkStringStoragePolicy {
|
struct LinkStringStoragePolicy {
|
||||||
template <typename TAdaptedString, typename TCallback>
|
template <typename TAdaptedString, typename TCallback>
|
||||||
bool store(TAdaptedString str, MemoryPool *, TCallback callback) {
|
bool store(TAdaptedString str, MemoryPool *, TCallback callback) {
|
||||||
String storedString(str.data(), str.size(), true);
|
String storedString(str.data(), str.size(), String::Linked);
|
||||||
callback(storedString);
|
callback(storedString);
|
||||||
return !str.isNull();
|
return !str.isNull();
|
||||||
}
|
}
|
||||||
@ -50,7 +50,7 @@ inline LinkStringStoragePolicy getStringStoragePolicy(const char *) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline LinkOrCopyStringStoragePolicy getStringStoragePolicy(const String &s) {
|
inline LinkOrCopyStringStoragePolicy getStringStoragePolicy(const String &s) {
|
||||||
return LinkOrCopyStringStoragePolicy(s.isStatic());
|
return LinkOrCopyStringStoragePolicy(s.isLinked());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
@ -14,15 +14,15 @@ namespace ARDUINOJSON_NAMESPACE {
|
|||||||
|
|
||||||
class String : public SafeBoolIdom<String> {
|
class String : public SafeBoolIdom<String> {
|
||||||
public:
|
public:
|
||||||
String() : _data(0), _size(0), _isStatic(true) {}
|
enum Ownership { Copied, Linked };
|
||||||
|
|
||||||
String(const char* data, bool isStaticData = true)
|
String() : _data(0), _size(0), _ownership(Linked) {}
|
||||||
: _data(data),
|
|
||||||
_size(data ? ::strlen(data) : 0),
|
|
||||||
_isStatic(isStaticData) {}
|
|
||||||
|
|
||||||
String(const char* data, size_t sz, bool isStaticData = true)
|
String(const char* data, Ownership ownership = Linked)
|
||||||
: _data(data), _size(sz), _isStatic(isStaticData) {}
|
: _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 {
|
const char* c_str() const {
|
||||||
return _data;
|
return _data;
|
||||||
@ -32,8 +32,8 @@ class String : public SafeBoolIdom<String> {
|
|||||||
return !_data;
|
return !_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isStatic() const {
|
bool isLinked() const {
|
||||||
return _isStatic;
|
return _ownership == Linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const {
|
size_t size() const {
|
||||||
@ -75,7 +75,7 @@ class String : public SafeBoolIdom<String> {
|
|||||||
private:
|
private:
|
||||||
const char* _data;
|
const char* _data;
|
||||||
size_t _size;
|
size_t _size;
|
||||||
bool _isStatic;
|
Ownership _ownership;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
@ -208,7 +208,7 @@ class MemoryPoolPrint : public Print {
|
|||||||
|
|
||||||
String str() {
|
String str() {
|
||||||
ARDUINOJSON_ASSERT(_size < _capacity);
|
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) {
|
size_t write(uint8_t c) {
|
||||||
|
@ -210,7 +210,7 @@ class VariantData {
|
|||||||
|
|
||||||
void setString(String s) {
|
void setString(String s) {
|
||||||
ARDUINOJSON_ASSERT(s);
|
ARDUINOJSON_ASSERT(s);
|
||||||
if (s.isStatic())
|
if (s.isLinked())
|
||||||
setType(VALUE_IS_LINKED_STRING);
|
setType(VALUE_IS_LINKED_STRING);
|
||||||
else
|
else
|
||||||
setType(VALUE_IS_OWNED_STRING);
|
setType(VALUE_IS_OWNED_STRING);
|
||||||
|
@ -73,9 +73,11 @@ inline T VariantData::asFloat() const {
|
|||||||
inline String VariantData::asString() const {
|
inline String VariantData::asString() const {
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case VALUE_IS_LINKED_STRING:
|
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:
|
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:
|
default:
|
||||||
return String();
|
return String();
|
||||||
}
|
}
|
||||||
@ -174,7 +176,7 @@ template <typename TAdaptedString, typename TCallback>
|
|||||||
bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool,
|
bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool,
|
||||||
TCallback callback) {
|
TCallback callback) {
|
||||||
const char *copy = pool->saveString(str);
|
const char *copy = pool->saveString(str);
|
||||||
String storedString(copy, str.size(), false);
|
String storedString(copy, str.size(), String::Copied);
|
||||||
callback(storedString);
|
callback(storedString);
|
||||||
return copy != 0;
|
return copy != 0;
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ class VariantSlot {
|
|||||||
|
|
||||||
void setKey(String k) {
|
void setKey(String k) {
|
||||||
ARDUINOJSON_ASSERT(k);
|
ARDUINOJSON_ASSERT(k);
|
||||||
if (k.isStatic())
|
if (k.isLinked())
|
||||||
_flags &= VALUE_MASK;
|
_flags &= VALUE_MASK;
|
||||||
else
|
else
|
||||||
_flags |= OWNED_KEY_BIT;
|
_flags |= OWNED_KEY_BIT;
|
||||||
|
Reference in New Issue
Block a user