// ArduinoJson - https://arduinojson.org // Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include #include #include #include #include namespace ARDUINOJSON_NAMESPACE { class VariantRef; template class ElementProxy; template class MemberProxy; template class VariantRefBase : public VariantTag { friend class VariantAttorney; public: FORCE_INLINE void clear() const { variantSetNull(getData()); } FORCE_INLINE bool isNull() const { return variantIsNull(getData()); } FORCE_INLINE bool isUnbound() const { return !getData(); } template FORCE_INLINE typename enable_if::value && !is_same::value && !ConverterNeedsWriteableRef::value, T>::type as() const { return Converter::fromJson(getVariantConst()); } template FORCE_INLINE typename enable_if::value, T>::type as() const { return Converter::fromJson(getVariant()); } template FORCE_INLINE typename enable_if::value, const char*>::type ARDUINOJSON_DEPRECATED("Replace as() with as()") as() const { return as(); } template FORCE_INLINE typename enable_if::value, char>::type ARDUINOJSON_DEPRECATED( "Support for char is deprecated, use int8_t or uint8_t instead") as() const { return static_cast(as()); } template FORCE_INLINE operator T() const { return as(); } // Change the type of the variant // // JsonArray to() template typename enable_if::value, JsonArray>::type to() const; // // ObjectRef to() template typename enable_if::value, ObjectRef>::type to() const; // // VariantRef to() template typename enable_if::value, VariantRef>::type to() const; template FORCE_INLINE typename enable_if::value, bool>::type is() const { return Converter::checkJson(getVariant()); } template FORCE_INLINE typename enable_if::value && !is_same::value && !is_same::value, bool>::type is() const { return Converter::checkJson(getVariantConst()); } template FORCE_INLINE typename enable_if::value, bool>::type ARDUINOJSON_DEPRECATED("Replace is() with is()") is() const { return is(); } template FORCE_INLINE typename enable_if::value, bool>::type ARDUINOJSON_DEPRECATED( "Support for char is deprecated, use int8_t or uint8_t instead") is() const { return is(); } FORCE_INLINE void shallowCopy(VariantConstRef target) { VariantData* data = getOrCreateData(); if (!data) return; const VariantData* targetData = VariantAttorney::getData(target); if (targetData) *data = *targetData; else data->setNull(); } template FORCE_INLINE bool set(const T& value) const { Converter::toJson(value, getOrCreateVariant()); MemoryPool* pool = getPool(); return pool && !pool->overflowed(); } template FORCE_INLINE bool set(T* value) const { Converter::toJson(value, getOrCreateVariant()); MemoryPool* pool = getPool(); return pool && !pool->overflowed(); } bool ARDUINOJSON_DEPRECATED( "Support for char is deprecated, use int8_t or uint8_t instead") set(char value) const; FORCE_INLINE size_t size() const { return variantSize(getData()); } FORCE_INLINE size_t memoryUsage() const { VariantData* data = getData(); return data ? data->memoryUsage() : 0; } FORCE_INLINE size_t nesting() const { return variantNesting(getData()); } FORCE_INLINE VariantRef add() const; template FORCE_INLINE bool add(const T& value) const { return add().set(value); } // // bool add(TValue); // TValue = char*, const char*, const __FlashStringHelper* template FORCE_INLINE bool add(T* value) const { return add().set(value); } FORCE_INLINE void remove(size_t index) const { VariantData* data = getData(); if (data) data->remove(index); } // remove(char*) const // remove(const char*) const // remove(const __FlashStringHelper*) const template FORCE_INLINE typename enable_if::value>::type remove( TChar* key) const { VariantData* data = getData(); if (data) data->remove(adaptString(key)); } // remove(const std::string&) const // remove(const String&) const template FORCE_INLINE typename enable_if::value>::type remove( const TString& key) const { VariantData* data = getData(); if (data) data->remove(adaptString(key)); } FORCE_INLINE JsonArray createNestedArray() const; FORCE_INLINE ObjectRef createNestedObject() const; FORCE_INLINE ElementProxy operator[](size_t index) const; template FORCE_INLINE typename enable_if::value, bool>::type containsKey(const TString& key) const; template FORCE_INLINE typename enable_if::value, bool>::type containsKey(TChar* key) const; template FORCE_INLINE typename enable_if::value, MemberProxy >::type operator[](const TString& key) const; template FORCE_INLINE typename enable_if::value, MemberProxy >::type operator[](TChar* key) const; template FORCE_INLINE JsonArray createNestedArray(const TString& key) const; template FORCE_INLINE JsonArray createNestedArray(TChar* key) const; template ObjectRef createNestedObject(const TString& key) const; template ObjectRef createNestedObject(TChar* key) const; private: TDerived& derived() { return static_cast(*this); } const TDerived& derived() const { return static_cast(*this); } FORCE_INLINE MemoryPool* getPool() const { return VariantAttorney::getPool(derived()); } FORCE_INLINE VariantData* getData() const { return VariantAttorney::getData(derived()); } FORCE_INLINE VariantData* getOrCreateData() const { return VariantAttorney::getOrCreateData(derived()); } private: FORCE_INLINE VariantRef getVariant() const; FORCE_INLINE VariantConstRef getVariantConst() const { return VariantConstRef(getData()); } FORCE_INLINE VariantRef getOrCreateVariant() const; }; } // namespace ARDUINOJSON_NAMESPACE