forked from bblanchon/ArduinoJson
Deduplicate static strings
This commit is contained in:
@@ -382,6 +382,24 @@ TEST_CASE("Deduplicate keys") {
|
|||||||
Allocate(sizeofString("example")),
|
Allocate(sizeofString("example")),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("string literals") {
|
||||||
|
doc[0]["example"] = 1;
|
||||||
|
doc[1]["example"] = 2;
|
||||||
|
doc.shrinkToFit();
|
||||||
|
|
||||||
|
const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
|
||||||
|
const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
|
||||||
|
CHECK(key1 == key2);
|
||||||
|
|
||||||
|
REQUIRE(spy.log() ==
|
||||||
|
AllocatorLog{
|
||||||
|
Allocate(sizeofPool()),
|
||||||
|
Allocate(sizeofStaticStringPool()),
|
||||||
|
Reallocate(sizeofPool(), sizeofPool(6)),
|
||||||
|
Reallocate(sizeofStaticStringPool(), sizeofStaticStringPool(1)),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("MemberProxy under memory constraints") {
|
TEST_CASE("MemberProxy under memory constraints") {
|
||||||
|
@@ -19,6 +19,25 @@ static StringNode* saveString(ResourceManager& resources, const char* s,
|
|||||||
return resources.saveString(adaptString(s, n));
|
return resources.saveString(adaptString(s, n));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("ResourceManager::saveStaticString()") {
|
||||||
|
SpyingAllocator spy;
|
||||||
|
ResourceManager resources(&spy);
|
||||||
|
|
||||||
|
auto a = resources.saveStaticString("hello");
|
||||||
|
auto b = resources.saveStaticString("world");
|
||||||
|
REQUIRE(a != b);
|
||||||
|
|
||||||
|
auto c = resources.saveStaticString("hello");
|
||||||
|
REQUIRE(a == c);
|
||||||
|
|
||||||
|
resources.shrinkToFit();
|
||||||
|
REQUIRE(spy.log() ==
|
||||||
|
AllocatorLog{
|
||||||
|
Allocate(sizeofStaticStringPool()),
|
||||||
|
Reallocate(sizeofStaticStringPool(), sizeofStaticStringPool(2)),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("ResourceManager::saveString()") {
|
TEST_CASE("ResourceManager::saveString()") {
|
||||||
ResourceManager resources;
|
ResourceManager resources;
|
||||||
|
|
||||||
|
@@ -81,6 +81,14 @@ class MemoryPool {
|
|||||||
return slots_ + id;
|
return slots_ + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SlotId find(const T& value) const {
|
||||||
|
for (SlotId i = 0; i < usage_; i++) {
|
||||||
|
if (slots_[i] == value)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return NULL_SLOT;
|
||||||
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
usage_ = 0;
|
usage_ = 0;
|
||||||
}
|
}
|
||||||
|
@@ -114,6 +114,15 @@ class MemoryPoolList {
|
|||||||
return pools_[poolIndex].getSlot(indexInPool);
|
return pools_[poolIndex].getSlot(indexInPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SlotId find(const T& value) const {
|
||||||
|
for (PoolCount i = 0; i < count_; i++) {
|
||||||
|
SlotId id = pools_[i].find(value);
|
||||||
|
if (id != NULL_SLOT)
|
||||||
|
return SlotId(i * ARDUINOJSON_POOL_CAPACITY + id);
|
||||||
|
}
|
||||||
|
return NULL_SLOT;
|
||||||
|
}
|
||||||
|
|
||||||
void clear(Allocator* allocator) {
|
void clear(Allocator* allocator) {
|
||||||
for (PoolCount i = 0; i < count_; i++)
|
for (PoolCount i = 0; i < count_; i++)
|
||||||
pools_[i].destroy(allocator);
|
pools_[i].destroy(allocator);
|
||||||
|
@@ -114,10 +114,14 @@ class ResourceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SlotId saveStaticString(const char* s) {
|
SlotId saveStaticString(const char* s) {
|
||||||
|
auto existingSlotId = staticStringsPools_.find(s);
|
||||||
|
if (existingSlotId != NULL_SLOT)
|
||||||
|
return existingSlotId;
|
||||||
|
|
||||||
auto slot = staticStringsPools_.allocSlot(allocator_);
|
auto slot = staticStringsPools_.allocSlot(allocator_);
|
||||||
if (!slot)
|
if (slot)
|
||||||
return NULL_SLOT;
|
*slot = s;
|
||||||
*slot = s;
|
|
||||||
return slot.id();
|
return slot.id();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user