Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/ArduinoJson/Array/ArrayRef.hpp@0:18ba3960b5dd, 2021-03-19 (annotated)
- Committer:
- khaiminhvn
- Date:
- Fri Mar 19 19:30:50 2021 +0000
- Revision:
- 0:18ba3960b5dd
removed extras
Who changed what in which revision?
| User | Revision | Line number | New 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 |