Skip to content

Commit fd473f8

Browse files
committed
as noted in CHANGES.md
1 parent 7843fbd commit fd473f8

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## New Features
44

5+
- Add an iterator for `JsonArray` to support range-for loops
56
- Add an iterator for `JsonObject` to support range-for loops
67
- Add `find()` to `JsonValue` to find a sub-value based on a path e.g "top/[4]/next"
78
- Add method `native_value()` to `JsonValue` which can be used for object tracing and debugging.

library/include/json/Json.hpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class JsonValue : public api::ExecutionContext {
150150
private:
151151
friend class JsonDocument;
152152
friend class JsonObjectIterator;
153+
friend class JsonArrayIterator;
153154
friend class JsonObject;
154155
friend class JsonArray;
155156
friend class JsonTrue;
@@ -219,7 +220,7 @@ class JsonObjectIterator : private JsonApi {
219220
return m_json_iter != a.m_json_iter;
220221
}
221222

222-
JsonObject operator*() const noexcept;
223+
JsonValue operator*() const noexcept;
223224

224225
JsonObjectIterator &operator++() {
225226
m_json_iter = api()->object_iter_next(m_json_value, m_json_iter);
@@ -306,19 +307,66 @@ class JsonObject : public JsonValue {
306307
JsonObject &clear();
307308

308309
JsonValue at(const var::StringView key) const;
310+
JsonValue at(size_t offset) const;
309311

310312
KeyList get_key_list() const;
311313

312314
private:
313315
json_t *create() override;
314316
};
315317

318+
class JsonArrayIterator : private JsonApi {
319+
public:
320+
321+
JsonArrayIterator() = default;
322+
323+
JsonArrayIterator(json_t * value, size_t index){
324+
m_json_value = value;
325+
m_index = index;
326+
}
327+
328+
329+
bool operator!=(JsonArrayIterator const &a) const noexcept {
330+
return m_index != a.m_index;
331+
}
332+
333+
JsonValue operator*() const noexcept {
334+
return api()->array_get(m_json_value, m_index);
335+
}
336+
337+
JsonArrayIterator &operator++() {
338+
m_index++;
339+
return *this;
340+
}
341+
342+
343+
private:
344+
json_t * m_json_value = nullptr;
345+
size_t m_index = 0;
346+
};
347+
316348
class JsonArray : public JsonValue {
317349
public:
318350
JsonArray();
319351
JsonArray(const JsonArray &value);
320352
JsonArray &operator=(const JsonArray &value);
321353

354+
JsonArrayIterator begin() const noexcept {
355+
return JsonArrayIterator(m_value, 0);
356+
}
357+
358+
JsonArrayIterator end() const noexcept {
359+
return JsonArrayIterator(m_value, count());
360+
}
361+
362+
JsonArrayIterator cbegin() const noexcept {
363+
return JsonArrayIterator(m_value, 0);
364+
}
365+
366+
JsonArrayIterator cend() const noexcept {
367+
return JsonArrayIterator(m_value, count());
368+
}
369+
322370
explicit JsonArray(const var::StringList &list);
323371
explicit JsonArray(const var::StringViewList &list);
324372
explicit JsonArray(const var::Vector<float> &list);

library/src/Json.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ const JsonObject &JsonValue::to_object() const {
192192
return static_cast<const JsonObject &>(*this);
193193
}
194194

195-
JsonObject JsonObjectIterator::operator*() const noexcept {
195+
JsonValue JsonObjectIterator::operator *() const noexcept {
196196
return JsonValue(m_json_value)
197197
.to_object()
198198
.at(api()->object_iter_key(m_json_iter));
@@ -493,6 +493,17 @@ JsonValue JsonObject::at(const var::StringView key) const {
493493
return JsonValue(api()->object_get(m_value, Key(key).cstring));
494494
}
495495

496+
JsonValue JsonObject::at(size_t offset) const {
497+
size_t count = 0;
498+
for(const auto & child: *this){
499+
if( count == offset ){
500+
return child;
501+
}
502+
count++;
503+
}
504+
return JsonValue();
505+
}
506+
496507
JsonValue
497508
JsonValue::find(const var::StringView path, const char *delimiter) const {
498509
const auto list = path.split(delimiter);

0 commit comments

Comments
 (0)