Skip to content

Commit 05b68fc

Browse files
committed
Change StringBuilder::save() to take a VariantData*
1 parent b06cee8 commit 05b68fc

File tree

4 files changed

+61
-37
lines changed

4 files changed

+61
-37
lines changed

extras/tests/ResourceManager/StringBuilder.cpp

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <catch.hpp>
77

88
#include "Allocators.hpp"
9+
#include "Literals.hpp"
910

1011
using namespace ArduinoJson::detail;
1112

@@ -16,9 +17,10 @@ TEST_CASE("StringBuilder") {
1617

1718
SECTION("Empty string") {
1819
StringBuilder str(&resources);
20+
VariantData data;
1921

2022
str.startString();
21-
str.save();
23+
str.save(&data);
2224

2325
REQUIRE(resources.size() == sizeofString(""));
2426
REQUIRE(resources.overflowed() == false);
@@ -96,48 +98,69 @@ TEST_CASE("StringBuilder") {
9698
}
9799
}
98100

99-
static StringNode* addStringToPool(ResourceManager& resources, const char* s) {
100-
StringBuilder str(&resources);
101-
str.startString();
102-
str.append(s);
103-
return str.save();
101+
static const char* saveString(StringBuilder& builder, const char* s) {
102+
VariantData data;
103+
builder.startString();
104+
builder.append(s);
105+
builder.save(&data);
106+
return data.asString().c_str();
104107
}
105108

106109
TEST_CASE("StringBuilder::save() deduplicates strings") {
107-
ResourceManager resources;
110+
SpyingAllocator spy;
111+
ResourceManager resources(&spy);
112+
StringBuilder builder(&resources);
108113

109114
SECTION("Basic") {
110-
auto s1 = addStringToPool(resources, "hello");
111-
auto s2 = addStringToPool(resources, "world");
112-
auto s3 = addStringToPool(resources, "hello");
113-
114-
REQUIRE(s1 == s3);
115-
REQUIRE(s2 != s3);
116-
REQUIRE(s1->references == 2);
117-
REQUIRE(s2->references == 1);
118-
REQUIRE(s3->references == 2);
119-
REQUIRE(resources.size() == sizeofString("hello") + sizeofString("world"));
115+
auto s1 = saveString(builder, "hello");
116+
auto s2 = saveString(builder, "world");
117+
auto s3 = saveString(builder, "hello");
118+
119+
REQUIRE(s1 == "hello"_s);
120+
REQUIRE(s2 == "world"_s);
121+
REQUIRE(+s1 == +s3); // same address
122+
123+
REQUIRE(spy.log() ==
124+
AllocatorLog{
125+
Allocate(sizeofStringBuffer()),
126+
Reallocate(sizeofStringBuffer(), sizeofString("hello")),
127+
Allocate(sizeofStringBuffer()),
128+
Reallocate(sizeofStringBuffer(), sizeofString("world")),
129+
Allocate(sizeofStringBuffer()),
130+
});
120131
}
121132

122133
SECTION("Requires terminator") {
123-
auto s1 = addStringToPool(resources, "hello world");
124-
auto s2 = addStringToPool(resources, "hello");
134+
auto s1 = saveString(builder, "hello world");
135+
auto s2 = saveString(builder, "hello");
125136

126-
REQUIRE(s2 != s1);
127-
REQUIRE(s1->references == 1);
128-
REQUIRE(s2->references == 1);
129-
REQUIRE(resources.size() ==
130-
sizeofString("hello world") + sizeofString("hello"));
137+
REQUIRE(s1 == "hello world"_s);
138+
REQUIRE(s2 == "hello"_s);
139+
REQUIRE(+s2 != +s1); // different address
140+
141+
REQUIRE(spy.log() ==
142+
AllocatorLog{
143+
Allocate(sizeofStringBuffer()),
144+
Reallocate(sizeofStringBuffer(), sizeofString("hello world")),
145+
Allocate(sizeofStringBuffer()),
146+
Reallocate(sizeofStringBuffer(), sizeofString("hello")),
147+
});
131148
}
132149

133150
SECTION("Don't overrun") {
134-
auto s1 = addStringToPool(resources, "hello world");
135-
auto s2 = addStringToPool(resources, "wor");
151+
auto s1 = saveString(builder, "hello world");
152+
auto s2 = saveString(builder, "wor");
136153

154+
REQUIRE(s1 == "hello world"_s);
155+
REQUIRE(s2 == "wor"_s);
137156
REQUIRE(s2 != s1);
138-
REQUIRE(s1->references == 1);
139-
REQUIRE(s2->references == 1);
140-
REQUIRE(resources.size() ==
141-
sizeofString("hello world") + sizeofString("wor"));
157+
158+
REQUIRE(spy.log() ==
159+
AllocatorLog{
160+
Allocate(sizeofStringBuffer()),
161+
Reallocate(sizeofStringBuffer(), sizeofString("hello world")),
162+
Allocate(sizeofStringBuffer()),
163+
Reallocate(sizeofStringBuffer(), sizeofString("wor")),
164+
});
142165
}
143166
}

src/ArduinoJson/Json/JsonDeserializer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ class JsonDeserializer {
279279
if (!keyVariant)
280280
return DeserializationError::NoMemory;
281281

282-
keyVariant->setOwnedString(stringBuilder_.save());
282+
stringBuilder_.save(keyVariant);
283283
} else {
284284
member->clear(resources_);
285285
}
@@ -388,7 +388,7 @@ class JsonDeserializer {
388388
if (err)
389389
return err;
390390

391-
variant.setOwnedString(stringBuilder_.save());
391+
stringBuilder_.save(&variant);
392392

393393
return DeserializationError::Ok;
394394
}

src/ArduinoJson/Memory/StringBuilder.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class StringBuilder {
2525
node_ = resources_->createString(initialCapacity);
2626
}
2727

28-
StringNode* save() {
28+
void save(VariantData* variant) {
29+
ARDUINOJSON_ASSERT(variant != nullptr);
2930
ARDUINOJSON_ASSERT(node_ != nullptr);
3031
node_->data[size_] = 0;
3132
StringNode* node = resources_->getString(adaptString(node_->data, size_));
@@ -37,7 +38,7 @@ class StringBuilder {
3738
} else {
3839
node->references++;
3940
}
40-
return node;
41+
variant->setOwnedString(node);
4142
}
4243

4344
void append(const char* s) {

src/ArduinoJson/Variant/ConverterImpl.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,9 @@ class StringBuilderPrint : public Print {
230230
copier_.startString();
231231
}
232232

233-
StringNode* save() {
233+
void save(VariantData* data) {
234234
ARDUINOJSON_ASSERT(!overflowed());
235-
return copier_.save();
235+
copier_.save(data);
236236
}
237237

238238
size_t write(uint8_t c) {
@@ -268,7 +268,7 @@ inline void convertToJson(const ::Printable& src, JsonVariant dst) {
268268
src.printTo(print);
269269
if (print.overflowed())
270270
return;
271-
data->setOwnedString(print.save());
271+
print.save(data);
272272
}
273273

274274
#endif

0 commit comments

Comments
 (0)