// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2019 // MIT License #pragma once #include "../Memory/MemoryPool.hpp" #include "../Object/ObjectRef.hpp" #include "../Variant/VariantRef.hpp" #include "../Variant/VariantTo.hpp" #include "../Array/ElementProxy.hpp" #include "../Object/MemberProxy.hpp" namespace ARDUINOJSON_NAMESPACE { class JsonDocument : public Visitable { public: template void accept(Visitor& visitor) const { return getVariant().accept(visitor); } template typename VariantAs::type as() { return getVariant().template as(); } template typename VariantConstAs::type as() const { return getVariant().template as(); } void clear() { _pool.clear(); _data.setNull(); } template bool is() const { return getVariant().template is(); } bool isNull() const { return getVariant().isNull(); } size_t memoryUsage() const { return _pool.size(); } size_t nesting() const { return _data.nesting(); } size_t capacity() const { return _pool.capacity(); } size_t size() const { return _data.size(); } bool set(const JsonDocument& src) { return to().set(src.as()); } template typename enable_if::value, bool>::type set( const T& src) { return to().set(src); } template typename VariantTo::type to() { clear(); return getVariant().template to(); } // for internal use only MemoryPool& memoryPool() { return _pool; } VariantData& data() { return _data; } ArrayRef createNestedArray() { return addElement().to(); } // createNestedArray(char*) // createNestedArray(const char*) // createNestedArray(const __FlashStringHelper*) template ArrayRef createNestedArray(TChar* key) { return getOrAddMember(key).template to(); } // createNestedArray(const std::string&) // createNestedArray(const String&) template ArrayRef createNestedArray(const TString& key) { return getOrAddMember(key).template to(); } ObjectRef createNestedObject() { return addElement().to(); } // createNestedObject(char*) // createNestedObject(const char*) // createNestedObject(const __FlashStringHelper*) template ObjectRef createNestedObject(TChar* key) { return getOrAddMember(key).template to(); } // createNestedObject(const std::string&) // createNestedObject(const String&) template ObjectRef createNestedObject(const TString& key) { return getOrAddMember(key).template to(); } // operator[](const std::string&) // operator[](const String&) template FORCE_INLINE typename enable_if::value, MemberProxy >::type operator[](const TString& key) { return MemberProxy(*this, key); } // operator[](char*) // operator[](const char*) // operator[](const __FlashStringHelper*) template FORCE_INLINE typename enable_if::value, MemberProxy >::type operator[](TChar* key) { return MemberProxy(*this, key); } // operator[](const std::string&) const // operator[](const String&) const template FORCE_INLINE typename enable_if::value, VariantConstRef>::type operator[](const TString& key) const { return getVariant()[key]; } // operator[](char*) const // operator[](const char*) const // operator[](const __FlashStringHelper*) const template FORCE_INLINE typename enable_if::value, VariantConstRef>::type operator[](TChar* key) const { return getVariant()[key]; } FORCE_INLINE ElementProxy operator[](size_t index) { return ElementProxy(*this, index); } FORCE_INLINE VariantConstRef operator[](size_t index) const { return VariantConstRef(_data.getElement(index)); } FORCE_INLINE VariantRef getElement(size_t index) { return VariantRef(&_pool, _data.getElement(index)); } // getMember(char*) const // getMember(const char*) const // getMember(const __FlashStringHelper*) const template FORCE_INLINE VariantRef getMember(TChar* key) { return VariantRef(&_pool, _data.getMember(adaptString(key))); } // getMember(const std::string&) const // getMember(const String&) const template FORCE_INLINE typename enable_if::value, VariantRef>::type getMember(const TString& key) { return VariantRef(&_pool, _data.getMember(adaptString(key))); } // getOrAddMember(char*) // getOrAddMember(const char*) // getOrAddMember(const __FlashStringHelper*) template FORCE_INLINE VariantRef getOrAddMember(TChar* key) { return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool)); } // getOrAddMember(const std::string&) // getOrAddMember(const String&) template FORCE_INLINE VariantRef getOrAddMember(const TString& key) { return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool)); } FORCE_INLINE VariantRef addElement() { return VariantRef(&_pool, _data.addElement(&_pool)); } template FORCE_INLINE bool add(const TValue& value) { return addElement().set(value); } // add(char*) const // add(const char*) const // add(const __FlashStringHelper*) const template FORCE_INLINE bool add(TChar* value) { return addElement().set(value); } protected: JsonDocument(MemoryPool pool) : _pool(pool) { _data.setNull(); } JsonDocument(char* buf, size_t capa) : _pool(buf, capa) { _data.setNull(); } void replacePool(MemoryPool pool) { _pool = pool; } private: VariantRef getVariant() { return VariantRef(&_pool, &_data); } VariantConstRef getVariant() const { return VariantConstRef(&_data); } MemoryPool _pool; VariantData _data; }; } // namespace ARDUINOJSON_NAMESPACE