diff --git a/samples/blackmisc/sampleschangeobject.cpp b/samples/blackmisc/sampleschangeobject.cpp index b4c418e7b..f90755e27 100644 --- a/samples/blackmisc/sampleschangeobject.cpp +++ b/samples/blackmisc/sampleschangeobject.cpp @@ -70,7 +70,7 @@ namespace BlackMiscTest // now Jane's time is over CPropertyIndexVariantMap anotherController; anotherController.addValue(CAtcStation::IndexController, CVariant::fromValue(CUser("445566", "Fuzzy"))); - atcList.applyIf(BlackMisc::Predicates::Equals(newController), anotherController); + atcList.applyIf(BlackMisc::Predicates::Matches(newController), anotherController); qDebug() << "-- after update via value map"; qDebug() << atcList.toQString(); diff --git a/src/blackmisc/predicates.h b/src/blackmisc/predicates.h index edc859aa6..49098d381 100644 --- a/src/blackmisc/predicates.h +++ b/src/blackmisc/predicates.h @@ -17,6 +17,8 @@ namespace BlackMisc { + class CPropertyIndexVariantMap; + namespace Predicates { @@ -98,6 +100,14 @@ namespace BlackMisc template bool operator ()(const U &other) const { return other == m_value; } }; + //! \private + struct Matches + { + const CPropertyIndexVariantMap &m_map; + Matches(const CPropertyIndexVariantMap &map) : m_map(map) {} + template bool operator()(const T &value) const; + }; + } //namespace Private /*! @@ -173,6 +183,14 @@ namespace BlackMisc return { std::forward(value), 0 }; } + /*! + * Predicate which is true if its argument matches a captured CPropertyIndexVariantMap. + */ + inline auto Matches(const CPropertyIndexVariantMap &map) -> Private::Matches + { + return { map }; + } + } //namespace Predicates } //namespace BlackMisc diff --git a/src/blackmisc/propertyindexvariantmap.cpp b/src/blackmisc/propertyindexvariantmap.cpp index c883b3b0c..fa4109e76 100644 --- a/src/blackmisc/propertyindexvariantmap.cpp +++ b/src/blackmisc/propertyindexvariantmap.cpp @@ -31,10 +31,10 @@ namespace BlackMisc return !(b == a); } - bool operator==(const CPropertyIndexVariantMap &indexMap, const CVariant &variant) + bool CPropertyIndexVariantMap::matchesVariant(const CVariant &variant) const { - if (indexMap.isEmpty()) return indexMap.isWildcard(); - const auto &map = indexMap.map(); + if (this->isEmpty()) return this->isWildcard(); + const auto &map = this->map(); for (auto it = map.begin(); it != map.end(); ++it) { // QVariant cannot be compared directly @@ -45,21 +45,6 @@ namespace BlackMisc return true; } - bool operator!=(const CPropertyIndexVariantMap &indexMap, const CVariant &variant) - { - return !(indexMap == variant); - } - - bool operator==(const CVariant &variant, const CPropertyIndexVariantMap &valueMap) - { - return valueMap == variant; - } - - bool operator!=(const CVariant &variant, const CPropertyIndexVariantMap &valueMap) - { - return !(valueMap == variant); - } - QString CPropertyIndexVariantMap::convertToQString(bool i18n) const { if (this->isEmpty()) return QString("{wildcard: %1}").arg(this->m_wildcard ? "true" : "false"); diff --git a/src/blackmisc/propertyindexvariantmap.h b/src/blackmisc/propertyindexvariantmap.h index 2ad9ea3b7..f0a04539a 100644 --- a/src/blackmisc/propertyindexvariantmap.h +++ b/src/blackmisc/propertyindexvariantmap.h @@ -178,37 +178,11 @@ namespace BlackMisc //! Equal operator, required if maps are directly compared, not with CValueObject BLACKMISC_EXPORT friend bool operator !=(const CPropertyIndexVariantMap &a, const CPropertyIndexVariantMap &b); - //! Operator == with CVariant - BLACKMISC_EXPORT friend bool operator ==(const CPropertyIndexVariantMap &valueMap, const CVariant &variant); + //! True if this map matches the value contained in the variant + bool matchesVariant(const CVariant &value) const; - //! Operator != with CVariant - BLACKMISC_EXPORT friend bool operator !=(const CPropertyIndexVariantMap &valueMap, const CVariant &variant); - - //! Operator == with CVariant - BLACKMISC_EXPORT friend bool operator ==(const CVariant &variant, const CPropertyIndexVariantMap &valueMap); - - //! Operator != with CVariant - BLACKMISC_EXPORT friend bool operator !=(const CVariant &variant, const CPropertyIndexVariantMap &valueMap); - - //! Operator == with CValueObject - //! \todo Still needed? - template ::Defined>::type> - friend bool operator ==(const CPropertyIndexVariantMap &valueMap, const T &valueObject) { return valueMap == CVariant::from(valueObject); } - - //! Operator != with CValueObject - //! \todo Still needed? - template ::Defined>::type> - friend bool operator !=(const CPropertyIndexVariantMap &valueMap, const T &valueObject) { return valueMap != CVariant::from(valueObject); } - - //! Operator == with CValueObject - //! \todo Still needed? - template ::Defined>::type> - friend bool operator ==(const T &valueObject, const CPropertyIndexVariantMap &valueMap) { return valueMap == CVariant::from(valueObject); } - - //! Operator != with CValueObject - //! \todo Still needed? - template ::Defined>::type> - friend bool operator !=(const T &valueObject, const CPropertyIndexVariantMap &valueMap) { return valueMap != CVariant::from(valueObject); } + //! True if this map matches the value + template bool matches(const T &value) const { return matchesVariant(CVariant::from(value)); } //! Map const QMap &map() const { return this->m_values; } @@ -302,6 +276,12 @@ namespace BlackMisc } } // Mixin + template + bool Predicates::Private::Matches::operator()(const T &value) const + { + return m_map.matches(value); + } + } Q_DECLARE_METATYPE(BlackMisc::CPropertyIndexVariantMap) diff --git a/tests/blackmisc/testvariantandmap.cpp b/tests/blackmisc/testvariantandmap.cpp index c91dfd449..74bdeab3d 100644 --- a/tests/blackmisc/testvariantandmap.cpp +++ b/tests/blackmisc/testvariantandmap.cpp @@ -100,9 +100,9 @@ namespace BlackMiscTest // compare - QVERIFY2(vmWildcard == station1, "Station should be equal to wildcard"); - QVERIFY2(station1 != vmNoWildcard, "Station should not be equal to empty list"); - QVERIFY2(station1 == vm, "Controller should match"); + QVERIFY2(vmWildcard.matches(station1), "Station should be equal to wildcard"); + QVERIFY2(!vmNoWildcard.matches(station1), "Station should not be equal to empty list"); + QVERIFY2(vm.matches(station1), "Controller should match"); QVERIFY2(vmWildcard == vmCopy, "Maps should be equal"); QVERIFY2(qHash(vmWildcard) == qHash(vmCopy), "Hashs should be equal (simple)");