diff options
author | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-01-09 11:55:43 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-01-13 12:18:47 +0100 |
commit | 0d4485fd78d5a14797c3511ecf808fcfa0768ac9 (patch) | |
tree | 0179c758de2113537aed53d601ce7d6425fdfe42 /src/corelib/kernel/qmetatype.h | |
parent | 8fdd1bb8cb68332db605c9f250c64dd114747c45 (diff) |
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 <simon.hausmann@digia.com>
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 29 |
1 files changed, 29 insertions, 0 deletions
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<typename T> +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<const T *>(l); + const T *rhs = static_cast<const T *>(r); + return *lhs == *rhs; + } + + static void destroy(AbstractComparatorFunction *_this) + { + delete static_cast<BuiltInEqualsComparatorFunction *>(_this); + } +}; + struct AbstractConverterFunction { typedef bool (*Converter)(const AbstractConverterFunction *, const void *, void*); @@ -530,6 +548,16 @@ public: return registerComparatorFunction( &f, typeId); } template<typename T> + static bool registerEqualsComparator() + { + Q_STATIC_ASSERT_X((!QMetaTypeId2<T>::IsBuiltIn), + "QMetaType::registerEqualsComparator: The type must be a custom type."); + const int typeId = qMetaTypeId<T>(); + static const QtPrivate::BuiltInEqualsComparatorFunction<T> f; + return registerComparatorFunction( &f, typeId); + } + + template<typename T> static bool hasRegisteredComparators() { return hasRegisteredComparators(qMetaTypeId<T>()); @@ -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<typename From, typename To> |