// Copyright Benoit Blanchon 2014-2017 // MIT License // // Arduino JSON library // https://bblanchon.github.io/ArduinoJson/ // If you like this project, please add a star! #pragma once #include "Data/JsonVariantAs.hpp" #include "Polyfills/attributes.hpp" #include "Serialization/JsonPrintable.hpp" namespace ArduinoJson { // Forward declarations. class JsonArraySubscript; template class JsonObjectSubscript; template class JsonVariantBase : public Internals::JsonPrintable { public: #if ARDUINOJSON_ENABLE_DEPRECATED DEPRECATED("use as() instead") FORCE_INLINE JsonArray &asArray() const { return as(); } DEPRECATED("use as() instead") FORCE_INLINE JsonObject &asObject() const { return as(); } DEPRECATED("use as() instead") FORCE_INLINE const char *asString() const { return as(); } #endif // Gets the variant as an array. // Returns a reference to the JsonArray or JsonArray::invalid() if the // variant // is not an array. FORCE_INLINE operator JsonArray &() const { return as(); } // Gets the variant as an object. // Returns a reference to the JsonObject or JsonObject::invalid() if the // variant is not an object. FORCE_INLINE operator JsonObject &() const { return as(); } template FORCE_INLINE operator T() const { return as(); } template FORCE_INLINE const typename Internals::JsonVariantAs::type as() const { return impl()->template as(); } template FORCE_INLINE bool is() const { return impl()->template is(); } // Mimics an array or an object. // Returns the size of the array or object if the variant has that type. // Returns 0 if the variant is neither an array nor an object size_t size() const { return as().size() + as().size(); } // Mimics an array. // Returns the element at specified index if the variant is an array. // Returns JsonVariant::invalid() if the variant is not an array. FORCE_INLINE const JsonArraySubscript operator[](int index) const; FORCE_INLINE JsonArraySubscript operator[](int index); // Mimics an object. // Returns the value associated with the specified key if the variant is // an object. // Return JsonVariant::invalid() if the variant is not an object. // // const JsonObjectSubscript operator[](TKey) const; // TKey = const std::string&, const String& template FORCE_INLINE typename TypeTraits::EnableIf< Internals::StringTraits::has_equals, const JsonObjectSubscript >::type operator[](const TString &key) const { return as()[key]; } // // const JsonObjectSubscript operator[](TKey) const; // TKey = const std::string&, const String& template FORCE_INLINE typename TypeTraits::EnableIf< Internals::StringTraits::has_equals, JsonObjectSubscript >::type operator[](const TString &key) { return as()[key]; } // // JsonObjectSubscript operator[](TKey); // TKey = const char*, const char[N], const FlashStringHelper* template FORCE_INLINE typename TypeTraits::EnableIf< Internals::StringTraits::has_equals, JsonObjectSubscript >::type operator[](const TString *key) { return as()[key]; } // // JsonObjectSubscript operator[](TKey); // TKey = const char*, const char[N], const FlashStringHelper* template FORCE_INLINE typename TypeTraits::EnableIf< Internals::StringTraits::has_equals, const JsonObjectSubscript >::type operator[](const TString *key) const { return as()[key]; } private: const TImpl *impl() const { return static_cast(this); } }; namespace TypeTraits { template struct IsVariant : IsBaseOf, T> {}; } }