Minh Nguyen / ArduinoJson
Committer:
khaiminhvn
Date:
Fri Mar 19 19:30:50 2021 +0000
Revision:
0:18ba3960b5dd
removed extras

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khaiminhvn 0:18ba3960b5dd 1 // ArduinoJson - arduinojson.org
khaiminhvn 0:18ba3960b5dd 2 // Copyright Benoit Blanchon 2014-2021
khaiminhvn 0:18ba3960b5dd 3 // MIT License
khaiminhvn 0:18ba3960b5dd 4
khaiminhvn 0:18ba3960b5dd 5 #pragma once
khaiminhvn 0:18ba3960b5dd 6
khaiminhvn 0:18ba3960b5dd 7 #include <ArduinoJson/Array/ArrayFunctions.hpp>
khaiminhvn 0:18ba3960b5dd 8 #include <ArduinoJson/Array/ArrayIterator.hpp>
khaiminhvn 0:18ba3960b5dd 9 #include <ArduinoJson/Variant/VariantData.hpp>
khaiminhvn 0:18ba3960b5dd 10
khaiminhvn 0:18ba3960b5dd 11 // Returns the size (in bytes) of an array with n elements.
khaiminhvn 0:18ba3960b5dd 12 // Can be very handy to determine the size of a StaticMemoryPool.
khaiminhvn 0:18ba3960b5dd 13 #define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \
khaiminhvn 0:18ba3960b5dd 14 ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot))
khaiminhvn 0:18ba3960b5dd 15
khaiminhvn 0:18ba3960b5dd 16 namespace ARDUINOJSON_NAMESPACE {
khaiminhvn 0:18ba3960b5dd 17
khaiminhvn 0:18ba3960b5dd 18 class ObjectRef;
khaiminhvn 0:18ba3960b5dd 19 template <typename>
khaiminhvn 0:18ba3960b5dd 20 class ElementProxy;
khaiminhvn 0:18ba3960b5dd 21
khaiminhvn 0:18ba3960b5dd 22 template <typename TData>
khaiminhvn 0:18ba3960b5dd 23 class ArrayRefBase {
khaiminhvn 0:18ba3960b5dd 24 public:
khaiminhvn 0:18ba3960b5dd 25 operator VariantConstRef() const {
khaiminhvn 0:18ba3960b5dd 26 const void* data = _data; // prevent warning cast-align
khaiminhvn 0:18ba3960b5dd 27 return VariantConstRef(reinterpret_cast<const VariantData*>(data));
khaiminhvn 0:18ba3960b5dd 28 }
khaiminhvn 0:18ba3960b5dd 29
khaiminhvn 0:18ba3960b5dd 30 template <typename TVisitor>
khaiminhvn 0:18ba3960b5dd 31 FORCE_INLINE typename TVisitor::result_type accept(TVisitor& visitor) const {
khaiminhvn 0:18ba3960b5dd 32 return arrayAccept(_data, visitor);
khaiminhvn 0:18ba3960b5dd 33 }
khaiminhvn 0:18ba3960b5dd 34
khaiminhvn 0:18ba3960b5dd 35 FORCE_INLINE bool isNull() const {
khaiminhvn 0:18ba3960b5dd 36 return _data == 0;
khaiminhvn 0:18ba3960b5dd 37 }
khaiminhvn 0:18ba3960b5dd 38
khaiminhvn 0:18ba3960b5dd 39 FORCE_INLINE operator bool() const {
khaiminhvn 0:18ba3960b5dd 40 return _data != 0;
khaiminhvn 0:18ba3960b5dd 41 }
khaiminhvn 0:18ba3960b5dd 42
khaiminhvn 0:18ba3960b5dd 43 FORCE_INLINE size_t memoryUsage() const {
khaiminhvn 0:18ba3960b5dd 44 return _data ? _data->memoryUsage() : 0;
khaiminhvn 0:18ba3960b5dd 45 }
khaiminhvn 0:18ba3960b5dd 46
khaiminhvn 0:18ba3960b5dd 47 FORCE_INLINE size_t nesting() const {
khaiminhvn 0:18ba3960b5dd 48 return _data ? _data->nesting() : 0;
khaiminhvn 0:18ba3960b5dd 49 }
khaiminhvn 0:18ba3960b5dd 50
khaiminhvn 0:18ba3960b5dd 51 FORCE_INLINE size_t size() const {
khaiminhvn 0:18ba3960b5dd 52 return _data ? _data->size() : 0;
khaiminhvn 0:18ba3960b5dd 53 }
khaiminhvn 0:18ba3960b5dd 54
khaiminhvn 0:18ba3960b5dd 55 protected:
khaiminhvn 0:18ba3960b5dd 56 ArrayRefBase(TData* data) : _data(data) {}
khaiminhvn 0:18ba3960b5dd 57 TData* _data;
khaiminhvn 0:18ba3960b5dd 58 };
khaiminhvn 0:18ba3960b5dd 59
khaiminhvn 0:18ba3960b5dd 60 class ArrayConstRef : public ArrayRefBase<const CollectionData>,
khaiminhvn 0:18ba3960b5dd 61 public Visitable {
khaiminhvn 0:18ba3960b5dd 62 friend class ArrayRef;
khaiminhvn 0:18ba3960b5dd 63 typedef ArrayRefBase<const CollectionData> base_type;
khaiminhvn 0:18ba3960b5dd 64
khaiminhvn 0:18ba3960b5dd 65 public:
khaiminhvn 0:18ba3960b5dd 66 typedef ArrayConstRefIterator iterator;
khaiminhvn 0:18ba3960b5dd 67
khaiminhvn 0:18ba3960b5dd 68 FORCE_INLINE iterator begin() const {
khaiminhvn 0:18ba3960b5dd 69 if (!_data)
khaiminhvn 0:18ba3960b5dd 70 return iterator();
khaiminhvn 0:18ba3960b5dd 71 return iterator(_data->head());
khaiminhvn 0:18ba3960b5dd 72 }
khaiminhvn 0:18ba3960b5dd 73
khaiminhvn 0:18ba3960b5dd 74 FORCE_INLINE iterator end() const {
khaiminhvn 0:18ba3960b5dd 75 return iterator();
khaiminhvn 0:18ba3960b5dd 76 }
khaiminhvn 0:18ba3960b5dd 77
khaiminhvn 0:18ba3960b5dd 78 FORCE_INLINE ArrayConstRef() : base_type(0) {}
khaiminhvn 0:18ba3960b5dd 79 FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {}
khaiminhvn 0:18ba3960b5dd 80
khaiminhvn 0:18ba3960b5dd 81 FORCE_INLINE bool operator==(ArrayConstRef rhs) const {
khaiminhvn 0:18ba3960b5dd 82 return arrayEquals(_data, rhs._data);
khaiminhvn 0:18ba3960b5dd 83 }
khaiminhvn 0:18ba3960b5dd 84
khaiminhvn 0:18ba3960b5dd 85 FORCE_INLINE VariantConstRef operator[](size_t index) const {
khaiminhvn 0:18ba3960b5dd 86 return getElement(index);
khaiminhvn 0:18ba3960b5dd 87 }
khaiminhvn 0:18ba3960b5dd 88
khaiminhvn 0:18ba3960b5dd 89 FORCE_INLINE VariantConstRef getElement(size_t index) const {
khaiminhvn 0:18ba3960b5dd 90 return VariantConstRef(_data ? _data->getElement(index) : 0);
khaiminhvn 0:18ba3960b5dd 91 }
khaiminhvn 0:18ba3960b5dd 92 };
khaiminhvn 0:18ba3960b5dd 93
khaiminhvn 0:18ba3960b5dd 94 class ArrayRef : public ArrayRefBase<CollectionData>,
khaiminhvn 0:18ba3960b5dd 95 public ArrayShortcuts<ArrayRef>,
khaiminhvn 0:18ba3960b5dd 96 public Visitable {
khaiminhvn 0:18ba3960b5dd 97 typedef ArrayRefBase<CollectionData> base_type;
khaiminhvn 0:18ba3960b5dd 98
khaiminhvn 0:18ba3960b5dd 99 public:
khaiminhvn 0:18ba3960b5dd 100 typedef ArrayIterator iterator;
khaiminhvn 0:18ba3960b5dd 101
khaiminhvn 0:18ba3960b5dd 102 FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {}
khaiminhvn 0:18ba3960b5dd 103 FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data)
khaiminhvn 0:18ba3960b5dd 104 : base_type(data), _pool(pool) {}
khaiminhvn 0:18ba3960b5dd 105
khaiminhvn 0:18ba3960b5dd 106 operator VariantRef() {
khaiminhvn 0:18ba3960b5dd 107 void* data = _data; // prevent warning cast-align
khaiminhvn 0:18ba3960b5dd 108 return VariantRef(_pool, reinterpret_cast<VariantData*>(data));
khaiminhvn 0:18ba3960b5dd 109 }
khaiminhvn 0:18ba3960b5dd 110
khaiminhvn 0:18ba3960b5dd 111 operator ArrayConstRef() const {
khaiminhvn 0:18ba3960b5dd 112 return ArrayConstRef(_data);
khaiminhvn 0:18ba3960b5dd 113 }
khaiminhvn 0:18ba3960b5dd 114
khaiminhvn 0:18ba3960b5dd 115 VariantRef addElement() const {
khaiminhvn 0:18ba3960b5dd 116 return VariantRef(_pool, arrayAdd(_data, _pool));
khaiminhvn 0:18ba3960b5dd 117 }
khaiminhvn 0:18ba3960b5dd 118
khaiminhvn 0:18ba3960b5dd 119 FORCE_INLINE iterator begin() const {
khaiminhvn 0:18ba3960b5dd 120 if (!_data)
khaiminhvn 0:18ba3960b5dd 121 return iterator();
khaiminhvn 0:18ba3960b5dd 122 return iterator(_pool, _data->head());
khaiminhvn 0:18ba3960b5dd 123 }
khaiminhvn 0:18ba3960b5dd 124
khaiminhvn 0:18ba3960b5dd 125 FORCE_INLINE iterator end() const {
khaiminhvn 0:18ba3960b5dd 126 return iterator();
khaiminhvn 0:18ba3960b5dd 127 }
khaiminhvn 0:18ba3960b5dd 128
khaiminhvn 0:18ba3960b5dd 129 // Copy a ArrayRef
khaiminhvn 0:18ba3960b5dd 130 FORCE_INLINE bool set(ArrayConstRef src) const {
khaiminhvn 0:18ba3960b5dd 131 if (!_data || !src._data)
khaiminhvn 0:18ba3960b5dd 132 return false;
khaiminhvn 0:18ba3960b5dd 133 return _data->copyFrom(*src._data, _pool);
khaiminhvn 0:18ba3960b5dd 134 }
khaiminhvn 0:18ba3960b5dd 135
khaiminhvn 0:18ba3960b5dd 136 FORCE_INLINE bool operator==(ArrayRef rhs) const {
khaiminhvn 0:18ba3960b5dd 137 return arrayEquals(_data, rhs._data);
khaiminhvn 0:18ba3960b5dd 138 }
khaiminhvn 0:18ba3960b5dd 139
khaiminhvn 0:18ba3960b5dd 140 // Internal use
khaiminhvn 0:18ba3960b5dd 141 FORCE_INLINE VariantRef getOrAddElement(size_t index) const {
khaiminhvn 0:18ba3960b5dd 142 return VariantRef(_pool, _data ? _data->getOrAddElement(index, _pool) : 0);
khaiminhvn 0:18ba3960b5dd 143 }
khaiminhvn 0:18ba3960b5dd 144
khaiminhvn 0:18ba3960b5dd 145 // Gets the value at the specified index.
khaiminhvn 0:18ba3960b5dd 146 FORCE_INLINE VariantRef getElement(size_t index) const {
khaiminhvn 0:18ba3960b5dd 147 return VariantRef(_pool, _data ? _data->getElement(index) : 0);
khaiminhvn 0:18ba3960b5dd 148 }
khaiminhvn 0:18ba3960b5dd 149
khaiminhvn 0:18ba3960b5dd 150 // Removes element at specified position.
khaiminhvn 0:18ba3960b5dd 151 FORCE_INLINE void remove(iterator it) const {
khaiminhvn 0:18ba3960b5dd 152 if (!_data)
khaiminhvn 0:18ba3960b5dd 153 return;
khaiminhvn 0:18ba3960b5dd 154 _data->removeSlot(it.internal());
khaiminhvn 0:18ba3960b5dd 155 }
khaiminhvn 0:18ba3960b5dd 156
khaiminhvn 0:18ba3960b5dd 157 // Removes element at specified index.
khaiminhvn 0:18ba3960b5dd 158 FORCE_INLINE void remove(size_t index) const {
khaiminhvn 0:18ba3960b5dd 159 if (!_data)
khaiminhvn 0:18ba3960b5dd 160 return;
khaiminhvn 0:18ba3960b5dd 161 _data->removeElement(index);
khaiminhvn 0:18ba3960b5dd 162 }
khaiminhvn 0:18ba3960b5dd 163
khaiminhvn 0:18ba3960b5dd 164 private:
khaiminhvn 0:18ba3960b5dd 165 MemoryPool* _pool;
khaiminhvn 0:18ba3960b5dd 166 };
khaiminhvn 0:18ba3960b5dd 167 } // namespace ARDUINOJSON_NAMESPACE