Coverage Report

Created: 2026-01-22 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/arduinojson/src/ArduinoJson/Variant/VariantCompare.hpp
Line
Count
Source
1
// ArduinoJson - https://arduinojson.org
2
// Copyright © 2014-2025, 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, enable_if_t<IsString<T>::value>> : ComparerBase {
23
  T rhs;  // TODO: store adapted string?
24
25
  explicit Comparer(T value) : rhs(value) {}
26
27
0
  CompareResult visit(JsonString lhs) {
28
0
    int i = stringCompare(adaptString(rhs), adaptString(lhs));
29
0
    if (i < 0)
30
0
      return COMPARE_RESULT_GREATER;
31
0
    else if (i > 0)
32
0
      return COMPARE_RESULT_LESS;
33
0
    else
34
0
      return COMPARE_RESULT_EQUAL;
35
0
  }
36
37
0
  CompareResult visit(nullptr_t) {
38
0
    if (adaptString(rhs).isNull())
39
0
      return COMPARE_RESULT_EQUAL;
40
0
    else
41
0
      return COMPARE_RESULT_DIFFER;
42
0
  }
43
44
  using ComparerBase::visit;
45
};
46
47
template <typename T>
48
struct Comparer<
49
    T, enable_if_t<is_integral<T>::value || is_floating_point<T>::value>>
50
    : ComparerBase {
51
  T rhs;
52
53
  explicit Comparer(T value) : rhs(value) {}
54
55
  template <typename U>
56
  enable_if_t<is_floating_point<U>::value || is_integral<U>::value,
57
              CompareResult>
58
0
  visit(const U& lhs) {
59
0
    return arithmeticCompare(lhs, rhs);
60
0
  }
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitIfEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitIdEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitIlEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitImEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitIbEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitIfEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitIdEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitIlEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitImEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitIbEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitIfEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitIdEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitIlEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitImEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitIbEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitIfEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitIdEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitIlEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitImEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitIbEENS1_9enable_ifIXoosr17is_floating_pointIT_EE5valuesr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
61
62
  template <typename U>
63
  enable_if_t<!is_floating_point<U>::value && !is_integral<U>::value,
64
              CompareResult>
65
0
  visit(const U& lhs) {
66
0
    return ComparerBase::visit(lhs);
67
0
  }
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitIDnEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitINS0_14JsonArrayConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitINS0_15JsonObjectConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitINS0_10JsonStringEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIdvE5visitINS0_15SerializedValueIPKcEEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralISA_EE5valueENS1_13CompareResultEE4typeERKSA_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitIDnEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitINS0_14JsonArrayConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitINS0_15JsonObjectConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitINS0_10JsonStringEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIlvE5visitINS0_15SerializedValueIPKcEEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralISA_EE5valueENS1_13CompareResultEE4typeERKSA_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitIDnEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitINS0_14JsonArrayConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitINS0_15JsonObjectConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitINS0_10JsonStringEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerImvE5visitINS0_15SerializedValueIPKcEEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralISA_EE5valueENS1_13CompareResultEE4typeERKSA_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitIDnEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS6_EE5valueENS1_13CompareResultEE4typeERKS6_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitINS0_14JsonArrayConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitINS0_15JsonObjectConstEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitINS0_10JsonStringEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralIS7_EE5valueENS1_13CompareResultEE4typeERKS7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail8ComparerIbvE5visitINS0_15SerializedValueIPKcEEEENS1_9enable_ifIXaantsr17is_floating_pointIT_EE5valuentsr11is_integralISA_EE5valueENS1_13CompareResultEE4typeERKSA_
68
};
69
70
struct NullComparer : ComparerBase {
71
0
  CompareResult visit(nullptr_t) {
72
0
    return COMPARE_RESULT_EQUAL;
73
0
  }
74
75
  using ComparerBase::visit;
76
};
77
78
template <>
79
struct Comparer<nullptr_t, void> : NullComparer {
80
0
  explicit Comparer(nullptr_t) : NullComparer() {}
81
};
82
83
struct ArrayComparer : ComparerBase {
84
  JsonArrayConst rhs_;
85
86
0
  explicit ArrayComparer(JsonArrayConst rhs) : rhs_(rhs) {}
87
88
0
  CompareResult visit(JsonArrayConst lhs) {
89
0
    if (rhs_ == lhs)
90
0
      return COMPARE_RESULT_EQUAL;
91
0
    else
92
0
      return COMPARE_RESULT_DIFFER;
93
0
  }
94
95
  using ComparerBase::visit;
96
};
97
98
struct ObjectComparer : ComparerBase {
99
  JsonObjectConst rhs_;
100
101
0
  explicit ObjectComparer(JsonObjectConst rhs) : rhs_(rhs) {}
102
103
0
  CompareResult visit(JsonObjectConst lhs) {
104
0
    if (lhs == rhs_)
105
0
      return COMPARE_RESULT_EQUAL;
106
0
    else
107
0
      return COMPARE_RESULT_DIFFER;
108
0
  }
109
110
  using ComparerBase::visit;
111
};
112
113
struct RawComparer : ComparerBase {
114
  RawString rhs_;
115
116
0
  explicit RawComparer(RawString rhs) : rhs_(rhs) {}
117
118
0
  CompareResult visit(RawString lhs) {
119
0
    size_t size = rhs_.size() < lhs.size() ? rhs_.size() : lhs.size();
120
0
    int n = memcmp(lhs.data(), rhs_.data(), size);
121
0
    if (n < 0)
122
0
      return COMPARE_RESULT_LESS;
123
0
    else if (n > 0)
124
0
      return COMPARE_RESULT_GREATER;
125
0
    else
126
0
      return COMPARE_RESULT_EQUAL;
127
0
  }
128
129
  using ComparerBase::visit;
130
};
131
132
struct VariantComparer : ComparerBase {
133
  JsonVariantConst rhs;
134
135
0
  explicit VariantComparer(JsonVariantConst value) : rhs(value) {}
136
137
0
  CompareResult visit(JsonArrayConst lhs) {
138
0
    ArrayComparer comparer(lhs);
139
0
    return reverseResult(comparer);
140
0
  }
141
142
0
  CompareResult visit(JsonObjectConst lhs) {
143
0
    ObjectComparer comparer(lhs);
144
0
    return reverseResult(comparer);
145
0
  }
146
147
0
  CompareResult visit(JsonFloat lhs) {
148
0
    Comparer<JsonFloat> comparer(lhs);
149
0
    return reverseResult(comparer);
150
0
  }
151
152
0
  CompareResult visit(JsonString lhs) {
153
0
    Comparer<JsonString> comparer(lhs);
154
0
    return reverseResult(comparer);
155
0
  }
156
157
0
  CompareResult visit(RawString value) {
158
0
    RawComparer comparer(value);
159
0
    return reverseResult(comparer);
160
0
  }
161
162
0
  CompareResult visit(JsonInteger lhs) {
163
0
    Comparer<JsonInteger> comparer(lhs);
164
0
    return reverseResult(comparer);
165
0
  }
166
167
0
  CompareResult visit(JsonUInt lhs) {
168
0
    Comparer<JsonUInt> comparer(lhs);
169
0
    return reverseResult(comparer);
170
0
  }
171
172
0
  CompareResult visit(bool lhs) {
173
0
    Comparer<bool> comparer(lhs);
174
0
    return reverseResult(comparer);
175
0
  }
176
177
0
  CompareResult visit(nullptr_t) {
178
0
    NullComparer comparer;
179
0
    return reverseResult(comparer);
180
0
  }
181
182
 private:
183
  template <typename TComparer>
184
0
  CompareResult reverseResult(TComparer& comparer) {
185
0
    CompareResult reversedResult = accept(rhs, comparer);
186
0
    switch (reversedResult) {
187
0
      case COMPARE_RESULT_GREATER:
188
0
        return COMPARE_RESULT_LESS;
189
0
      case COMPARE_RESULT_LESS:
190
0
        return COMPARE_RESULT_GREATER;
191
0
      default:
192
0
        return reversedResult;
193
0
    }
194
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::ArrayComparer>(ArduinoJson::V742HB42::detail::ArrayComparer&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::ObjectComparer>(ArduinoJson::V742HB42::detail::ObjectComparer&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::Comparer<double, void> >(ArduinoJson::V742HB42::detail::Comparer<double, void>&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> >(ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void>&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::RawComparer>(ArduinoJson::V742HB42::detail::RawComparer&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::Comparer<long, void> >(ArduinoJson::V742HB42::detail::Comparer<long, void>&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> >(ArduinoJson::V742HB42::detail::Comparer<unsigned long, void>&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::Comparer<bool, void> >(ArduinoJson::V742HB42::detail::Comparer<bool, void>&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::VariantComparer::reverseResult<ArduinoJson::V742HB42::detail::NullComparer>(ArduinoJson::V742HB42::detail::NullComparer&)
195
};
196
197
template <typename T>
198
struct Comparer<
199
    T, enable_if_t<is_convertible<T, ArduinoJson::JsonVariantConst>::value>>
200
    : VariantComparer {
201
  explicit Comparer(const T& value)
202
      : VariantComparer(static_cast<JsonVariantConst>(value)) {}
203
};
204
205
template <typename T>
206
0
CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) {
207
0
  Comparer<T> comparer(rhs);
208
0
  return accept(lhs, comparer);
209
0
}
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::compare<ArduinoJson::V742HB42::JsonVariantConst>(ArduinoJson::V742HB42::JsonVariantConst, ArduinoJson::V742HB42::JsonVariantConst const&)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::CompareResult ArduinoJson::V742HB42::detail::compare<bool>(ArduinoJson::V742HB42::JsonVariantConst, bool const&)
210
211
ARDUINOJSON_END_PRIVATE_NAMESPACE