• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bblanchon / ArduinoJson / 17341271098

30 Aug 2025 07:55AM UTC coverage: 99.349% (+0.02%) from 99.332%
17341271098

push

github

bblanchon
Extract `ArrayImpl`, `CollectionImpl`, and `ObjectImpl`

278 of 282 new or added lines in 24 files covered. (98.58%)

2 existing lines in 2 files now uncovered.

3970 of 3996 relevant lines covered (99.35%)

10398.68 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.55
/src/ArduinoJson/Array/JsonArray.hpp
1
// ArduinoJson - https://arduinojson.org
2
// Copyright © 2014-2025, Benoit BLANCHON
3
// MIT License
4

5
#pragma once
6

7
#include <ArduinoJson/Array/ElementProxy.hpp>
8
#include <ArduinoJson/Array/JsonArrayConst.hpp>
9

10
ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
11

12
class JsonObject;
13

14
// A reference to an array in a JsonDocument
15
// https://arduinojson.org/v7/api/jsonarray/
16
class JsonArray : public detail::VariantOperators<JsonArray> {
17
  friend class detail::VariantAttorney;
18

19
 public:
20
  using iterator = JsonArrayIterator;
21

22
  // Constructs an unbound reference.
23
  JsonArray() {}
18✔
24

25
  // INTERNAL USE ONLY
26
  JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
76✔
27
      : impl_(detail::VariantData::asArray(data, resources)) {}
76✔
28

29
  // INTERNAL USE ONLY
30
  JsonArray(const detail::ArrayImpl& impl) : impl_(impl) {}
256✔
31

32
  // Returns a JsonVariant pointing to the array.
33
  // https://arduinojson.org/v7/api/jsonvariant/
34
  operator JsonVariant() {
8✔
35
    return JsonVariant(getData(), getResourceManager());
8✔
36
  }
37

38
  // Returns a read-only reference to the array.
39
  // https://arduinojson.org/v7/api/jsonarrayconst/
40
  operator JsonArrayConst() const {
44✔
41
    return JsonArrayConst(getData(), getResourceManager());
44✔
42
  }
43

44
  // Appends a new (empty) element to the array.
45
  // Returns a reference to the new element.
46
  // https://arduinojson.org/v7/api/jsonarray/add/
47
  template <typename T, detail::enable_if_t<
48
                            !detail::is_same<T, JsonVariant>::value, int> = 0>
49
  T add() const {
36✔
50
    return add<JsonVariant>().to<T>();
36✔
51
  }
52

53
  // Appends a new (null) element to the array.
54
  // Returns a reference to the new element.
55
  // https://arduinojson.org/v7/api/jsonarray/add/
56
  template <typename T, detail::enable_if_t<
57
                            detail::is_same<T, JsonVariant>::value, int> = 0>
58
  JsonVariant add() const {
65✔
59
    return JsonVariant(impl_.addElement(), impl_.getResourceManager());
65✔
60
  }
61

62
  // Appends a value to the array.
63
  // https://arduinojson.org/v7/api/jsonarray/add/
64
  template <typename T>
65
  bool add(const T& value) const {
66,545✔
66
    return impl_.addValue(value);
66,545✔
67
  }
68

69
  // Appends a value to the array.
70
  // https://arduinojson.org/v7/api/jsonarray/add/
71
  template <typename T,
72
            detail::enable_if_t<!detail::is_const<T>::value, int> = 0>
73
  bool add(T* value) const {
3✔
74
    return impl_.addValue(value);
3✔
75
  }
76

77
  // Returns an iterator to the first element of the array.
78
  // https://arduinojson.org/v7/api/jsonarray/begin/
79
  iterator begin() const {
7✔
80
    return iterator(impl_.createIterator(), impl_.getResourceManager());
7✔
81
  }
82

83
  // Returns an iterator following the last element of the array.
84
  // https://arduinojson.org/v7/api/jsonarray/end/
85
  iterator end() const {
7✔
86
    return iterator();
7✔
87
  }
88

89
  // Copies an array.
90
  // https://arduinojson.org/v7/api/jsonarray/set/
91
  bool set(JsonArrayConst src) const {
13✔
92
    if (isNull())
13✔
UNCOV
93
      return false;
×
94

95
    clear();
13✔
96
    for (auto element : src) {
19✔
97
      if (!add(element))
7✔
98
        return false;
1✔
99
    }
100

101
    return true;
12✔
102
  }
103

104
  // Removes the element at the specified iterator.
105
  // https://arduinojson.org/v7/api/jsonarray/remove/
106
  void remove(iterator it) const {
6✔
107
    impl_.remove(it.iterator_);
6✔
108
  }
6✔
109

110
  // Removes the element at the specified index.
111
  // https://arduinojson.org/v7/api/jsonarray/remove/
112
  void remove(size_t index) const {
6✔
113
    impl_.removeElement(index);
6✔
114
  }
6✔
115

116
  // Removes the element at the specified index.
117
  // https://arduinojson.org/v7/api/jsonarray/remove/
118
  template <typename TVariant,
119
            detail::enable_if_t<detail::IsVariant<TVariant>::value, int> = 0>
120
  void remove(const TVariant& variant) const {
2✔
121
    if (variant.template is<size_t>())
2✔
122
      remove(variant.template as<size_t>());
1✔
123
  }
2✔
124

125
  // Removes all the elements of the array.
126
  // https://arduinojson.org/v7/api/jsonarray/clear/
127
  void clear() const {
16✔
128
    impl_.clear();
16✔
129
  }
16✔
130

131
  // Gets or sets the element at the specified index.
132
  // https://arduinojson.org/v7/api/jsonarray/subscript/
133
  template <typename T,
134
            detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
135
  detail::ElementProxy<JsonArray> operator[](T index) const {
263✔
136
    return {*this, size_t(index)};
263✔
137
  }
138

139
  // Gets or sets the element at the specified index.
140
  // https://arduinojson.org/v7/api/jsonarray/subscript/
141
  template <typename TVariant,
142
            detail::enable_if_t<detail::IsVariant<TVariant>::value, int> = 0>
143
  detail::ElementProxy<JsonArray> operator[](const TVariant& variant) const {
2✔
144
    if (variant.template is<size_t>())
2✔
145
      return {*this, variant.template as<size_t>()};
1✔
146
    else
147
      return {*this, size_t(-1)};
1✔
148
  }
149

150
  operator JsonVariantConst() const {
271✔
151
    return JsonVariantConst(getData(), getResourceManager());
271✔
152
  }
153

154
  // Returns true if the reference is unbound.
155
  // https://arduinojson.org/v7/api/jsonarray/isnull/
156
  bool isNull() const {
34✔
157
    return impl_.isNull();
34✔
158
  }
159

160
  // Returns true if the reference is bound.
161
  // https://arduinojson.org/v7/api/jsonarray/isnull/
162
  operator bool() const {
2✔
163
    return !isNull();
2✔
164
  }
165

166
  // Returns the depth (nesting level) of the array.
167
  // https://arduinojson.org/v7/api/jsonarray/nesting/
168
  size_t nesting() const {
5✔
169
    return impl_.nesting();
5✔
170
  }
171

172
  // Returns the number of elements in the array.
173
  // https://arduinojson.org/v7/api/jsonarray/size/
174
  size_t size() const {
79✔
175
    return impl_.size();
79✔
176
  }
177

178
  // DEPRECATED: use add<JsonVariant>() instead
179
  ARDUINOJSON_DEPRECATED("use add<JsonVariant>() instead")
180
  JsonVariant add() const {
1✔
181
    return add<JsonVariant>();
1✔
182
  }
183

184
  // DEPRECATED: use add<JsonArray>() instead
185
  ARDUINOJSON_DEPRECATED("use add<JsonArray>() instead")
186
  JsonArray createNestedArray() const {
1✔
187
    return add<JsonArray>();
1✔
188
  }
189

190
  // DEPRECATED: use add<JsonObject>() instead
191
  ARDUINOJSON_DEPRECATED("use add<JsonObject>() instead")
192
  JsonObject createNestedObject() const;
193

194
  // DEPRECATED: always returns zero
195
  ARDUINOJSON_DEPRECATED("always returns zero")
196
  size_t memoryUsage() const {
1✔
197
    return 0;
1✔
198
  }
199

200
 private:
201
  detail::ResourceManager* getResourceManager() const {
861✔
202
    return impl_.getResourceManager();
861✔
203
  }
204

205
  detail::VariantData* getData() const {
568✔
206
    return impl_.getData();
568✔
207
  }
208

209
  detail::VariantData* getOrCreateData() const {
22✔
210
    return impl_.getData();
22✔
211
  }
212

213
  mutable detail::ArrayImpl impl_;
214
};
215

216
ARDUINOJSON_END_PUBLIC_NAMESPACE
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc