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

bblanchon / ArduinoJson / 4583260581

pending completion
4583260581

push

github

Benoit Blanchon
Test: include deallocated size in allocator's log

3289 of 3305 relevant lines covered (99.52%)

6190.13 hits per line

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

98.82
/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/Strings/StringAdapters.hpp>
11
#include <ArduinoJson/Variant/Visitor.hpp>
12

13
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
14

15
class CollectionData;
16

17
struct ComparerBase : Visitor<CompareResult> {};
18

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

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

27
  explicit Comparer(T value) : rhs(value) {}
413✔
28

29
  CompareResult visitString(const char* lhs, size_t n) {
406✔
30
    int i = stringCompare(adaptString(rhs), adaptString(lhs, n));
406✔
31
    if (i < 0)
406✔
32
      return COMPARE_RESULT_GREATER;
36✔
33
    else if (i > 0)
370✔
34
      return COMPARE_RESULT_LESS;
93✔
35
    else
36
      return COMPARE_RESULT_EQUAL;
277✔
37
  }
38

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

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

53
  explicit Comparer(T value) : rhs(value) {}
2,644✔
54

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

59
  CompareResult visitSignedInteger(JsonInteger lhs) {
376✔
60
    return arithmeticCompare(lhs, rhs);
376✔
61
  }
62

63
  CompareResult visitUnsignedInteger(JsonUInt lhs) {
547✔
64
    return arithmeticCompare(lhs, rhs);
547✔
65
  }
66

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

72
struct NullComparer : ComparerBase {
73
  CompareResult visitNull() {
10✔
74
    return COMPARE_RESULT_EQUAL;
10✔
75
  }
76
};
77

78
template <>
79
struct Comparer<decltype(nullptr), void> : NullComparer {
80
  explicit Comparer(decltype(nullptr)) : NullComparer() {}
4✔
81
};
82

83
struct ArrayComparer : ComparerBase {
84
  const CollectionData* _rhs;
85

86
  explicit ArrayComparer(const CollectionData& rhs) : _rhs(&rhs) {}
256✔
87

88
  CompareResult visitArray(const CollectionData& lhs) {
234✔
89
    if (JsonArrayConst(&lhs) == JsonArrayConst(_rhs))
468✔
90
      return COMPARE_RESULT_EQUAL;
182✔
91
    else
92
      return COMPARE_RESULT_DIFFER;
52✔
93
  }
94
};
95

96
struct ObjectComparer : ComparerBase {
97
  const CollectionData* _rhs;
98

99
  explicit ObjectComparer(const CollectionData& rhs) : _rhs(&rhs) {}
261✔
100

101
  CompareResult visitObject(const CollectionData& lhs) {
238✔
102
    if (JsonObjectConst(&lhs) == JsonObjectConst(_rhs))
476✔
103
      return COMPARE_RESULT_EQUAL;
184✔
104
    else
105
      return COMPARE_RESULT_DIFFER;
54✔
106
  }
107
};
108

109
struct RawComparer : ComparerBase {
110
  const char* _rhsData;
111
  size_t _rhsSize;
112

113
  explicit RawComparer(const char* rhsData, size_t rhsSize)
18✔
114
      : _rhsData(rhsData), _rhsSize(rhsSize) {}
18✔
115

116
  CompareResult visitRawJson(const char* lhsData, size_t lhsSize) {
18✔
117
    size_t size = _rhsSize < lhsSize ? _rhsSize : lhsSize;
18✔
118
    int n = memcmp(lhsData, _rhsData, size);
18✔
119
    if (n < 0)
18✔
120
      return COMPARE_RESULT_LESS;
6✔
121
    else if (n > 0)
12✔
122
      return COMPARE_RESULT_GREATER;
6✔
123
    else
124
      return COMPARE_RESULT_EQUAL;
6✔
125
  }
126
};
127

128
struct VariantComparer : ComparerBase {
129
  const VariantData* rhs;
130

131
  explicit VariantComparer(const VariantData* value) : rhs(value) {}
1,254✔
132

133
  CompareResult visitArray(const CollectionData& lhs) {
256✔
134
    ArrayComparer comparer(lhs);
256✔
135
    return accept(comparer);
512✔
136
  }
137

138
  CompareResult visitObject(const CollectionData& lhs) {
261✔
139
    ObjectComparer comparer(lhs);
261✔
140
    return accept(comparer);
522✔
141
  }
142

143
  CompareResult visitFloat(JsonFloat lhs) {
6✔
144
    Comparer<JsonFloat> comparer(lhs);
6✔
145
    return accept(comparer);
12✔
146
  }
147

148
  CompareResult visitString(const char* lhs, size_t) {
256✔
149
    Comparer<const char*> comparer(lhs);
256✔
150
    return accept(comparer);
512✔
151
  }
152

153
  CompareResult visitRawJson(const char* lhsData, size_t lhsSize) {
18✔
154
    RawComparer comparer(lhsData, lhsSize);
18✔
155
    return accept(comparer);
36✔
156
  }
157

158
  CompareResult visitSignedInteger(JsonInteger lhs) {
320✔
159
    Comparer<JsonInteger> comparer(lhs);
320✔
160
    return accept(comparer);
640✔
161
  }
162

163
  CompareResult visitUnsignedInteger(JsonUInt lhs) {
12✔
164
    Comparer<JsonUInt> comparer(lhs);
12✔
165
    return accept(comparer);
24✔
166
  }
167

168
  CompareResult visitBoolean(bool lhs) {
66✔
169
    Comparer<bool> comparer(lhs);
66✔
170
    return accept(comparer);
132✔
171
  }
172

173
  CompareResult visitNull() {
59✔
174
    NullComparer comparer;
175
    return accept(comparer);
118✔
176
  }
177

178
 private:
179
  template <typename TComparer>
180
  CompareResult accept(TComparer& comparer) {
1,254✔
181
    CompareResult reversedResult = variantAccept(rhs, comparer);
1,254✔
182
    switch (reversedResult) {
1,254✔
183
      case COMPARE_RESULT_GREATER:
54✔
184
        return COMPARE_RESULT_LESS;
54✔
185
      case COMPARE_RESULT_LESS:
132✔
186
        return COMPARE_RESULT_GREATER;
132✔
187
      default:
1,068✔
188
        return reversedResult;
1,068✔
189
    }
190
  }
191
};
192

193
template <typename T>
194
struct Comparer<T, typename enable_if<is_convertible<
195
                       T, ArduinoJson::JsonVariantConst>::value>::type>
196
    : VariantComparer {
197
  explicit Comparer(const T& value)
1,254✔
198
      : VariantComparer(VariantAttorney::getData(value)) {}
2,508✔
199
};
200

201
template <typename T>
202
CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) {
3,655✔
203
  Comparer<T> comparer(rhs);
3,747✔
204
  return variantAccept(VariantAttorney::getData(lhs), comparer);
7,310✔
205
}
206

207
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