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

bblanchon / ArduinoJson / 5645229289

pending completion
5645229289

push

github

bblanchon
Remains

3427 of 3441 relevant lines covered (99.59%)

8803.53 hits per line

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

98.81
/src/ArduinoJson/Variant/VariantCompare.hpp
1
// ArduinoJson - https://arduinojson.org
2
// Copyright © 2014-2023, Benoit BLANCHON
3
// MIT License
4

5
#pragma once
6

7
#include <ArduinoJson/Configuration.hpp>
8
#include <ArduinoJson/Numbers/arithmeticCompare.hpp>
9
#include <ArduinoJson/Polyfills/type_traits.hpp>
10
#include <ArduinoJson/Polyfills/utility.hpp>
11
#include <ArduinoJson/Strings/StringAdapters.hpp>
12
#include <ArduinoJson/Variant/JsonVariantVisitor.hpp>
13

14
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
15

16
struct ComparerBase : JsonVariantVisitor<CompareResult> {};
17

18
template <typename T, typename Enable = void>
19
struct Comparer;
20

21
template <typename T>
22
struct Comparer<T, typename enable_if<IsString<T>::value>::type>
23
    : ComparerBase {
24
  T rhs;  // TODO: store adapted string?
25

26
  explicit Comparer(T value) : rhs(value) {}
473✔
27

28
  CompareResult visit(JsonString lhs) {
465✔
29
    int i = stringCompare(adaptString(rhs), adaptString(lhs));
465✔
30
    if (i < 0)
465✔
31
      return COMPARE_RESULT_GREATER;
59✔
32
    else if (i > 0)
406✔
33
      return COMPARE_RESULT_LESS;
70✔
34
    else
35
      return COMPARE_RESULT_EQUAL;
336✔
36
  }
37

38
  CompareResult visit(nullptr_t) {
7✔
39
    if (adaptString(rhs).isNull())
7✔
40
      return COMPARE_RESULT_EQUAL;
7✔
41
    else
42
      return COMPARE_RESULT_DIFFER;
×
43
  }
44

45
  using ComparerBase::visit;
46
};
47

48
template <typename T>
49
struct Comparer<T, typename enable_if<is_integral<T>::value ||
50
                                      is_floating_point<T>::value>::type>
51
    : ComparerBase {
52
  T rhs;
53

54
  explicit Comparer(T value) : rhs(value) {}
2,700✔
55

56
  CompareResult visit(JsonFloat lhs) {
22✔
57
    return arithmeticCompare(lhs, rhs);
22✔
58
  }
59

60
  CompareResult visit(JsonInteger lhs) {
436✔
61
    return arithmeticCompare(lhs, rhs);
436✔
62
  }
63

64
  CompareResult visit(JsonUInt lhs) {
544✔
65
    return arithmeticCompare(lhs, rhs);
544✔
66
  }
67

68
  CompareResult visit(bool lhs) {
425✔
69
    return visit(static_cast<JsonUInt>(lhs));
425✔
70
  }
71

72
  using ComparerBase::visit;
73
};
74

75
struct NullComparer : ComparerBase {
76
  CompareResult visit(nullptr_t) {
11✔
77
    return COMPARE_RESULT_EQUAL;
11✔
78
  }
79

80
  using ComparerBase::visit;
81
};
82

83
template <>
84
struct Comparer<nullptr_t, void> : NullComparer {
85
  explicit Comparer(nullptr_t) : NullComparer() {}
4✔
86
};
87

88
struct ArrayComparer : ComparerBase {
89
  JsonArrayConst rhs_;
90

91
  explicit ArrayComparer(JsonArrayConst rhs) : rhs_(rhs) {}
269✔
92

93
  CompareResult visit(JsonArrayConst lhs) {
245✔
94
    if (rhs_ == lhs)
245✔
95
      return COMPARE_RESULT_EQUAL;
189✔
96
    else
97
      return COMPARE_RESULT_DIFFER;
56✔
98
  }
99

100
  using ComparerBase::visit;
101
};
102

103
struct ObjectComparer : ComparerBase {
104
  JsonObjectConst rhs_;
105

106
  explicit ObjectComparer(JsonObjectConst rhs) : rhs_(rhs) {}
275✔
107

108
  CompareResult visit(JsonObjectConst lhs) {
250✔
109
    if (lhs == rhs_)
250✔
110
      return COMPARE_RESULT_EQUAL;
192✔
111
    else
112
      return COMPARE_RESULT_DIFFER;
58✔
113
  }
114

115
  using ComparerBase::visit;
116
};
117

118
struct RawComparer : ComparerBase {
119
  RawString rhs_;
120

121
  explicit RawComparer(RawString rhs) : rhs_(rhs) {}
18✔
122

123
  CompareResult visit(RawString lhs) {
18✔
124
    size_t size = rhs_.size() < lhs.size() ? rhs_.size() : lhs.size();
18✔
125
    int n = memcmp(lhs.data(), rhs_.data(), size);
18✔
126
    if (n < 0)
18✔
127
      return COMPARE_RESULT_LESS;
6✔
128
    else if (n > 0)
12✔
129
      return COMPARE_RESULT_GREATER;
6✔
130
    else
131
      return COMPARE_RESULT_EQUAL;
6✔
132
  }
133

134
  using ComparerBase::visit;
135
};
136

137
struct VariantComparer : ComparerBase {
138
  JsonVariantConst rhs;
139

140
  explicit VariantComparer(JsonVariantConst value) : rhs(value) {}
1,400✔
141

142
  CompareResult visit(JsonArrayConst lhs) {
269✔
143
    ArrayComparer comparer(lhs);
269✔
144
    return reverseResult(comparer);
538✔
145
  }
146

147
  CompareResult visit(JsonObjectConst lhs) {
275✔
148
    ObjectComparer comparer(lhs);
275✔
149
    return reverseResult(comparer);
550✔
150
  }
151

152
  CompareResult visit(JsonFloat lhs) {
6✔
153
    Comparer<JsonFloat> comparer(lhs);
6✔
154
    return reverseResult(comparer);
12✔
155
  }
156

157
  CompareResult visit(JsonString lhs) {
317✔
158
    Comparer<JsonString> comparer(lhs);
317✔
159
    return reverseResult(comparer);
634✔
160
  }
161

162
  CompareResult visit(RawString value) {
18✔
163
    RawComparer comparer(value);
18✔
164
    return reverseResult(comparer);
36✔
165
  }
166

167
  CompareResult visit(JsonInteger lhs) {
379✔
168
    Comparer<JsonInteger> comparer(lhs);
379✔
169
    return reverseResult(comparer);
758✔
170
  }
171

172
  CompareResult visit(JsonUInt lhs) {
12✔
173
    Comparer<JsonUInt> comparer(lhs);
12✔
174
    return reverseResult(comparer);
24✔
175
  }
176

177
  CompareResult visit(bool lhs) {
66✔
178
    Comparer<bool> comparer(lhs);
66✔
179
    return reverseResult(comparer);
132✔
180
  }
181

182
  CompareResult visit(nullptr_t) {
58✔
183
    NullComparer comparer;
184
    return reverseResult(comparer);
116✔
185
  }
186

187
 private:
188
  template <typename TComparer>
189
  CompareResult reverseResult(TComparer& comparer) {
1,400✔
190
    CompareResult reversedResult = accept(rhs, comparer);
1,400✔
191
    switch (reversedResult) {
1,400✔
192
      case COMPARE_RESULT_GREATER:
83✔
193
        return COMPARE_RESULT_LESS;
83✔
194
      case COMPARE_RESULT_LESS:
103✔
195
        return COMPARE_RESULT_GREATER;
103✔
196
      default:
1,214✔
197
        return reversedResult;
1,214✔
198
    }
199
  }
200
};
201

202
template <typename T>
203
struct Comparer<T, typename enable_if<is_convertible<
204
                       T, ArduinoJson::JsonVariantConst>::value>::type>
205
    : VariantComparer {
206
  explicit Comparer(const T& value)
1,400✔
207
      : VariantComparer(static_cast<JsonVariantConst>(value)) {}
1,640✔
208
};
209

210
template <typename T>
211
CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) {
3,797✔
212
  Comparer<T> comparer(rhs);
3,843✔
213
  return accept(lhs, comparer);
7,594✔
214
}
215

216
ARDUINOJSON_END_PRIVATE_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