Skip to content

Commit

Permalink
Reduce number of copies of stringEquals()
Browse files Browse the repository at this point in the history
  • Loading branch information
bblanchon committed Jul 10, 2023
1 parent e44b3a4 commit 3a2e02d
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 11 deletions.
18 changes: 17 additions & 1 deletion src/ArduinoJson/Memory/StringPool.hpp
Expand Up @@ -73,8 +73,24 @@ class StringPool {
strings_ = node;
}

StringNode* get(const char* p, size_t n) const {
for (auto node = strings_; node; node = node->next) {
if (stringEquals(node->data, node->length, p, n))
return node;
}
return nullptr;
}

template <typename TAdaptedString>
typename enable_if<string_traits<TAdaptedString>::has_data, StringNode*>::type
get(const TAdaptedString& str) const {
return get(str.data(), str.size());
}

template <typename TAdaptedString>
StringNode* get(const TAdaptedString& str) const {
typename enable_if<!string_traits<TAdaptedString>::has_data,
StringNode*>::type
get(const TAdaptedString& str) const {
for (auto node = strings_; node; node = node->next) {
if (stringEquals(str, adaptString(node->data, node->length)))
return node;
Expand Down
16 changes: 14 additions & 2 deletions src/ArduinoJson/Object/ObjectData.hpp
Expand Up @@ -13,7 +13,14 @@ class ObjectData : public CollectionData {
VariantData* addMember(StringNode* key, ResourceManager* resources);

template <typename TAdaptedString>
VariantData* addMember(TAdaptedString key, ResourceManager* resources);
typename enable_if<string_traits<TAdaptedString>::has_data,
VariantData*>::type
addMember(TAdaptedString key, ResourceManager* resources);

template <typename TAdaptedString>
typename enable_if<!string_traits<TAdaptedString>::has_data,
VariantData*>::type
addMember(TAdaptedString key, ResourceManager* resources);

bool copyFrom(const ObjectData& src, ResourceManager* resources);

Expand Down Expand Up @@ -63,7 +70,12 @@ class ObjectData : public CollectionData {

private:
template <typename TAdaptedString>
iterator findKey(TAdaptedString key) const;
typename enable_if<string_traits<TAdaptedString>::has_data, iterator>::type
findKey(TAdaptedString key) const;

template <typename TAdaptedString>
typename enable_if<!string_traits<TAdaptedString>::has_data, iterator>::type
findKey(TAdaptedString key) const;
};

ARDUINOJSON_END_PRIVATE_NAMESPACE
39 changes: 36 additions & 3 deletions src/ArduinoJson/Object/ObjectImpl.hpp
Expand Up @@ -22,8 +22,9 @@ inline VariantData* ObjectData::addMember(StringNode* key,
}

template <typename TAdaptedString>
inline VariantData* ObjectData::addMember(TAdaptedString key,
ResourceManager* resources) {
inline typename enable_if<string_traits<TAdaptedString>::has_data,
VariantData*>::type
ObjectData::addMember(TAdaptedString key, ResourceManager* resources) {
ARDUINOJSON_ASSERT(!key.isNull());
auto slot = resources->allocVariant();
if (!slot)
Expand All @@ -40,6 +41,22 @@ inline VariantData* ObjectData::addMember(TAdaptedString key,
return slot->data();
}

template <typename TAdaptedString>
inline typename enable_if<!string_traits<TAdaptedString>::has_data,
VariantData*>::type
ObjectData::addMember(TAdaptedString key, ResourceManager* resources) {
ARDUINOJSON_ASSERT(!key.isNull());
auto slot = resources->allocVariant();
if (!slot)
return nullptr;
auto storedKey = resources->saveString(key);
if (!storedKey)
return nullptr;
slot->setKey(storedKey);
addSlot(slot);
return slot->data();
}

inline bool ObjectData::copyFrom(const ObjectData& src,
ResourceManager* resources) {
clear(resources);
Expand Down Expand Up @@ -85,7 +102,9 @@ VariantData* ObjectData::getOrAddMember(TAdaptedString key,
}

template <typename TAdaptedString>
inline ObjectData::iterator ObjectData::findKey(TAdaptedString key) const {
inline typename enable_if<!string_traits<TAdaptedString>::has_data,
ObjectData::iterator>::type
ObjectData::findKey(TAdaptedString key) const {
if (key.isNull())
return end();
for (auto it = begin(); it; ++it) {
Expand All @@ -95,6 +114,20 @@ inline ObjectData::iterator ObjectData::findKey(TAdaptedString key) const {
return end();
}

template <typename TAdaptedString>
inline typename enable_if<string_traits<TAdaptedString>::has_data,
ObjectData::iterator>::type
ObjectData::findKey(TAdaptedString key) const {
if (key.isNull())
return end();
for (auto it = begin(); it; ++it) {
auto itKey = it.key();
if (stringEquals(itKey.c_str(), itKey.size(), key.data(), key.size()))
return it;
}
return end();
}

template <typename TAdaptedString>
inline void ObjectData::removeMember(TAdaptedString key,
ResourceManager* resources) {
Expand Down
4 changes: 0 additions & 4 deletions src/ArduinoJson/Strings/Adapters/FlashString.hpp
Expand Up @@ -26,10 +26,6 @@ class FlashString {
return static_cast<char>(pgm_read_byte(str_ + i));
}

const char* data() const {
return nullptr;
}

size_t size() const {
return size_;
}
Expand Down
10 changes: 10 additions & 0 deletions src/ArduinoJson/Strings/StringAdapters.hpp
Expand Up @@ -74,4 +74,14 @@ static void stringGetChars(TAdaptedString s, char* p, size_t n) {
}
}

inline bool stringEquals(const char* s1, size_t n1, const char* s2, size_t n2) {
if (n1 != n2)
return false;
for (size_t i = 0; i < n1; i++) {
if (s1[i] != s2[i])
return false;
}
return true;
}

ARDUINOJSON_END_PRIVATE_NAMESPACE
16 changes: 15 additions & 1 deletion src/ArduinoJson/Variant/VariantData.hpp
Expand Up @@ -460,7 +460,8 @@ class VariantData {
}

template <typename TAdaptedString>
void setString(TAdaptedString value, ResourceManager* resources) {
typename enable_if<string_traits<TAdaptedString>::has_data>::type setString(
TAdaptedString value, ResourceManager* resources) {
setNull(resources);

if (value.isNull())
Expand All @@ -476,6 +477,19 @@ class VariantData {
setOwnedString(dup);
}

template <typename TAdaptedString>
typename enable_if<!string_traits<TAdaptedString>::has_data>::type setString(
TAdaptedString value, ResourceManager* resources) {
setNull(resources);

if (value.isNull())
return;

auto dup = resources->saveString(value);
if (dup)
setOwnedString(dup);
}

template <typename TAdaptedString>
static void setString(VariantData* var, TAdaptedString value,
ResourceManager* resources) {
Expand Down

0 comments on commit 3a2e02d

Please sign in to comment.