Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAdaptedLock.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef KISADAPTEDLOCK_H
8#define KISADAPTEDLOCK_H
9
10#include <mutex>
11
25template <typename Adapter>
27 : protected Adapter,
28 public std::unique_lock<Adapter>
29{
30public:
31 template<typename Object>
32 KisAdaptedLock(Object object)
33 : Adapter(object)
34 , std::unique_lock<Adapter>(
35 static_cast<Adapter&>(*this))
36 {}
37
38 template<typename Object>
39 KisAdaptedLock(Object object, std::try_to_lock_t t)
40 : Adapter(object)
41 , std::unique_lock<Adapter>(static_cast<Adapter&>(*this), t)
42 {}
43
44 template<typename Object>
45 KisAdaptedLock(Object object, std::defer_lock_t t)
46 : Adapter(object)
47 , std::unique_lock<Adapter>(static_cast<Adapter&>(*this), t)
48 {}
49
50 template<typename Object>
51 KisAdaptedLock(Object object, std::adopt_lock_t t)
52 : Adapter(object)
53 , std::unique_lock<Adapter>(static_cast<Adapter&>(*this), t)
54 {}
55
57 : Adapter(static_cast<Adapter&>(rhs))
58 , std::unique_lock<Adapter>(
59 static_cast<Adapter&>(*this), std::adopt_lock)
60 {
61 rhs.release();
62 }
63
65 {
66 static_cast<Adapter&>(*this) = rhs;
67 static_cast<std::unique_lock<Adapter>&>(*this) =
68 std::unique_lock<Adapter>(static_cast<Adapter&>(*this),
69 std::adopt_lock);
70 rhs.release();
71 return *this;
72 }
73
74 using std::unique_lock<Adapter>::try_lock;
75 using std::unique_lock<Adapter>::lock;
76 using std::unique_lock<Adapter>::unlock;
77 using std::unique_lock<Adapter>::owns_lock;
78};
79
85#define KIS_DECLARE_ADAPTED_LOCK(Name, Adapter) \
86class Name : public KisAdaptedLock<Adapter> \
87{ \
88 public: \
89 using BaseClass = KisAdaptedLock<Adapter>; \
90 using BaseClass::BaseClass; \
91};
92
93#endif // KISADAPTEDLOCK_H
KisAdaptedLock & operator=(KisAdaptedLock &&rhs)
KisAdaptedLock(Object object, std::try_to_lock_t t)
KisAdaptedLock(KisAdaptedLock &&rhs)
KisAdaptedLock(Object object)
KisAdaptedLock(Object object, std::defer_lock_t t)
KisAdaptedLock(Object object, std::adopt_lock_t t)