Remove callback from storeString()

This commit is contained in:
Benoit Blanchon
2023-04-17 09:42:59 +02:00
parent 9d0714efdf
commit 30c111fd3d
7 changed files with 35 additions and 73 deletions

View File

@ -37,10 +37,14 @@ template <typename TAdaptedString>
inline VariantData* CollectionData::addMember(TAdaptedString key, inline VariantData* CollectionData::addMember(TAdaptedString key,
MemoryPool* pool) { MemoryPool* pool) {
VariantSlot* slot = addSlot(pool); VariantSlot* slot = addSlot(pool);
if (!slotSetKey(slot, key, pool)) { if (!slot)
return 0;
auto storedKey = storeString(pool, key);
if (!storedKey) {
removeSlot(slot); removeSlot(slot);
return 0; return 0;
} }
slot->setKey(storedKey);
return slot->data(); return slot->data();
} }

View File

@ -273,35 +273,30 @@ class MemoryPool {
StringNode* _strings = nullptr; StringNode* _strings = nullptr;
}; };
template <typename TAdaptedString, typename TCallback> template <typename TAdaptedString>
bool storeString(MemoryPool* pool, TAdaptedString str, JsonString storeString(MemoryPool* pool, TAdaptedString str,
StringStoragePolicy::Copy, TCallback callback) { StringStoragePolicy::Copy) {
const char* copy = pool->saveString(str); return JsonString(pool->saveString(str), str.size(), JsonString::Copied);
JsonString storedString(copy, str.size(), JsonString::Copied);
callback(storedString);
return copy != 0;
} }
template <typename TAdaptedString, typename TCallback> template <typename TAdaptedString>
bool storeString(MemoryPool*, TAdaptedString str, StringStoragePolicy::Link, JsonString storeString(MemoryPool*, TAdaptedString str,
TCallback callback) { StringStoragePolicy::Link) {
JsonString storedString(str.data(), str.size(), JsonString::Linked); return JsonString(str.data(), str.size(), JsonString::Linked);
callback(storedString);
return !str.isNull();
} }
template <typename TAdaptedString, typename TCallback> template <typename TAdaptedString>
bool storeString(MemoryPool* pool, TAdaptedString str, JsonString storeString(MemoryPool* pool, TAdaptedString str,
StringStoragePolicy::LinkOrCopy policy, TCallback callback) { StringStoragePolicy::LinkOrCopy policy) {
if (policy.link) if (policy.link)
return storeString(pool, str, StringStoragePolicy::Link(), callback); return storeString(pool, str, StringStoragePolicy::Link());
else else
return storeString(pool, str, StringStoragePolicy::Copy(), callback); return storeString(pool, str, StringStoragePolicy::Copy());
} }
template <typename TAdaptedString, typename TCallback> template <typename TAdaptedString>
bool storeString(MemoryPool* pool, TAdaptedString str, TCallback callback) { JsonString storeString(MemoryPool* pool, TAdaptedString str) {
return storeString(pool, str, str.storagePolicy(), callback); return storeString(pool, str, str.storagePolicy());
} }
ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -153,12 +153,12 @@ struct Converter<JsonString> : private detail::VariantAttorney {
}; };
template <typename T> template <typename T>
inline typename detail::enable_if<detail::IsString<T>::value, bool>::type inline typename detail::enable_if<detail::IsString<T>::value>::type
convertToJson(const T& src, JsonVariant dst) { convertToJson(const T& src, JsonVariant dst) {
using namespace detail; using namespace detail;
auto data = VariantAttorney::getData(dst); auto data = VariantAttorney::getData(dst);
auto pool = VariantAttorney::getPool(dst); auto pool = VariantAttorney::getPool(dst);
return variantSetString(data, adaptString(src), pool); variantSetString(data, adaptString(src), pool);
} }
template <> template <>

View File

@ -9,27 +9,6 @@
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
struct SlotKeySetter {
SlotKeySetter(VariantSlot* instance) : _instance(instance) {}
template <typename TStoredString>
void operator()(TStoredString s) {
if (!s)
return;
ARDUINOJSON_ASSERT(_instance != 0);
_instance->setKey(s);
}
VariantSlot* _instance;
};
template <typename TAdaptedString>
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) { inline size_t slotSize(const VariantSlot* var) {
size_t n = 0; size_t n = 0;
while (var) { while (var) {

View File

@ -284,35 +284,11 @@ class VariantData {
return _flags & VALUE_MASK; return _flags & VALUE_MASK;
} }
template <typename TAdaptedString>
inline bool setString(TAdaptedString value, MemoryPool* pool) {
if (value.isNull()) {
setNull();
return true;
}
return storeString(pool, value, VariantStringSetter(this));
}
private: private:
void setType(uint8_t t) { void setType(uint8_t t) {
_flags &= OWNED_KEY_BIT; _flags &= OWNED_KEY_BIT;
_flags |= t; _flags |= t;
} }
struct VariantStringSetter {
VariantStringSetter(VariantData* instance) : _instance(instance) {}
template <typename TStoredString>
void operator()(TStoredString s) {
if (s)
_instance->setString(s);
else
_instance->setNull();
}
VariantData* _instance;
};
}; };
ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -38,9 +38,15 @@ inline void variantSetNull(VariantData* var) {
} }
template <typename TAdaptedString> template <typename TAdaptedString>
inline bool variantSetString(VariantData* var, TAdaptedString value, inline void variantSetString(VariantData* var, TAdaptedString value,
MemoryPool* pool) { 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) { inline size_t variantSize(const VariantData* var) {

View File

@ -90,8 +90,10 @@ inline bool VariantData::copyFrom(const VariantData& src, MemoryPool* pool) {
case VALUE_IS_OBJECT: case VALUE_IS_OBJECT:
return toObject().copyFrom(src._content.asCollection, pool); return toObject().copyFrom(src._content.asCollection, pool);
case VALUE_IS_OWNED_STRING: { case VALUE_IS_OWNED_STRING: {
JsonString value = src.asString(); auto str = storeString(pool, adaptString(src.asString()),
return setString(adaptString(value), pool); StringStoragePolicy::Copy());
setString(str);
return !str.isNull();
} }
case VALUE_IS_OWNED_RAW: case VALUE_IS_OWNED_RAW:
return storeOwnedRaw( return storeOwnedRaw(