From 0d4485fd78d5a14797c3511ecf808fcfa0768ac9 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 9 Jan 2015 11:55:43 +0100 Subject: Support QMetaType::equals() This avoids having to define operator< for types where operator== is required but operator< doesn't make any sense (e.g. QGeoCoordinate). Change-Id: I81f6a9d8fc0009a4514c974b5e02b446c50d1e31 Reviewed-by: Simon Hausmann --- src/corelib/kernel/qmetatype.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/corelib/kernel/qmetatype.h') diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 5b8c5a6b3d..2ff695b833 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -291,6 +291,24 @@ struct BuiltInComparatorFunction : public AbstractComparatorFunction } }; +template +struct BuiltInEqualsComparatorFunction : public AbstractComparatorFunction +{ + BuiltInEqualsComparatorFunction() + : AbstractComparatorFunction(0, equals, destroy) {} + static bool equals(const AbstractComparatorFunction *, const void *l, const void *r) + { + const T *lhs = static_cast(l); + const T *rhs = static_cast(r); + return *lhs == *rhs; + } + + static void destroy(AbstractComparatorFunction *_this) + { + delete static_cast(_this); + } +}; + struct AbstractConverterFunction { typedef bool (*Converter)(const AbstractConverterFunction *, const void *, void*); @@ -529,6 +547,16 @@ public: static const QtPrivate::BuiltInComparatorFunction f; return registerComparatorFunction( &f, typeId); } + template + static bool registerEqualsComparator() + { + Q_STATIC_ASSERT_X((!QMetaTypeId2::IsBuiltIn), + "QMetaType::registerEqualsComparator: The type must be a custom type."); + const int typeId = qMetaTypeId(); + static const QtPrivate::BuiltInEqualsComparatorFunction f; + return registerComparatorFunction( &f, typeId); + } + template static bool hasRegisteredComparators() { @@ -610,6 +638,7 @@ public: static bool convert(const void *from, int fromTypeId, void *to, int toTypeId); static bool compare(const void *lhs, const void *rhs, int typeId, int* result); + static bool equals(const void *lhs, const void *rhs, int typeId, int* result); static bool debugStream(QDebug& dbg, const void *rhs, int typeId); template -- cgit v1.2.3