diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 6d708529..0e77fe35 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -37,10 +37,14 @@ template inline VariantData* CollectionData::addMember(TAdaptedString key, MemoryPool* pool) { VariantSlot* slot = addSlot(pool); - if (!slotSetKey(slot, key, pool)) { + if (!slot) + return 0; + auto storedKey = storeString(pool, key); + if (!storedKey) { removeSlot(slot); return 0; } + slot->setKey(storedKey); return slot->data(); } diff --git a/src/ArduinoJson/Memory/MemoryPool.hpp b/src/ArduinoJson/Memory/MemoryPool.hpp index cd8a15d8..2ea1d68b 100644 --- a/src/ArduinoJson/Memory/MemoryPool.hpp +++ b/src/ArduinoJson/Memory/MemoryPool.hpp @@ -273,35 +273,30 @@ class MemoryPool { StringNode* _strings = nullptr; }; -template -bool storeString(MemoryPool* pool, TAdaptedString str, - StringStoragePolicy::Copy, TCallback callback) { - const char* copy = pool->saveString(str); - JsonString storedString(copy, str.size(), JsonString::Copied); - callback(storedString); - return copy != 0; +template +JsonString storeString(MemoryPool* pool, TAdaptedString str, + StringStoragePolicy::Copy) { + return JsonString(pool->saveString(str), str.size(), JsonString::Copied); } -template -bool storeString(MemoryPool*, TAdaptedString str, StringStoragePolicy::Link, - TCallback callback) { - JsonString storedString(str.data(), str.size(), JsonString::Linked); - callback(storedString); - return !str.isNull(); +template +JsonString storeString(MemoryPool*, TAdaptedString str, + StringStoragePolicy::Link) { + return JsonString(str.data(), str.size(), JsonString::Linked); } -template -bool storeString(MemoryPool* pool, TAdaptedString str, - StringStoragePolicy::LinkOrCopy policy, TCallback callback) { +template +JsonString storeString(MemoryPool* pool, TAdaptedString str, + StringStoragePolicy::LinkOrCopy policy) { if (policy.link) - return storeString(pool, str, StringStoragePolicy::Link(), callback); + return storeString(pool, str, StringStoragePolicy::Link()); else - return storeString(pool, str, StringStoragePolicy::Copy(), callback); + return storeString(pool, str, StringStoragePolicy::Copy()); } -template -bool storeString(MemoryPool* pool, TAdaptedString str, TCallback callback) { - return storeString(pool, str, str.storagePolicy(), callback); +template +JsonString storeString(MemoryPool* pool, TAdaptedString str) { + return storeString(pool, str, str.storagePolicy()); } ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 87c17417..8095cc30 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -153,12 +153,12 @@ struct Converter : private detail::VariantAttorney { }; template -inline typename detail::enable_if::value, bool>::type +inline typename detail::enable_if::value>::type convertToJson(const T& src, JsonVariant dst) { using namespace detail; auto data = VariantAttorney::getData(dst); auto pool = VariantAttorney::getPool(dst); - return variantSetString(data, adaptString(src), pool); + variantSetString(data, adaptString(src), pool); } template <> diff --git a/src/ArduinoJson/Variant/SlotFunctions.hpp b/src/ArduinoJson/Variant/SlotFunctions.hpp index 41ae51d0..29102c92 100644 --- a/src/ArduinoJson/Variant/SlotFunctions.hpp +++ b/src/ArduinoJson/Variant/SlotFunctions.hpp @@ -9,27 +9,6 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -struct SlotKeySetter { - SlotKeySetter(VariantSlot* instance) : _instance(instance) {} - - template - void operator()(TStoredString s) { - if (!s) - return; - ARDUINOJSON_ASSERT(_instance != 0); - _instance->setKey(s); - } - - VariantSlot* _instance; -}; - -template -inline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool) { - if (!var) - return false; - return storeString(pool, key, SlotKeySetter(var)); -} - inline size_t slotSize(const VariantSlot* var) { size_t n = 0; while (var) { diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index a5c3a0d1..b61774d1 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -284,35 +284,11 @@ class VariantData { return _flags & VALUE_MASK; } - template - inline bool setString(TAdaptedString value, MemoryPool* pool) { - if (value.isNull()) { - setNull(); - return true; - } - - return storeString(pool, value, VariantStringSetter(this)); - } - private: void setType(uint8_t t) { _flags &= OWNED_KEY_BIT; _flags |= t; } - - struct VariantStringSetter { - VariantStringSetter(VariantData* instance) : _instance(instance) {} - - template - void operator()(TStoredString s) { - if (s) - _instance->setString(s); - else - _instance->setNull(); - } - - VariantData* _instance; - }; }; ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index c0c91957..6191b650 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -38,9 +38,15 @@ inline void variantSetNull(VariantData* var) { } template -inline bool variantSetString(VariantData* var, TAdaptedString value, +inline void variantSetString(VariantData* var, TAdaptedString value, MemoryPool* pool) { - return var != 0 ? var->setString(value, pool) : 0; + if (!var) + return; + JsonString str = storeString(pool, value); + if (str) + var->setString(str); + else + var->setNull(); } inline size_t variantSize(const VariantData* var) { diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 4372949a..fdf5585c 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -90,8 +90,10 @@ inline bool VariantData::copyFrom(const VariantData& src, MemoryPool* pool) { case VALUE_IS_OBJECT: return toObject().copyFrom(src._content.asCollection, pool); case VALUE_IS_OWNED_STRING: { - JsonString value = src.asString(); - return setString(adaptString(value), pool); + auto str = storeString(pool, adaptString(src.asString()), + StringStoragePolicy::Copy()); + setString(str); + return !str.isNull(); } case VALUE_IS_OWNED_RAW: return storeOwnedRaw(