Replace JsonString::Ownership with bool

This commit is contained in:
Benoit Blanchon
2024-11-26 14:32:29 +01:00
parent 8931651317
commit ed5f890d28
9 changed files with 23 additions and 23 deletions

View File

@ -8,6 +8,7 @@ HEAD
* Make `ElementProxy` and `MemberProxy` non-copyable * Make `ElementProxy` and `MemberProxy` non-copyable
* Change string copy policy: only string literal are stored by pointer * Change string copy policy: only string literal are stored by pointer
* `JsonString` is now stored by copy, unless specified otherwise * `JsonString` is now stored by copy, unless specified otherwise
* Replace undocumented `JsonString::Ownership` with `bool`
> ### BREAKING CHANGES > ### BREAKING CHANGES
> >

View File

@ -158,7 +158,7 @@ TEST_CASE("JsonObject::operator[]") {
} }
SECTION("should duplicate a non-static JsonString key") { SECTION("should duplicate a non-static JsonString key") {
obj[JsonString("hello", JsonString::Copied)] = "world"; obj[JsonString("hello", false)] = "world";
REQUIRE(spy.log() == AllocatorLog{ REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()), Allocate(sizeofPool()),
Allocate(sizeofString("hello")), Allocate(sizeofString("hello")),
@ -166,7 +166,7 @@ TEST_CASE("JsonObject::operator[]") {
} }
SECTION("should not duplicate a static JsonString key") { SECTION("should not duplicate a static JsonString key") {
obj[JsonString("hello", JsonString::Linked)] = "world"; obj[JsonString("hello", true)] = "world";
REQUIRE(spy.log() == AllocatorLog{ REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()), Allocate(sizeofPool()),
}); });

View File

@ -132,7 +132,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, JsonString::Linked)); bool result = variant.set(JsonString(str, true));
strcpy(str, "world"); strcpy(str, "world");
REQUIRE(result == true); REQUIRE(result == true);
@ -144,7 +144,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, JsonString::Copied)); bool result = variant.set(JsonString(str));
strcpy(str, "world"); strcpy(str, "world");
REQUIRE(result == true); REQUIRE(result == true);

View File

@ -101,7 +101,7 @@ TEST_CASE("adaptString()") {
} }
SECTION("JsonString linked") { SECTION("JsonString linked") {
JsonString orig("hello", JsonString::Ownership::Linked); JsonString orig("hello", true);
auto s = adaptString(orig); auto s = adaptString(orig);
CHECK(s.isNull() == false); CHECK(s.isNull() == false);
@ -110,7 +110,7 @@ TEST_CASE("adaptString()") {
} }
SECTION("JsonString copied") { SECTION("JsonString copied") {
JsonString orig("hello", JsonString::Ownership::Copied); JsonString orig("hello", false);
auto s = adaptString(orig); auto s = adaptString(orig);
CHECK(s.isNull() == false); CHECK(s.isNull() == false);

View File

@ -139,8 +139,7 @@ TEST_CASE("serialize MsgPack value") {
SECTION("str 32") { SECTION("str 32") {
std::string shortest(65536, '?'); std::string shortest(65536, '?');
checkVariant(JsonString(shortest.c_str(), checkVariant(JsonString(shortest.c_str(), true), // force store by pointer
JsonString::Linked), // force store by pointer
"\xDB\x00\x01\x00\x00"_s + shortest); "\xDB\x00\x01\x00\x00"_s + shortest);
} }

View File

@ -55,7 +55,7 @@ class StringBuffer {
JsonString str() const { JsonString str() const {
ARDUINOJSON_ASSERT(node_ != nullptr); ARDUINOJSON_ASSERT(node_ != nullptr);
return JsonString(node_->data, node_->length, JsonString::Copied); return JsonString(node_->data, node_->length);
} }
private: private:

View File

@ -68,7 +68,7 @@ class StringBuilder {
JsonString str() const { JsonString str() const {
ARDUINOJSON_ASSERT(node_ != nullptr); ARDUINOJSON_ASSERT(node_ != nullptr);
node_->data[size_] = 0; node_->data[size_] = 0;
return JsonString(node_->data, size_, JsonString::Copied); return JsonString(node_->data, size_);
} }
private: private:

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <ArduinoJson/Polyfills/type_traits.hpp>
#include <ArduinoJson/Strings/Adapters/RamString.hpp> #include <ArduinoJson/Strings/Adapters/RamString.hpp>
#if ARDUINOJSON_ENABLE_STD_STREAM #if ARDUINOJSON_ENABLE_STD_STREAM
@ -18,15 +19,16 @@ class JsonString {
friend struct detail::StringAdapter<JsonString>; friend struct detail::StringAdapter<JsonString>;
public: public:
enum Ownership { Copied, Linked };
JsonString() : str_(nullptr, 0, true) {} JsonString() : str_(nullptr, 0, true) {}
JsonString(const char* data, Ownership ownership = Copied) JsonString(const char* data, bool isStatic = false)
: str_(data, data ? ::strlen(data) : 0, ownership == Linked) {} : str_(data, data ? ::strlen(data) : 0, isStatic) {}
JsonString(const char* data, size_t sz, Ownership ownership = Copied) template <typename TSize, typename = detail::enable_if_t<
: str_(data, sz, ownership == Linked) {} detail::is_integral<TSize>::value &&
!detail::is_same<TSize, bool>::value>>
JsonString(const char* data, TSize sz, bool isStatic = false)
: str_(data, size_t(sz), isStatic) {}
// Returns a pointer to the characters. // Returns a pointer to the characters.
const char* c_str() const { const char* c_str() const {

View File

@ -64,13 +64,11 @@ class VariantData {
return visit.visit(content_.asObject); return visit.visit(content_.asObject);
case VariantType::LinkedString: case VariantType::LinkedString:
return visit.visit( return visit.visit(JsonString(content_.asLinkedString, true));
JsonString(content_.asLinkedString, JsonString::Linked));
case VariantType::OwnedString: case VariantType::OwnedString:
return visit.visit(JsonString(content_.asOwnedString->data, return visit.visit(JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, content_.asOwnedString->length));
JsonString::Copied));
case VariantType::RawString: case VariantType::RawString:
return visit.visit(RawString(content_.asOwnedString->data, return visit.visit(RawString(content_.asOwnedString->data,
@ -262,7 +260,7 @@ class VariantData {
switch (type_) { switch (type_) {
case VariantType::RawString: case VariantType::RawString:
return JsonString(content_.asOwnedString->data, return JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, JsonString::Copied); content_.asOwnedString->length);
default: default:
return JsonString(); return JsonString();
} }
@ -271,10 +269,10 @@ class VariantData {
JsonString asString() const { JsonString asString() const {
switch (type_) { switch (type_) {
case VariantType::LinkedString: case VariantType::LinkedString:
return JsonString(content_.asLinkedString, JsonString::Linked); return JsonString(content_.asLinkedString, true);
case VariantType::OwnedString: case VariantType::OwnedString:
return JsonString(content_.asOwnedString->data, return JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, JsonString::Copied); content_.asOwnedString->length);
default: default:
return JsonString(); return JsonString();
} }