/src/arduinojson/src/ArduinoJson/Array/JsonArrayConst.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | // ArduinoJson - https://arduinojson.org |
2 | | // Copyright © 2014-2023, Benoit BLANCHON |
3 | | // MIT License |
4 | | |
5 | | #pragma once |
6 | | |
7 | | #include <ArduinoJson/Array/JsonArrayIterator.hpp> |
8 | | #include <ArduinoJson/Variant/VariantAttorney.hpp> |
9 | | #include <ArduinoJson/Variant/VariantData.hpp> |
10 | | |
11 | | ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE |
12 | | |
13 | | class JsonObject; |
14 | | |
15 | | // A read-only reference to an array in a JsonDocument |
16 | | // https://arduinojson.org/v6/api/jsonarrayconst/ |
17 | | class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> { |
18 | | friend class JsonArray; |
19 | | friend class detail::VariantAttorney; |
20 | | |
21 | | public: |
22 | | typedef JsonArrayConstIterator iterator; |
23 | | |
24 | | // Returns an iterator to the first element of the array. |
25 | | // https://arduinojson.org/v6/api/jsonarrayconst/begin/ |
26 | 0 | FORCE_INLINE iterator begin() const { |
27 | 0 | if (!data_) |
28 | 0 | return iterator(); |
29 | 0 | return iterator(data_->head()); |
30 | 0 | } |
31 | | |
32 | | // Returns an iterator to the element following the last element of the array. |
33 | | // https://arduinojson.org/v6/api/jsonarrayconst/end/ |
34 | 0 | FORCE_INLINE iterator end() const { |
35 | 0 | return iterator(); |
36 | 0 | } |
37 | | |
38 | | // Creates an unbound reference. |
39 | 0 | FORCE_INLINE JsonArrayConst() : data_(0) {} |
40 | | |
41 | | // INTERNAL USE ONLY |
42 | | FORCE_INLINE JsonArrayConst(const detail::CollectionData* data) |
43 | 0 | : data_(data) {} |
44 | | |
45 | | // Compares the content of two arrays. |
46 | | // Returns true if the two arrays are equal. |
47 | 0 | FORCE_INLINE bool operator==(JsonArrayConst rhs) const { |
48 | 0 | if (data_ == rhs.data_) |
49 | 0 | return true; |
50 | 0 | if (!data_ || !rhs.data_) |
51 | 0 | return false; |
52 | 0 |
|
53 | 0 | iterator it1 = begin(); |
54 | 0 | iterator it2 = rhs.begin(); |
55 | 0 |
|
56 | 0 | for (;;) { |
57 | 0 | bool end1 = it1 == end(); |
58 | 0 | bool end2 = it2 == rhs.end(); |
59 | 0 | if (end1 && end2) |
60 | 0 | return true; |
61 | 0 | if (end1 || end2) |
62 | 0 | return false; |
63 | 0 | if (*it1 != *it2) |
64 | 0 | return false; |
65 | 0 | ++it1; |
66 | 0 | ++it2; |
67 | 0 | } |
68 | 0 | } |
69 | | |
70 | | // Returns the element at the specified index. |
71 | | // https://arduinojson.org/v6/api/jsonarrayconst/subscript/ |
72 | 0 | FORCE_INLINE JsonVariantConst operator[](size_t index) const { |
73 | 0 | return JsonVariantConst(data_ ? data_->getElement(index) : 0); |
74 | 0 | } |
75 | | |
76 | 0 | operator JsonVariantConst() const { |
77 | 0 | return JsonVariantConst(collectionToVariant(data_)); |
78 | 0 | } |
79 | | |
80 | | // Returns true if the reference is unbound. |
81 | | // https://arduinojson.org/v6/api/jsonarrayconst/isnull/ |
82 | 0 | FORCE_INLINE bool isNull() const { |
83 | 0 | return data_ == 0; |
84 | 0 | } |
85 | | |
86 | | // Returns true if the reference is bound. |
87 | | // https://arduinojson.org/v6/api/jsonarrayconst/isnull/ |
88 | 0 | FORCE_INLINE operator bool() const { |
89 | 0 | return data_ != 0; |
90 | 0 | } |
91 | | |
92 | | // Returns the number of bytes occupied by the array. |
93 | | // https://arduinojson.org/v6/api/jsonarrayconst/memoryusage/ |
94 | 0 | FORCE_INLINE size_t memoryUsage() const { |
95 | 0 | return data_ ? data_->memoryUsage() : 0; |
96 | 0 | } |
97 | | |
98 | | // Returns the depth (nesting level) of the array. |
99 | | // https://arduinojson.org/v6/api/jsonarrayconst/nesting/ |
100 | 0 | FORCE_INLINE size_t nesting() const { |
101 | 0 | return variantNesting(collectionToVariant(data_)); |
102 | 0 | } |
103 | | |
104 | | // Returns the number of elements in the array. |
105 | | // https://arduinojson.org/v6/api/jsonarrayconst/size/ |
106 | 0 | FORCE_INLINE size_t size() const { |
107 | 0 | return data_ ? data_->size() : 0; |
108 | 0 | } |
109 | | |
110 | | private: |
111 | 0 | const detail::VariantData* getData() const { |
112 | 0 | return collectionToVariant(data_); |
113 | 0 | } |
114 | | |
115 | | const detail::CollectionData* data_; |
116 | | }; |
117 | | |
118 | | template <> |
119 | | struct Converter<JsonArrayConst> : private detail::VariantAttorney { |
120 | 0 | static void toJson(JsonVariantConst src, JsonVariant dst) { |
121 | 0 | variantCopyFrom(getData(dst), getData(src), getPool(dst)); |
122 | 0 | } |
123 | | |
124 | 0 | static JsonArrayConst fromJson(JsonVariantConst src) { |
125 | 0 | auto data = getData(src); |
126 | 0 | return data ? data->asArray() : 0; |
127 | 0 | } |
128 | | |
129 | 0 | static bool checkJson(JsonVariantConst src) { |
130 | 0 | auto data = getData(src); |
131 | 0 | return data && data->isArray(); |
132 | 0 | } |
133 | | }; |
134 | | |
135 | | ARDUINOJSON_END_PUBLIC_NAMESPACE |