Minh Nguyen / ArduinoJson
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MemberProxy.hpp Source File

MemberProxy.hpp

00001 // ArduinoJson - arduinojson.org
00002 // Copyright Benoit Blanchon 2014-2021
00003 // MIT License
00004 
00005 #pragma once
00006 
00007 #include <ArduinoJson/Configuration.hpp>
00008 #include <ArduinoJson/Polyfills/type_traits.hpp>
00009 #include <ArduinoJson/Variant/VariantOperators.hpp>
00010 #include <ArduinoJson/Variant/VariantRef.hpp>
00011 #include <ArduinoJson/Variant/VariantShortcuts.hpp>
00012 #include <ArduinoJson/Variant/VariantTo.hpp>
00013 
00014 #ifdef _MSC_VER
00015 #pragma warning(push)
00016 #pragma warning(disable : 4522)
00017 #endif
00018 
00019 namespace ARDUINOJSON_NAMESPACE {
00020 
00021 template <typename TObject, typename TStringRef>
00022 class MemberProxy : public VariantOperators<MemberProxy<TObject, TStringRef> >,
00023                     public VariantShortcuts<MemberProxy<TObject, TStringRef> >,
00024                     public Visitable,
00025                     public VariantTag {
00026   typedef MemberProxy<TObject, TStringRef> this_type;
00027 
00028  public:
00029   typedef VariantRef variant_type;
00030 
00031   FORCE_INLINE MemberProxy(TObject variant, TStringRef key)
00032       : _object(variant), _key(key) {}
00033 
00034   FORCE_INLINE MemberProxy(const MemberProxy &src)
00035       : _object(src._object), _key(src._key) {}
00036 
00037   FORCE_INLINE operator VariantConstRef() const {
00038     return getUpstreamMember();
00039   }
00040 
00041   FORCE_INLINE this_type &operator=(const this_type &src) {
00042     getOrAddUpstreamMember().set(src);
00043     return *this;
00044   }
00045 
00046   template <typename TValue>
00047   FORCE_INLINE typename enable_if<!is_array<TValue>::value, this_type &>::type
00048   operator=(const TValue &src) {
00049     getOrAddUpstreamMember().set(src);
00050     return *this;
00051   }
00052 
00053   // operator=(char*)
00054   // operator=(const char*)
00055   // operator=(const __FlashStringHelper*)
00056   template <typename TChar>
00057   FORCE_INLINE this_type &operator=(TChar *src) {
00058     getOrAddUpstreamMember().set(src);
00059     return *this;
00060   }
00061 
00062   FORCE_INLINE void clear() const {
00063     getUpstreamMember().clear();
00064   }
00065 
00066   FORCE_INLINE bool isNull() const {
00067     return getUpstreamMember().isNull();
00068   }
00069 
00070   template <typename TValue>
00071   FORCE_INLINE typename VariantAs<TValue>::type as() const {
00072     return getUpstreamMember().template as<TValue>();
00073   }
00074 
00075   template <typename T>
00076   FORCE_INLINE operator T() const {
00077     return getUpstreamMember();
00078   }
00079 
00080   template <typename TValue>
00081   FORCE_INLINE bool is() const {
00082     return getUpstreamMember().template is<TValue>();
00083   }
00084 
00085   FORCE_INLINE size_t size() const {
00086     return getUpstreamMember().size();
00087   }
00088 
00089   FORCE_INLINE void remove(size_t index) const {
00090     getUpstreamMember().remove(index);
00091   }
00092   // remove(char*) const
00093   // remove(const char*) const
00094   // remove(const __FlashStringHelper*) const
00095   template <typename TChar>
00096   FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(
00097       TChar *key) const {
00098     getUpstreamMember().remove(key);
00099   }
00100   // remove(const std::string&) const
00101   // remove(const String&) const
00102   template <typename TString>
00103   FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
00104       const TString &key) const {
00105     getUpstreamMember().remove(key);
00106   }
00107 
00108   template <typename TValue>
00109   FORCE_INLINE typename VariantTo<TValue>::type to() {
00110     return getOrAddUpstreamMember().template to<TValue>();
00111   }
00112 
00113   template <typename TValue>
00114   FORCE_INLINE bool set(const TValue &value) {
00115     return getOrAddUpstreamMember().set(value);
00116   }
00117 
00118   // set(char*) const
00119   // set(const char*) const
00120   // set(const __FlashStringHelper*) const
00121   template <typename TChar>
00122   FORCE_INLINE bool set(TChar *value) {
00123     return getOrAddUpstreamMember().set(value);
00124   }
00125 
00126   template <typename TVisitor>
00127   typename TVisitor::result_type accept(TVisitor &visitor) const {
00128     return getUpstreamMember().accept(visitor);
00129   }
00130 
00131   FORCE_INLINE VariantRef addElement() const {
00132     return getOrAddUpstreamMember().addElement();
00133   }
00134 
00135   FORCE_INLINE VariantRef getElement(size_t index) const {
00136     return getUpstreamMember().getElement(index);
00137   }
00138 
00139   FORCE_INLINE VariantRef getOrAddElement(size_t index) const {
00140     return getOrAddUpstreamMember().getOrAddElement(index);
00141   }
00142 
00143   // getMember(char*) const
00144   // getMember(const char*) const
00145   // getMember(const __FlashStringHelper*) const
00146   template <typename TChar>
00147   FORCE_INLINE VariantRef getMember(TChar *key) const {
00148     return getUpstreamMember().getMember(key);
00149   }
00150 
00151   // getMember(const std::string&) const
00152   // getMember(const String&) const
00153   template <typename TString>
00154   FORCE_INLINE VariantRef getMember(const TString &key) const {
00155     return getUpstreamMember().getMember(key);
00156   }
00157 
00158   // getOrAddMember(char*) const
00159   // getOrAddMember(const char*) const
00160   // getOrAddMember(const __FlashStringHelper*) const
00161   template <typename TChar>
00162   FORCE_INLINE VariantRef getOrAddMember(TChar *key) const {
00163     return getOrAddUpstreamMember().getOrAddMember(key);
00164   }
00165 
00166   // getOrAddMember(const std::string&) const
00167   // getOrAddMember(const String&) const
00168   template <typename TString>
00169   FORCE_INLINE VariantRef getOrAddMember(const TString &key) const {
00170     return getOrAddUpstreamMember().getOrAddMember(key);
00171   }
00172 
00173  private:
00174   FORCE_INLINE VariantRef getUpstreamMember() const {
00175     return _object.getMember(_key);
00176   }
00177 
00178   FORCE_INLINE VariantRef getOrAddUpstreamMember() const {
00179     return _object.getOrAddMember(_key);
00180   }
00181 
00182   TObject _object;
00183   TStringRef _key;
00184 };
00185 
00186 }  // namespace ARDUINOJSON_NAMESPACE
00187 
00188 #ifdef _MSC_VER
00189 #pragma warning(pop)
00190 #endif