Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Wed Jul 13 2022 01:10:36 by
1.7.2