modernize: Pass arguments by value and move in constructors
[quassel.git] / src / common / highlightrulemanager.h
index cabf0d2..5a2d4a8 100644 (file)
@@ -20,6 +20,8 @@
 
 #pragma once
 
+#include "common-export.h"
+
 #include <utility>
 
 #include <QString>
 
 #include "expressionmatch.h"
 #include "message.h"
+#include "nickhighlightmatcher.h"
 #include "syncableobject.h"
 
-class HighlightRuleManager : public SyncableObject
+class COMMON_EXPORT HighlightRuleManager : public SyncableObject
 {
-    SYNCABLE_OBJECT
     Q_OBJECT
+    SYNCABLE_OBJECT
 
     Q_PROPERTY(int highlightNick READ highlightNick WRITE setHighlightNick)
     Q_PROPERTY(bool nicksCaseSensitive READ nicksCaseSensitive WRITE setNicksCaseSensitive)
@@ -52,7 +55,7 @@ public:
     /**
      * Individual highlight rule
      */
-    class HighlightRule
+    class COMMON_EXPORT HighlightRule
     {
     public:
         /**
@@ -74,8 +77,8 @@ public:
          */
         HighlightRule(int id, QString contents, bool isRegEx, bool isCaseSensitive, bool isEnabled,
                       bool isInverse, QString sender, QString chanName)
-            : _id(id), _contents(contents), _isRegEx(isRegEx), _isCaseSensitive(isCaseSensitive),
-              _isEnabled(isEnabled), _isInverse(isInverse), _sender(sender), _chanName(chanName)
+            : _id(id), _contents(std::move(contents)), _isRegEx(isRegEx), _isCaseSensitive(isCaseSensitive),
+              _isEnabled(isEnabled), _isInverse(isInverse), _sender(std::move(sender)), _chanName(std::move(chanName))
         {
             _cacheInvalid = true;
             // Cache expression matches on construction
@@ -364,7 +367,10 @@ public slots:
 
     inline void setHighlightNick(int highlightNick) {
         _highlightNick = static_cast<HighlightNickType>(highlightNick);
-        _cacheNickConfigInvalid = true;
+        // Convert from HighlightRuleManager::HighlightNickType to
+        // NickHighlightMatcher::HighlightNickType
+        _nickMatcher.setHighlightMode(
+                    static_cast<NickHighlightMatcher::HighlightNickType>(_highlightNick));
     }
 
     virtual inline void requestSetNicksCaseSensitive(bool nicksCaseSensitive)
@@ -374,49 +380,42 @@ public slots:
 
     inline void setNicksCaseSensitive(bool nicksCaseSensitive) {
         _nicksCaseSensitive = nicksCaseSensitive;
-        _cacheNickConfigInvalid = true;
+        // Update nickname matcher, too
+        _nickMatcher.setCaseSensitive(nicksCaseSensitive);
+    }
+
+    /**
+     * Network removed from system
+     *
+     * Handles cleaning up cache from stale networks.
+     *
+     * @param id Network ID of removed network
+     */
+    inline void networkRemoved(NetworkId id) {
+        // Clean up nickname matching cache
+        _nickMatcher.removeNetwork(id);
     }
 
 protected:
     void setHighlightRuleList(const QList<HighlightRule> &HighlightRuleList) { _highlightRuleList = HighlightRuleList; }
 
-    bool match(const QString &msgContents,
+    bool match(const NetworkId &netId,
+               const QString &msgContents,
                const QString &msgSender,
                Message::Type msgType,
                Message::Flags msgFlags,
                const QString &bufferName,
                const QString &currentNick,
-               const QStringList identityNicks);
+               const QStringList &identityNicks);
 
 signals:
     void ruleAdded(QString name, bool isRegEx, bool isCaseSensitive, bool isEnabled, bool isInverse, QString sender, QString chanName);
 
 private:
-    /**
-     * Update internal cache of expression matching if needed
-     */
-    void determineNickExpressions(const QString &currentNick,
-                                  const QStringList identityNicks) const;
+    HighlightRuleList _highlightRuleList = {}; ///< Custom highlight rule list
+    NickHighlightMatcher _nickMatcher = {};    ///< Nickname highlight matcher
 
-    /**
-     * Check if nickname matching cache is invalid
-     * @param currentNick
-     * @param identityNicks
-     * @return
-     */
-    bool cacheNickInvalid(const QString &currentNick, const QStringList identityNicks) const {
-        if (_cacheNickConfigInvalid) return true;
-        if (_cachedNickCurrent != currentNick) return true;
-        if (_cachedIdentityNicks != identityNicks) return true;
-    }
-
-    HighlightRuleList _highlightRuleList;
+    /// Nickname highlighting mode
     HighlightNickType _highlightNick = HighlightNickType::CurrentNick;
-    bool _nicksCaseSensitive = false;
-
-    // These represent internal cache and should be safe to mutate in 'const' functions
-    mutable bool _cacheNickConfigInvalid = true;     ///< If true, nick match cache needs redone
-    mutable QString _cachedNickCurrent = {};         ///< Last cached current nick
-    mutable QStringList _cachedIdentityNicks = {};   ///< Last cached identity nicks
-    mutable ExpressionMatch _cachedNickMatcher = {}; ///< Expression match cache for nicks
+    bool _nicksCaseSensitive = false; ///< If true, match nicknames with exact case
 };