From eb6a638099622ed1f5fce0c6620cf4e132b92b16 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sat, 19 Sep 2015 16:04:09 +0100 Subject: [PATCH] refs #467 Made CLogPattern hashable (so it can be used in QSet). --- src/blackmisc/logpattern.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/blackmisc/logpattern.h b/src/blackmisc/logpattern.h index f25b2b29a..8b2dd75a9 100644 --- a/src/blackmisc/logpattern.h +++ b/src/blackmisc/logpattern.h @@ -15,6 +15,7 @@ #include "blackmiscexport.h" #include "statusmessage.h" #include +#include namespace BlackMisc { @@ -85,6 +86,15 @@ namespace BlackMisc //! \copydoc CValueObject::marshallFromDbus() void unmarshallFromDbus(const QDBusArgument &argument); + //! \copydoc CValueObject::qHash + //! \todo Use Mixin::HashByTuple when Qt 5.5 is baseline (qHash(QSet) was added in Qt 5.5). + friend uint qHash(const CLogPattern &p, uint seed = 0) + { + seed = std::accumulate(p.m_severities.begin(), p.m_severities.end(), seed, [](uint i, CStatusMessage::StatusSeverity s) { return i + (1 << static_cast(s)); }); + seed ^= std::accumulate(p.m_strings.begin(), p.m_strings.end(), 0, [](uint i, const QString &s) { return i + qHash(s); }); + return qHash(static_cast(p.m_strategy), seed); + } + private: bool checkInvariants() const; @@ -116,9 +126,9 @@ namespace BlackMisc Q_DECLARE_METATYPE(BlackMisc::CLogPattern) BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::CLogPattern, ( - attr(o.m_severities, flags()), + attr(o.m_severities), attr(o.m_strategy), - attr(o.m_strings, flags()) + attr(o.m_strings) )) #endif