Coverage Report

Created: 2023-09-25 06:53

/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