Don't call operator VariantConstRef in VariantComparer

This commit is contained in:
Benoit Blanchon
2022-08-30 10:14:48 +02:00
parent ffa7f8d22d
commit 2b6bb78a09
3 changed files with 16 additions and 7 deletions

View File

@ -22,6 +22,8 @@ class ElementProxy;
template <typename TData> template <typename TData>
class ArrayRefBase { class ArrayRefBase {
friend class VariantAttorney;
public: public:
operator VariantConstRef() const { operator VariantConstRef() const {
return VariantConstRef(collectionToVariant(_data)); return VariantConstRef(collectionToVariant(_data));
@ -48,6 +50,10 @@ class ArrayRefBase {
} }
protected: protected:
const VariantData* getData() const {
return collectionToVariant(_data);
}
ArrayRefBase(TData* data) : _data(data) {} ArrayRefBase(TData* data) : _data(data) {}
TData* _data; TData* _data;
}; };

View File

@ -16,6 +16,8 @@ namespace ARDUINOJSON_NAMESPACE {
template <typename TData> template <typename TData>
class ObjectRefBase { class ObjectRefBase {
friend class VariantAttorney;
public: public:
operator VariantConstRef() const { operator VariantConstRef() const {
return VariantConstRef(collectionToVariant(_data)); return VariantConstRef(collectionToVariant(_data));
@ -42,6 +44,10 @@ class ObjectRefBase {
} }
protected: protected:
const VariantData* getData() const {
return collectionToVariant(_data);
}
ObjectRefBase(TData* data) : _data(data) {} ObjectRefBase(TData* data) : _data(data) {}
TData* _data; TData* _data;
}; };
@ -116,8 +122,6 @@ class ObjectConstRef : public ObjectRefBase<const CollectionData>,
} }
return count == rhs.size(); return count == rhs.size();
} }
private:
}; };
class ObjectRef : public ObjectRefBase<CollectionData>, class ObjectRef : public ObjectRefBase<CollectionData>,

View File

@ -128,9 +128,9 @@ struct RawComparer : ComparerBase {
}; };
struct VariantComparer : ComparerBase { struct VariantComparer : ComparerBase {
VariantConstRef rhs; const VariantData* rhs;
explicit VariantComparer(VariantConstRef value) : rhs(value) {} explicit VariantComparer(const VariantData* value) : rhs(value) {}
CompareResult visitArray(const CollectionData& lhs) { CompareResult visitArray(const CollectionData& lhs) {
ArrayComparer comparer(lhs); ArrayComparer comparer(lhs);
@ -180,8 +180,7 @@ struct VariantComparer : ComparerBase {
private: private:
template <typename TComparer> template <typename TComparer>
CompareResult accept(TComparer& comparer) { CompareResult accept(TComparer& comparer) {
CompareResult reversedResult = CompareResult reversedResult = variantAccept(rhs, comparer);
variantAccept(VariantAttorney::getData(rhs), comparer);
switch (reversedResult) { switch (reversedResult) {
case COMPARE_RESULT_GREATER: case COMPARE_RESULT_GREATER:
return COMPARE_RESULT_LESS; return COMPARE_RESULT_LESS;
@ -198,7 +197,7 @@ struct Comparer<
T, typename enable_if<is_convertible<T, VariantConstRef>::value>::type> T, typename enable_if<is_convertible<T, VariantConstRef>::value>::type>
: VariantComparer { : VariantComparer {
explicit Comparer(const T& value) explicit Comparer(const T& value)
: VariantComparer(value.operator VariantConstRef()) {} : VariantComparer(VariantAttorney::getData(value)) {}
}; };
template <typename T> template <typename T>