VariantProxy.hpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2022, Benoit BLANCHON
  3. // MIT License
  4. #pragma once
  5. #include <ArduinoJson/Configuration.hpp>
  6. #include <ArduinoJson/Variant/VariantOperators.hpp>
  7. #include <ArduinoJson/Variant/VariantShortcuts.hpp>
  8. #include <ArduinoJson/Variant/VariantTo.hpp>
  9. #ifdef _MSC_VER
  10. # pragma warning(push)
  11. # pragma warning(disable : 4522)
  12. #endif
  13. namespace ARDUINOJSON_NAMESPACE {
  14. template <typename TDataSource>
  15. class VariantProxy : public VariantShortcuts<VariantProxy<TDataSource> >,
  16. public VariantOperators<VariantProxy<TDataSource> >,
  17. public VariantTag {
  18. friend class VariantAttorney;
  19. public:
  20. explicit FORCE_INLINE VariantProxy(TDataSource source) : _source(source) {}
  21. // Copy-constructor required because of user-defined copy-assignment operator
  22. FORCE_INLINE VariantProxy(const VariantProxy& src) : _source(src._source) {}
  23. FORCE_INLINE VariantProxy& operator=(const VariantProxy& src) {
  24. getOrAddUpstreamVariant().set(src);
  25. return *this;
  26. }
  27. template <typename T>
  28. FORCE_INLINE VariantProxy& operator=(const T& src) {
  29. getOrAddUpstreamVariant().set(src);
  30. return *this;
  31. }
  32. template <typename T>
  33. FORCE_INLINE VariantProxy& operator=(T* src) {
  34. getOrAddUpstreamVariant().set(src);
  35. return *this;
  36. }
  37. FORCE_INLINE void clear() const {
  38. getUpstreamVariant().clear();
  39. }
  40. FORCE_INLINE bool isNull() const {
  41. return getUpstreamVariantConst().isNull();
  42. }
  43. template <typename T>
  44. FORCE_INLINE typename enable_if<!is_same<T, char*>::value &&
  45. !ConverterNeedsWriteableRef<T>::value,
  46. T>::type
  47. as() const {
  48. return getUpstreamVariantConst().template as<T>();
  49. }
  50. template <typename T>
  51. FORCE_INLINE typename enable_if<ConverterNeedsWriteableRef<T>::value, T>::type
  52. as() const {
  53. return getUpstreamVariant().template as<T>();
  54. }
  55. template <typename T>
  56. FORCE_INLINE typename enable_if<is_same<T, char*>::value, const char*>::type
  57. ARDUINOJSON_DEPRECATED("Replace as<char*>() with as<const char*>()")
  58. as() const {
  59. return as<const char*>();
  60. }
  61. template <typename T>
  62. FORCE_INLINE operator T() const {
  63. return as<T>();
  64. }
  65. template <typename T>
  66. FORCE_INLINE typename VariantTo<T>::type to() {
  67. return getOrAddUpstreamVariant().template to<T>();
  68. }
  69. template <typename T>
  70. FORCE_INLINE
  71. typename enable_if<ConverterNeedsWriteableRef<T>::value, bool>::type
  72. is() const {
  73. return getUpstreamVariant().template is<T>();
  74. }
  75. template <typename T>
  76. FORCE_INLINE
  77. typename enable_if<!ConverterNeedsWriteableRef<T>::value, bool>::type
  78. is() const {
  79. return getUpstreamVariantConst().template is<T>();
  80. }
  81. FORCE_INLINE void shallowCopy(VariantConstRef value) {
  82. getOrAddUpstreamVariant().shallowCopy(value);
  83. }
  84. template <typename T>
  85. FORCE_INLINE bool set(const T& value) {
  86. return getOrAddUpstreamVariant().set(value);
  87. }
  88. template <typename T>
  89. FORCE_INLINE bool set(T* value) {
  90. return getOrAddUpstreamVariant().set(value);
  91. }
  92. FORCE_INLINE size_t size() const {
  93. return getUpstreamVariantConst().size();
  94. }
  95. FORCE_INLINE size_t memoryUsage() const {
  96. return getUpstreamVariantConst().memoryUsage();
  97. }
  98. FORCE_INLINE VariantRef add() const {
  99. return getOrAddUpstreamVariant().add();
  100. }
  101. using ArrayShortcuts<VariantProxy<TDataSource> >::add;
  102. FORCE_INLINE void remove(size_t index) const {
  103. getUpstreamVariant().remove(index);
  104. }
  105. // remove(char*) const
  106. // remove(const char*) const
  107. // remove(const __FlashStringHelper*) const
  108. template <typename TChar>
  109. FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(
  110. TChar* key) const {
  111. getUpstreamVariant().remove(key);
  112. }
  113. // remove(const std::string&) const
  114. // remove(const String&) const
  115. template <typename TString>
  116. FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
  117. const TString& key) const {
  118. getUpstreamVariant().remove(key);
  119. }
  120. protected:
  121. FORCE_INLINE MemoryPool* getPool() const {
  122. return _source.getPool();
  123. }
  124. FORCE_INLINE VariantData* getData() const {
  125. return _source.getData();
  126. }
  127. FORCE_INLINE VariantData* getOrCreateData() const {
  128. return _source.getOrCreateData();
  129. }
  130. private:
  131. FORCE_INLINE VariantRef getUpstreamVariant() const {
  132. return VariantRef(getPool(), getData());
  133. }
  134. FORCE_INLINE VariantConstRef getUpstreamVariantConst() const {
  135. return VariantConstRef(getData());
  136. }
  137. FORCE_INLINE VariantRef getOrAddUpstreamVariant() const {
  138. return VariantRef(getPool(), getOrCreateData());
  139. }
  140. friend void convertToJson(const VariantProxy& src, VariantRef dst) {
  141. dst.set(src.getUpstreamVariantConst());
  142. }
  143. const TDataSource _source;
  144. };
  145. } // namespace ARDUINOJSON_NAMESPACE
  146. #ifdef _MSC_VER
  147. # pragma warning(pop)
  148. #endif