| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- // 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 <typename Visitor>
- void accept(Visitor& visitor) const {
- return getVariant().accept(visitor);
- }
- template <typename T>
- typename VariantAs<T>::type as() {
- return getVariant().template as<T>();
- }
- template <typename T>
- typename VariantConstAs<T>::type as() const {
- return getVariant().template as<T>();
- }
- void clear() {
- _pool.clear();
- _data.setNull();
- }
- template <typename T>
- bool is() const {
- return getVariant().template is<T>();
- }
- 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<VariantRef>().set(src.as<VariantRef>());
- }
- template <typename T>
- typename enable_if<!is_base_of<JsonDocument, T>::value, bool>::type set(
- const T& src) {
- return to<VariantRef>().set(src);
- }
- template <typename T>
- typename VariantTo<T>::type to() {
- clear();
- return getVariant().template to<T>();
- }
- // for internal use only
- MemoryPool& memoryPool() {
- return _pool;
- }
- VariantData& data() {
- return _data;
- }
- ArrayRef createNestedArray() {
- return addElement().to<ArrayRef>();
- }
- // createNestedArray(char*)
- // createNestedArray(const char*)
- // createNestedArray(const __FlashStringHelper*)
- template <typename TChar>
- ArrayRef createNestedArray(TChar* key) {
- return getOrAddMember(key).template to<ArrayRef>();
- }
- // createNestedArray(const std::string&)
- // createNestedArray(const String&)
- template <typename TString>
- ArrayRef createNestedArray(const TString& key) {
- return getOrAddMember(key).template to<ArrayRef>();
- }
- ObjectRef createNestedObject() {
- return addElement().to<ObjectRef>();
- }
- // createNestedObject(char*)
- // createNestedObject(const char*)
- // createNestedObject(const __FlashStringHelper*)
- template <typename TChar>
- ObjectRef createNestedObject(TChar* key) {
- return getOrAddMember(key).template to<ObjectRef>();
- }
- // createNestedObject(const std::string&)
- // createNestedObject(const String&)
- template <typename TString>
- ObjectRef createNestedObject(const TString& key) {
- return getOrAddMember(key).template to<ObjectRef>();
- }
- // containsKey(char*) const
- // containsKey(const char*) const
- // containsKey(const __FlashStringHelper*) const
- template <typename TChar>
- bool containsKey(TChar* key) const {
- return !getMember(key).isUndefined();
- }
- // containsKey(const std::string&) const
- // containsKey(const String&) const
- template <typename TString>
- bool containsKey(const TString& key) const {
- return !getMember(key).isUndefined();
- }
- // operator[](const std::string&)
- // operator[](const String&)
- template <typename TString>
- FORCE_INLINE
- typename enable_if<IsString<TString>::value,
- MemberProxy<JsonDocument&, const TString&> >::type
- operator[](const TString& key) {
- return MemberProxy<JsonDocument&, const TString&>(*this, key);
- }
- // operator[](char*)
- // operator[](const char*)
- // operator[](const __FlashStringHelper*)
- template <typename TChar>
- FORCE_INLINE typename enable_if<IsString<TChar*>::value,
- MemberProxy<JsonDocument&, TChar*> >::type
- operator[](TChar* key) {
- return MemberProxy<JsonDocument&, TChar*>(*this, key);
- }
- // operator[](const std::string&) const
- // operator[](const String&) const
- template <typename TString>
- FORCE_INLINE
- typename enable_if<IsString<TString>::value, VariantConstRef>::type
- operator[](const TString& key) const {
- return getMember(key);
- }
- // operator[](char*) const
- // operator[](const char*) const
- // operator[](const __FlashStringHelper*) const
- template <typename TChar>
- FORCE_INLINE
- typename enable_if<IsString<TChar*>::value, VariantConstRef>::type
- operator[](TChar* key) const {
- return getMember(key);
- }
- FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) {
- return ElementProxy<JsonDocument&>(*this, index);
- }
- FORCE_INLINE VariantConstRef operator[](size_t index) const {
- return getElement(index);
- }
- FORCE_INLINE VariantRef getElement(size_t index) {
- return VariantRef(&_pool, _data.getElement(index));
- }
- FORCE_INLINE VariantConstRef getElement(size_t index) const {
- return VariantConstRef(_data.getElement(index));
- }
- // JsonVariantConst getMember(char*) const
- // JsonVariantConst getMember(const char*) const
- // JsonVariantConst getMember(const __FlashStringHelper*) const
- template <typename TChar>
- FORCE_INLINE VariantConstRef getMember(TChar* key) const {
- return VariantConstRef(_data.getMember(adaptString(key)));
- }
- // JsonVariantConst getMember(const std::string&) const
- // JsonVariantConst getMember(const String&) const
- template <typename TString>
- FORCE_INLINE
- typename enable_if<IsString<TString>::value, VariantConstRef>::type
- getMember(const TString& key) const {
- return VariantConstRef(_data.getMember(adaptString(key)));
- }
- // JsonVariant getMember(char*)
- // JsonVariant getMember(const char*)
- // JsonVariant getMember(const __FlashStringHelper*)
- template <typename TChar>
- FORCE_INLINE VariantRef getMember(TChar* key) {
- return VariantRef(&_pool, _data.getMember(adaptString(key)));
- }
- // JsonVariant getMember(const std::string&)
- // JsonVariant getMember(const String&)
- template <typename TString>
- FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
- getMember(const TString& key) {
- return VariantRef(&_pool, _data.getMember(adaptString(key)));
- }
- // getOrAddMember(char*)
- // getOrAddMember(const char*)
- // getOrAddMember(const __FlashStringHelper*)
- template <typename TChar>
- FORCE_INLINE VariantRef getOrAddMember(TChar* key) {
- return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));
- }
- // getOrAddMember(const std::string&)
- // getOrAddMember(const String&)
- template <typename TString>
- 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 <typename TValue>
- FORCE_INLINE bool add(const TValue& value) {
- return addElement().set(value);
- }
- // add(char*) const
- // add(const char*) const
- // add(const __FlashStringHelper*) const
- template <typename TChar>
- FORCE_INLINE bool add(TChar* value) {
- return addElement().set(value);
- }
- FORCE_INLINE void remove(size_t index) {
- _data.remove(index);
- }
- // remove(char*)
- // remove(const char*)
- // remove(const __FlashStringHelper*)
- template <typename TChar>
- FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(
- TChar* key) {
- _data.remove(adaptString(key));
- }
- // remove(const std::string&)
- // remove(const String&)
- template <typename TString>
- FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
- const TString& key) {
- _data.remove(adaptString(key));
- }
- FORCE_INLINE operator VariantConstRef() const {
- return VariantConstRef(&_data);
- }
- 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
|