Warning, file /graphics/krita/sdk/tests/KisRectsCollisionsTracker.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef KISRECTSCOLLISIONSTRACKER_H
0008 #define KISRECTSCOLLISIONSTRACKER_H
0009 
0010 #include <QList>
0011 #include <QRect>
0012 #include <QMutex>
0013 #include <QMutexLocker>
0014 
0015 #include "kis_assert.h"
0016 
0017 
0018 class KisRectsCollisionsTracker
0019 {
0020 public:
0021 
0022     void startAccessingRect(const QRect &rc) {
0023         QMutexLocker l(&m_mutex);
0024 
0025         checkUniqueAccessImpl(rc, "start");
0026         m_rectsInProgress.append(rc);
0027     }
0028 
0029     void endAccessingRect(const QRect &rc) {
0030         QMutexLocker l(&m_mutex);
0031         const bool result = m_rectsInProgress.removeOne(rc);
0032         KIS_SAFE_ASSERT_RECOVER_NOOP(result);
0033         checkUniqueAccessImpl(rc, "end");
0034     }
0035 
0036 private:
0037 
0038     bool checkUniqueAccessImpl(const QRect &rect, const QString &tag) {
0039 
0040         Q_FOREACH (const QRect &rc, m_rectsInProgress) {
0041             if (rc != rect && rect.intersects(rc)) {
0042                 ENTER_FUNCTION() << "FAIL: concurrent access from" << rect << "to" << rc << tag;
0043                 return false;
0044             }
0045         }
0046 
0047         return true;
0048     }
0049 
0050 private:
0051     QList<QRect> m_rectsInProgress;
0052     QMutex m_mutex;
0053 };
0054 
0055 #endif // KISRECTSCOLLISIONSTRACKER_H