JsonArray.ipp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright Benoit Blanchon 2014-2016
  2. // MIT License
  3. //
  4. // Arduino JSON library
  5. // https://github.com/bblanchon/ArduinoJson
  6. // If you like this project, please add a star!
  7. #pragma once
  8. #include "JsonArray.hpp"
  9. #include "JsonObject.hpp"
  10. #include "JsonArraySubscript.hpp"
  11. namespace ArduinoJson {
  12. inline JsonArraySubscript JsonArray::operator[](size_t index) {
  13. return JsonArraySubscript(*this, index);
  14. }
  15. inline JsonVariant JsonArray::operator[](size_t index) const {
  16. return get(index);
  17. }
  18. template <typename TValue>
  19. inline bool JsonArray::addNode(TValue value) {
  20. node_type *node = addNewNode();
  21. return node != NULL && setNodeValue<TValue>(node, value);
  22. }
  23. template <typename TValue>
  24. inline bool JsonArray::setNodeAt(size_t index, TValue value) {
  25. node_type *node = getNodeAt(index);
  26. return node != NULL && setNodeValue<TValue>(node, value);
  27. }
  28. template <typename TValue>
  29. inline bool JsonArray::setNodeValue(node_type *node, TValue value) {
  30. node->content = value;
  31. return true;
  32. }
  33. template <>
  34. inline bool JsonArray::setNodeValue(node_type *node, String &value) {
  35. const char *copy = _buffer->strdup(value);
  36. if (!copy) return false;
  37. node->content = copy;
  38. return true;
  39. }
  40. inline JsonVariant JsonArray::get(size_t index) const {
  41. node_type *node = getNodeAt(index);
  42. return node ? node->content : JsonVariant();
  43. }
  44. template <typename T>
  45. inline T JsonArray::get(size_t index) const {
  46. node_type *node = getNodeAt(index);
  47. return node ? node->content.as<T>() : JsonVariant::invalid<T>();
  48. }
  49. template <typename T>
  50. inline bool JsonArray::is(size_t index) const {
  51. node_type *node = getNodeAt(index);
  52. return node ? node->content.is<T>() : false;
  53. }
  54. template <typename TImplem>
  55. inline const JsonArraySubscript JsonVariantBase<TImplem>::operator[](
  56. int index) const {
  57. return asArray()[index];
  58. }
  59. template <>
  60. inline JsonArray &JsonVariant::invalid<JsonArray &>() {
  61. return JsonArray::invalid();
  62. }
  63. template <>
  64. inline JsonArray const &JsonVariant::invalid<JsonArray const &>() {
  65. return JsonArray::invalid();
  66. }
  67. inline JsonArray &JsonVariant::asArray() const {
  68. if (_type == Internals::JSON_ARRAY) return *_content.asArray;
  69. return JsonArray::invalid();
  70. }
  71. inline JsonArray &JsonArray::createNestedArray() {
  72. if (!_buffer) return JsonArray::invalid();
  73. JsonArray &array = _buffer->createArray();
  74. add(array);
  75. return array;
  76. }
  77. inline JsonArray &JsonObject::createNestedArray(JsonObjectKey key) {
  78. if (!_buffer) return JsonArray::invalid();
  79. JsonArray &array = _buffer->createArray();
  80. setNodeAt<const JsonVariant &>(key, array);
  81. return array;
  82. }
  83. }