diff --git a/src/ArduinoJson/Array/ArrayRef.hpp b/src/ArduinoJson/Array/ArrayRef.hpp index 80639cb4..967260fe 100644 --- a/src/ArduinoJson/Array/ArrayRef.hpp +++ b/src/ArduinoJson/Array/ArrayRef.hpp @@ -6,6 +6,7 @@ #include #include +#include #include // Returns the size (in bytes) of an array with n elements. @@ -105,6 +106,8 @@ class ArrayRef : public ArrayRefBase, public VariantOperators { typedef ArrayRefBase base_type; + friend class VariantAttorney; + public: typedef ArrayIterator iterator; @@ -168,6 +171,7 @@ class ArrayRef : public ArrayRefBase, _data->clear(); } + protected: MemoryPool* getPool() const { return _pool; } @@ -185,7 +189,7 @@ class ArrayRef : public ArrayRefBase, }; template <> -struct Converter { +struct Converter : private VariantAttorney { static void toJson(VariantConstRef src, VariantRef dst) { variantCopyFrom(getData(dst), getData(src), getPool(dst)); } @@ -202,7 +206,7 @@ struct Converter { }; template <> -struct Converter { +struct Converter : private VariantAttorney { static void toJson(VariantConstRef src, VariantRef dst) { variantCopyFrom(getData(dst), getData(src), getPool(dst)); } diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index 58cf729b..b200ff1d 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -22,6 +22,8 @@ class ElementProxy : public VariantOperators >, public VariantTag { typedef ElementProxy this_type; + friend class VariantAttorney; + public: FORCE_INLINE ElementProxy(TArray array, size_t index) : _array(array), _index(index) {} @@ -160,17 +162,18 @@ class ElementProxy : public VariantOperators >, getUpstreamElement().remove(key); } + protected: FORCE_INLINE MemoryPool* getPool() const { - return _array.getPool(); + return VariantAttorney::getPool(_array); } FORCE_INLINE VariantData* getData() const { - return variantGetElement(_array.getData(), _index); + return variantGetElement(VariantAttorney::getData(_array), _index); } FORCE_INLINE VariantData* getOrCreateData() const { - return variantGetOrAddElement(_array.getOrCreateData(), _index, - _array.getPool()); + return variantGetOrAddElement(VariantAttorney::getOrCreateData(_array), + _index, VariantAttorney::getPool(_array)); } private: diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index cef3da65..db52c7ab 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -15,6 +15,8 @@ namespace ARDUINOJSON_NAMESPACE { class JsonDocument : public VariantOperators { + friend class VariantAttorney; + public: template T as() { @@ -268,7 +270,7 @@ class JsonDocument : public VariantOperators { JsonDocument(const JsonDocument&); JsonDocument& operator=(const JsonDocument&); - public: + protected: MemoryPool* getPool() { return &_pool; } diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index 7aa36fa0..f3ff3acb 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -25,6 +25,8 @@ class MemberProxy : public VariantOperators >, public VariantTag { typedef MemberProxy this_type; + friend class VariantAttorney; + public: FORCE_INLINE MemberProxy(TObject variant, TStringRef key) : _object(variant), _key(key) {} @@ -160,17 +162,19 @@ class MemberProxy : public VariantOperators >, using ArrayShortcuts >::add; + protected: FORCE_INLINE MemoryPool *getPool() const { - return _object.getPool(); + return VariantAttorney::getPool(_object); } FORCE_INLINE VariantData *getData() const { - return variantGetMember(_object.getData(), adaptString(_key)); + return variantGetMember(VariantAttorney::getData(_object), + adaptString(_key)); } FORCE_INLINE VariantData *getOrCreateData() const { - return variantGetOrAddMember(_object.getOrCreateData(), _key, - _object.getPool()); + return variantGetOrAddMember(VariantAttorney::getOrCreateData(_object), + _key, VariantAttorney::getPool(_object)); } private: diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index da2857e1..22d462aa 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -40,14 +40,16 @@ template template inline typename enable_if::value, bool>::type ObjectShortcuts::containsKey(const TString& key) const { - return variantGetMember(impl()->getData(), adaptString(key)) != 0; + return variantGetMember(VariantAttorney::getData(*impl()), + adaptString(key)) != 0; } template template inline typename enable_if::value, bool>::type ObjectShortcuts::containsKey(TChar* key) const { - return variantGetMember(impl()->getData(), adaptString(key)) != 0; + return variantGetMember(VariantAttorney::getData(*impl()), + adaptString(key)) != 0; } template diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index 2de45d84..fd235cda 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -125,6 +125,8 @@ class ObjectRef : public ObjectRefBase, public VariantOperators { typedef ObjectRefBase base_type; + friend class VariantAttorney; + public: typedef ObjectIterator iterator; @@ -188,6 +190,7 @@ class ObjectRef : public ObjectRefBase, objectRemove(_data, adaptString(key)); } + protected: MemoryPool* getPool() const { return _pool; } @@ -205,7 +208,7 @@ class ObjectRef : public ObjectRefBase, }; template <> -struct Converter { +struct Converter : private VariantAttorney { static void toJson(VariantConstRef src, VariantRef dst) { variantCopyFrom(getData(dst), getData(src), getPool(dst)); } @@ -222,7 +225,7 @@ struct Converter { }; template <> -struct Converter { +struct Converter : private VariantAttorney { static void toJson(VariantConstRef src, VariantRef dst) { variantCopyFrom(getData(dst), getData(src), getPool(dst)); } diff --git a/src/ArduinoJson/Serialization/measure.hpp b/src/ArduinoJson/Serialization/measure.hpp index 5153d8ef..d4d12ab4 100644 --- a/src/ArduinoJson/Serialization/measure.hpp +++ b/src/ArduinoJson/Serialization/measure.hpp @@ -13,7 +13,7 @@ template