JsonDocument.hpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2019
  3. // MIT License
  4. #pragma once
  5. #include "../Memory/MemoryPool.hpp"
  6. #include "../Object/ObjectRef.hpp"
  7. #include "../Variant/VariantRef.hpp"
  8. #include "../Variant/VariantTo.hpp"
  9. #include "../Array/ElementProxy.hpp"
  10. #include "../Object/MemberProxy.hpp"
  11. namespace ARDUINOJSON_NAMESPACE {
  12. class JsonDocument : public Visitable {
  13. public:
  14. template <typename Visitor>
  15. void accept(Visitor& visitor) const {
  16. return getVariant().accept(visitor);
  17. }
  18. template <typename T>
  19. typename VariantAs<T>::type as() {
  20. return getVariant().template as<T>();
  21. }
  22. template <typename T>
  23. typename VariantConstAs<T>::type as() const {
  24. return getVariant().template as<T>();
  25. }
  26. void clear() {
  27. _pool.clear();
  28. _data.setNull();
  29. }
  30. template <typename T>
  31. bool is() const {
  32. return getVariant().template is<T>();
  33. }
  34. bool isNull() const {
  35. return getVariant().isNull();
  36. }
  37. size_t memoryUsage() const {
  38. return _pool.size();
  39. }
  40. size_t nesting() const {
  41. return _data.nesting();
  42. }
  43. size_t capacity() const {
  44. return _pool.capacity();
  45. }
  46. size_t size() const {
  47. return _data.size();
  48. }
  49. bool set(const JsonDocument& src) {
  50. return to<VariantRef>().set(src.as<VariantRef>());
  51. }
  52. template <typename T>
  53. typename enable_if<!is_base_of<JsonDocument, T>::value, bool>::type set(
  54. const T& src) {
  55. return to<VariantRef>().set(src);
  56. }
  57. template <typename T>
  58. typename VariantTo<T>::type to() {
  59. clear();
  60. return getVariant().template to<T>();
  61. }
  62. // for internal use only
  63. MemoryPool& memoryPool() {
  64. return _pool;
  65. }
  66. VariantData& data() {
  67. return _data;
  68. }
  69. ArrayRef createNestedArray() {
  70. return addElement().to<ArrayRef>();
  71. }
  72. // createNestedArray(char*)
  73. // createNestedArray(const char*)
  74. // createNestedArray(const __FlashStringHelper*)
  75. template <typename TChar>
  76. ArrayRef createNestedArray(TChar* key) {
  77. return getOrAddMember(key).template to<ArrayRef>();
  78. }
  79. // createNestedArray(const std::string&)
  80. // createNestedArray(const String&)
  81. template <typename TString>
  82. ArrayRef createNestedArray(const TString& key) {
  83. return getOrAddMember(key).template to<ArrayRef>();
  84. }
  85. ObjectRef createNestedObject() {
  86. return addElement().to<ObjectRef>();
  87. }
  88. // createNestedObject(char*)
  89. // createNestedObject(const char*)
  90. // createNestedObject(const __FlashStringHelper*)
  91. template <typename TChar>
  92. ObjectRef createNestedObject(TChar* key) {
  93. return getOrAddMember(key).template to<ObjectRef>();
  94. }
  95. // createNestedObject(const std::string&)
  96. // createNestedObject(const String&)
  97. template <typename TString>
  98. ObjectRef createNestedObject(const TString& key) {
  99. return getOrAddMember(key).template to<ObjectRef>();
  100. }
  101. // containsKey(char*) const
  102. // containsKey(const char*) const
  103. // containsKey(const __FlashStringHelper*) const
  104. template <typename TChar>
  105. bool containsKey(TChar* key) const {
  106. return !getMember(key).isUndefined();
  107. }
  108. // containsKey(const std::string&) const
  109. // containsKey(const String&) const
  110. template <typename TString>
  111. bool containsKey(const TString& key) const {
  112. return !getMember(key).isUndefined();
  113. }
  114. // operator[](const std::string&)
  115. // operator[](const String&)
  116. template <typename TString>
  117. FORCE_INLINE
  118. typename enable_if<IsString<TString>::value,
  119. MemberProxy<JsonDocument&, const TString&> >::type
  120. operator[](const TString& key) {
  121. return MemberProxy<JsonDocument&, const TString&>(*this, key);
  122. }
  123. // operator[](char*)
  124. // operator[](const char*)
  125. // operator[](const __FlashStringHelper*)
  126. template <typename TChar>
  127. FORCE_INLINE typename enable_if<IsString<TChar*>::value,
  128. MemberProxy<JsonDocument&, TChar*> >::type
  129. operator[](TChar* key) {
  130. return MemberProxy<JsonDocument&, TChar*>(*this, key);
  131. }
  132. // operator[](const std::string&) const
  133. // operator[](const String&) const
  134. template <typename TString>
  135. FORCE_INLINE
  136. typename enable_if<IsString<TString>::value, VariantConstRef>::type
  137. operator[](const TString& key) const {
  138. return getMember(key);
  139. }
  140. // operator[](char*) const
  141. // operator[](const char*) const
  142. // operator[](const __FlashStringHelper*) const
  143. template <typename TChar>
  144. FORCE_INLINE
  145. typename enable_if<IsString<TChar*>::value, VariantConstRef>::type
  146. operator[](TChar* key) const {
  147. return getMember(key);
  148. }
  149. FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) {
  150. return ElementProxy<JsonDocument&>(*this, index);
  151. }
  152. FORCE_INLINE VariantConstRef operator[](size_t index) const {
  153. return getElement(index);
  154. }
  155. FORCE_INLINE VariantRef getElement(size_t index) {
  156. return VariantRef(&_pool, _data.getElement(index));
  157. }
  158. FORCE_INLINE VariantConstRef getElement(size_t index) const {
  159. return VariantConstRef(_data.getElement(index));
  160. }
  161. // JsonVariantConst getMember(char*) const
  162. // JsonVariantConst getMember(const char*) const
  163. // JsonVariantConst getMember(const __FlashStringHelper*) const
  164. template <typename TChar>
  165. FORCE_INLINE VariantConstRef getMember(TChar* key) const {
  166. return VariantConstRef(_data.getMember(adaptString(key)));
  167. }
  168. // JsonVariantConst getMember(const std::string&) const
  169. // JsonVariantConst getMember(const String&) const
  170. template <typename TString>
  171. FORCE_INLINE
  172. typename enable_if<IsString<TString>::value, VariantConstRef>::type
  173. getMember(const TString& key) const {
  174. return VariantConstRef(_data.getMember(adaptString(key)));
  175. }
  176. // JsonVariant getMember(char*)
  177. // JsonVariant getMember(const char*)
  178. // JsonVariant getMember(const __FlashStringHelper*)
  179. template <typename TChar>
  180. FORCE_INLINE VariantRef getMember(TChar* key) {
  181. return VariantRef(&_pool, _data.getMember(adaptString(key)));
  182. }
  183. // JsonVariant getMember(const std::string&)
  184. // JsonVariant getMember(const String&)
  185. template <typename TString>
  186. FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
  187. getMember(const TString& key) {
  188. return VariantRef(&_pool, _data.getMember(adaptString(key)));
  189. }
  190. // getOrAddMember(char*)
  191. // getOrAddMember(const char*)
  192. // getOrAddMember(const __FlashStringHelper*)
  193. template <typename TChar>
  194. FORCE_INLINE VariantRef getOrAddMember(TChar* key) {
  195. return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));
  196. }
  197. // getOrAddMember(const std::string&)
  198. // getOrAddMember(const String&)
  199. template <typename TString>
  200. FORCE_INLINE VariantRef getOrAddMember(const TString& key) {
  201. return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));
  202. }
  203. FORCE_INLINE VariantRef addElement() {
  204. return VariantRef(&_pool, _data.addElement(&_pool));
  205. }
  206. template <typename TValue>
  207. FORCE_INLINE bool add(const TValue& value) {
  208. return addElement().set(value);
  209. }
  210. // add(char*) const
  211. // add(const char*) const
  212. // add(const __FlashStringHelper*) const
  213. template <typename TChar>
  214. FORCE_INLINE bool add(TChar* value) {
  215. return addElement().set(value);
  216. }
  217. FORCE_INLINE void remove(size_t index) {
  218. _data.remove(index);
  219. }
  220. // remove(char*)
  221. // remove(const char*)
  222. // remove(const __FlashStringHelper*)
  223. template <typename TChar>
  224. FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(
  225. TChar* key) {
  226. _data.remove(adaptString(key));
  227. }
  228. // remove(const std::string&)
  229. // remove(const String&)
  230. template <typename TString>
  231. FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
  232. const TString& key) {
  233. _data.remove(adaptString(key));
  234. }
  235. FORCE_INLINE operator VariantConstRef() const {
  236. return VariantConstRef(&_data);
  237. }
  238. protected:
  239. JsonDocument(MemoryPool pool) : _pool(pool) {
  240. _data.setNull();
  241. }
  242. JsonDocument(char* buf, size_t capa) : _pool(buf, capa) {
  243. _data.setNull();
  244. }
  245. void replacePool(MemoryPool pool) {
  246. _pool = pool;
  247. }
  248. private:
  249. VariantRef getVariant() {
  250. return VariantRef(&_pool, &_data);
  251. }
  252. VariantConstRef getVariant() const {
  253. return VariantConstRef(&_data);
  254. }
  255. MemoryPool _pool;
  256. VariantData _data;
  257. };
  258. } // namespace ARDUINOJSON_NAMESPACE