diff options
author | Daniel Friesel <daniel.friesel@uos.de> | 2020-09-07 12:57:22 +0200 |
---|---|---|
committer | Daniel Friesel <daniel.friesel@uos.de> | 2020-09-07 12:57:22 +0200 |
commit | efa55eb5b3d3a4942789bdf397c3a6d6226475d4 (patch) | |
tree | a3a3f3079bbff203ca6c70544b4258742f5f152d /include/lib/ArduinoJson/JsonVariantSubscripts.hpp | |
parent | 0558244645611f314f47e0fa427f7323ce253eaf (diff) |
Revert "remove external libraries from main branch"protocol-modeling
This reverts commit 0558244645611f314f47e0fa427f7323ce253eaf.
Diffstat (limited to 'include/lib/ArduinoJson/JsonVariantSubscripts.hpp')
-rw-r--r-- | include/lib/ArduinoJson/JsonVariantSubscripts.hpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/JsonVariantSubscripts.hpp b/include/lib/ArduinoJson/JsonVariantSubscripts.hpp new file mode 100644 index 0000000..279ee01 --- /dev/null +++ b/include/lib/ArduinoJson/JsonVariantSubscripts.hpp @@ -0,0 +1,86 @@ +// 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 <typename TKey> +class JsonObjectSubscript; + +template <typename TImpl> +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<JsonArray>().size() + + impl()->template as<JsonObject>().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 <typename TString> + FORCE_INLINE + typename EnableIf<StringTraits<TString>::has_equals, + const JsonObjectSubscript<const TString &> >::type + operator[](const TString &key) const { + return impl()->template as<JsonObject>()[key]; + } + // + // const JsonObjectSubscript operator[](TKey) const; + // TKey = const std::string&, const String& + template <typename TString> + FORCE_INLINE typename EnableIf<StringTraits<TString>::has_equals, + JsonObjectSubscript<const TString &> >::type + operator[](const TString &key) { + return impl()->template as<JsonObject>()[key]; + } + // + // JsonObjectSubscript operator[](TKey); + // TKey = const char*, const char[N], const FlashStringHelper* + template <typename TString> + FORCE_INLINE typename EnableIf<StringTraits<const TString *>::has_equals, + JsonObjectSubscript<const TString *> >::type + operator[](const TString *key) { + return impl()->template as<JsonObject>()[key]; + } + // + // JsonObjectSubscript operator[](TKey); + // TKey = const char*, const char[N], const FlashStringHelper* + template <typename TString> + FORCE_INLINE + typename EnableIf<StringTraits<TString *>::has_equals, + const JsonObjectSubscript<const TString *> >::type + operator[](const TString *key) const { + return impl()->template as<JsonObject>()[key]; + } + + private: + const TImpl *impl() const { + return static_cast<const TImpl *>(this); + } +}; +} +} |