Added copy-constructor and copy-assignment-operator for JsonDocument (issue #827)

This commit is contained in:
Benoit Blanchon
2018-10-13 13:21:30 +02:00
parent 8230f8fc9b
commit 84f199f0dd
7 changed files with 204 additions and 19 deletions

View File

@ -20,7 +20,7 @@ class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript>,
: _array(array), _index(index) {}
FORCE_INLINE JsonArraySubscript& operator=(const JsonArraySubscript& src) {
get_impl().set(src.as<JsonVariant>());
get_impl().set(src.as<JsonVariantConst>());
return *this;
}

View File

@ -18,9 +18,9 @@ class JsonDocument : public Visitable {
JsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {}
template <typename T>
bool is() const {
return getVariant().template is<T>();
template <typename Visitor>
void accept(Visitor& visitor) const {
return getVariant().accept(visitor);
}
template <typename T>
@ -33,30 +33,37 @@ class JsonDocument : public Visitable {
return getVariant().template as<T>();
}
template <typename T>
typename JsonVariantTo<T>::type to() {
_memoryPool.clear();
return getVariant().template to<T>();
}
void clear() {
_memoryPool.clear();
_rootData.type = JSON_NULL;
}
template <typename T>
bool is() const {
return getVariant().template is<T>();
}
size_t memoryUsage() const {
return _memoryPool.size();
}
template <typename Visitor>
void accept(Visitor& visitor) const {
return getVariant().accept(visitor);
}
TMemoryPool& memoryPool() {
return _memoryPool;
}
template <typename T>
typename JsonVariantTo<T>::type to() {
_memoryPool.clear();
return getVariant().template to<T>();
}
protected:
template <typename T>
void copy(const JsonDocument<T>& src) {
nestingLimit = src.nestingLimit;
to<JsonVariant>().set(src.template as<JsonVariant>());
}
private:
JsonVariant getVariant() {
return JsonVariant(&_memoryPool, &_rootData);
@ -76,14 +83,49 @@ class DynamicJsonDocument : public JsonDocument<DynamicMemoryPool> {
DynamicJsonDocument(size_t capacity) {
memoryPool().reserve(capacity);
}
DynamicJsonDocument(const DynamicJsonDocument& src) {
memoryPool().reserve(src.memoryUsage());
copy(src);
}
template <typename T>
DynamicJsonDocument(const JsonDocument<T>& src) {
memoryPool().reserve(src.memoryUsage());
copy(src);
}
DynamicJsonDocument& operator=(const DynamicJsonDocument& src) {
copy(src);
return *this;
}
template <typename T>
DynamicJsonDocument& operator=(const JsonDocument<T>& src) {
copy(src);
return *this;
}
};
template <size_t CAPACITY>
class StaticJsonDocument : public JsonDocument<StaticMemoryPool<CAPACITY> > {
public:
StaticJsonDocument() {}
template <typename T>
StaticJsonDocument(const JsonDocument<T>& src) {
this->copy(src);
}
StaticMemoryPoolBase& memoryPool() {
return JsonDocument<StaticMemoryPool<CAPACITY> >::memoryPool();
}
template <typename T>
StaticJsonDocument operator=(const JsonDocument<T>& src) {
this->copy(src);
return *this;
}
};
} // namespace ARDUINOJSON_NAMESPACE

View File

@ -209,7 +209,8 @@ class JsonVariant : public JsonVariantProxy<JsonVariantData>,
return variantSetString(_data, value, _memoryPool);
}
bool set(const JsonVariant &value) const;
bool set(JsonVariantConst value) const;
bool set(JsonVariant value) const;
FORCE_INLINE bool set(JsonArray array) const;
FORCE_INLINE bool set(const JsonArraySubscript &) const;
@ -284,6 +285,7 @@ class JsonVariantConst : public JsonVariantProxy<const JsonVariantData>,
public JsonVariantBase<JsonVariantConst>,
public Visitable {
typedef JsonVariantProxy<const JsonVariantData> proxy_type;
friend class JsonVariant;
public:
JsonVariantConst() : proxy_type(0) {}

View File

@ -30,7 +30,11 @@ inline bool JsonVariant::set(const JsonObjectSubscript<TString>& value) const {
return set(value.template as<JsonVariant>());
}
inline bool JsonVariant::set(const JsonVariant& value) const {
inline bool JsonVariant::set(JsonVariantConst value) const {
return variantCopy(_data, value._data, _memoryPool);
}
inline bool JsonVariant::set(JsonVariant value) const {
return variantCopy(_data, value._data, _memoryPool);
}