aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/common/valuelocker.h
blob: a7575069c2bb16e208fd589ced66581192914e3d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef VALUELOCKER_H
#define VALUELOCKER_H

/**
 * ValueLocker is similar to QMutexLocker, but it's not intended for multithreaded locks.
 * It's rather for event loop locking.
 * It can be created as local scope variable with a pointer to member variable.
 * It will set "unlockedValue" to that variable once the locker is destroyed (goes out of scope).
 * Usually the variable used will be of boolean type, but it can be virtually any other type.
 * You can also provide initial value for locked state. Otherwise you will need to set the locked
 * by yourself before the lock is created.
 */
template <class T>
class ValueLocker {
    public:
        ValueLocker(T* valueToLock, const T& lockedValue, const T& unlockedValue);
        ValueLocker(T* valueToLock, const T& unlockedValue);
        ~ValueLocker();

    private:
        T* valueToLock;
        T unlockedValue;
};

template<class T>
ValueLocker<T>::ValueLocker(T *valueToLock, const T &lockedValue, const T &unlockedValue) :
    ValueLocker(valueToLock, unlockedValue)
{
    *valueToLock = lockedValue;
}

template<class T>
ValueLocker<T>::ValueLocker(T *valueToLock, const T &unlockedValue) :
    valueToLock(valueToLock), unlockedValue(unlockedValue)
{
}

template<class T>
ValueLocker<T>::~ValueLocker()
{
    *valueToLock = unlockedValue;
}

#endif // VALUELOCKER_H