ArrayImpl.hpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2025, Benoit BLANCHON
  3. // MIT License
  4. #pragma once
  5. #include <ArduinoJson/Collection/CollectionIterator.hpp>
  6. #include <ArduinoJson/Variant/VariantCompare.hpp>
  7. #include <ArduinoJson/Variant/VariantImpl.hpp>
  8. ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
  9. inline VariantImpl::iterator VariantImpl::at(size_t index) const {
  10. if (!isArray())
  11. return iterator();
  12. auto it = createIterator();
  13. while (!it.done() && index) {
  14. it.move();
  15. --index;
  16. }
  17. return it;
  18. }
  19. inline VariantData* VariantImpl::addElement() {
  20. if (!isArray())
  21. return nullptr;
  22. auto slot = allocVariant();
  23. if (!slot)
  24. return nullptr;
  25. VariantImpl::appendOne(slot);
  26. return slot.ptr();
  27. }
  28. inline VariantData* VariantImpl::getOrAddElement(size_t index) {
  29. auto it = createIterator();
  30. while (!it.done() && index > 0) {
  31. it.move();
  32. index--;
  33. }
  34. if (it.done())
  35. index++;
  36. VariantData* element = it->data();
  37. while (index > 0) {
  38. element = addElement();
  39. if (!element)
  40. return nullptr;
  41. index--;
  42. }
  43. return element;
  44. }
  45. inline VariantData* VariantImpl::getElement(size_t index) const {
  46. return at(index)->data();
  47. }
  48. inline void VariantImpl::removeElement(iterator it) {
  49. if (!isArray())
  50. return;
  51. removeOne(it);
  52. }
  53. inline void VariantImpl::removeElement(size_t index) {
  54. removeElement(at(index));
  55. }
  56. template <typename T>
  57. inline bool VariantImpl::addValue(const T& value) {
  58. if (!isArray())
  59. return false;
  60. auto slot = allocVariant();
  61. if (!slot)
  62. return false;
  63. JsonVariant variant(slot.ptr(), resources_);
  64. if (!variant.set(value)) {
  65. freeVariant(slot);
  66. return false;
  67. }
  68. appendOne(slot);
  69. return true;
  70. }
  71. // Returns the size (in bytes) of an array with n elements.
  72. constexpr size_t sizeofArray(size_t n) {
  73. return n * sizeof(VariantData);
  74. }
  75. ARDUINOJSON_END_PRIVATE_NAMESPACE