/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 |