// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2018 // MIT License #pragma once #include "Data/JsonVariantAs.hpp" #include "Polyfills/attributes.hpp" #include "StringTraits/StringTraits.hpp" #include "TypeTraits/EnableIf.hpp" namespace ArduinoJson { namespace Internals { // Forward declarations. class JsonArraySubscript; template class JsonObjectSubscript; template class JsonVariantSubscripts { public: // 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 impl()->template as().size() + impl()->template 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[](size_t index) const; FORCE_INLINE JsonArraySubscript operator[](size_t 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 EnableIf::has_equals, const JsonObjectSubscript >::type operator[](const TString &key) const { return impl()->template as()[key]; } // // const JsonObjectSubscript operator[](TKey) const; // TKey = const std::string&, const String& template FORCE_INLINE typename EnableIf::has_equals, JsonObjectSubscript >::type operator[](const TString &key) { return impl()->template as()[key]; } // // JsonObjectSubscript operator[](TKey); // TKey = const char*, const char[N], const FlashStringHelper* template FORCE_INLINE typename EnableIf::has_equals, JsonObjectSubscript >::type operator[](const TString *key) { return impl()->template as()[key]; } // // JsonObjectSubscript operator[](TKey); // TKey = const char*, const char[N], const FlashStringHelper* template FORCE_INLINE typename EnableIf::has_equals, const JsonObjectSubscript >::type operator[](const TString *key) const { return impl()->template as()[key]; } private: const TImpl *impl() const { return static_cast(this); } }; } }