Added support for custom converters (closes #687)

This commit is contained in:
Benoit Blanchon
2021-03-20 14:52:47 +01:00
parent 53d6f0d492
commit d7f5b56ca4
29 changed files with 554 additions and 470 deletions

View File

@@ -164,4 +164,42 @@ class ArrayRef : public ArrayRefBase<CollectionData>,
private:
MemoryPool* _pool;
};
template <>
struct Converter<ArrayConstRef> {
static bool toJson(VariantRef variant, VariantConstRef value) {
return variantCopyFrom(getData(variant), getData(value), getPool(variant));
}
static ArrayConstRef fromJson(VariantConstRef variant) {
return ArrayConstRef(variantAsArray(getData(variant)));
}
static bool checkJson(VariantConstRef variant) {
const VariantData* data = getData(variant);
return data && data->isArray();
}
};
template <>
struct Converter<ArrayRef> {
static bool toJson(VariantRef variant, VariantConstRef value) {
return variantCopyFrom(getData(variant), getData(value), getPool(variant));
}
static ArrayRef fromJson(VariantRef variant) {
VariantData* data = getData(variant);
MemoryPool* pool = getPool(variant);
return ArrayRef(pool, data != 0 ? data->asArray() : 0);
}
static bool checkJson(VariantConstRef) {
return false;
}
static bool checkJson(VariantRef variant) {
VariantData* data = getData(variant);
return data && data->isArray();
}
};
} // namespace ARDUINOJSON_NAMESPACE

View File

@@ -9,6 +9,8 @@
namespace ARDUINOJSON_NAMESPACE {
// Forward declarations.
class ArrayRef;
class ObjectRef;
template <typename>
class ElementProxy;

View File

@@ -170,6 +170,10 @@ class ElementProxy : public VariantOperators<ElementProxy<TArray> >,
return _array.getOrAddElement(_index);
}
friend bool convertToJson(VariantRef variant, const this_type& value) {
return variant.set(value.getUpstreamElement());
}
TArray _array;
const size_t _index;
};

View File

@@ -76,7 +76,8 @@ class ArrayCopier1D : public Visitor<size_t> {
VariantSlot* slot = array.head();
while (slot != 0 && size < _capacity) {
_destination[size++] = variantAs<T>(slot->data());
_destination[size++] =
Converter<T>::fromJson(VariantConstRef(slot->data()));
slot = slot->next();
}
return size;