|
4 | 4 |
|
5 | 5 | namespace lockpp |
6 | 6 | { |
7 | | - template <typename T, typename Mutex> |
| 7 | + template <typename T, typename Mutex, template <typename...> typename Wrapper> |
8 | 8 | template <typename... Ts> |
9 | | - lock<T, Mutex>::lock(Ts &&...args) : m_value(std::forward<Ts>(args)...) |
| 9 | + requires std::constructible_from<T, Ts...> |
| 10 | + lock<T, Mutex, Wrapper>::lock(Ts &&...args) : m_value(std::forward<Ts>(args)...) |
10 | 11 | { |
11 | 12 | } |
12 | 13 |
|
13 | | - template <typename T, typename Mutex> |
| 14 | + template <typename T, typename Mutex, template <typename...> typename Wrapper> |
14 | 15 | template <template <typename> class Lock, typename... Ts> |
15 | | - locked<T, Lock<Mutex>> lock<T, Mutex>::write(Ts &&...lock_args) & |
| 16 | + locked<T, Lock<Mutex>> lock<T, Mutex, Wrapper>::write(Ts &&...lock_args) & |
16 | 17 | { |
17 | | - return {&m_value, m_mutex, std::forward<Ts>(lock_args)...}; |
| 18 | + return {&m_value, *m_mutex, std::forward<Ts>(lock_args)...}; |
18 | 19 | } |
19 | 20 |
|
20 | | - template <typename T, typename Mutex> |
21 | | - template <template <typename> class Lock, typename... Ts> |
22 | | - locked<const T, Lock<Mutex>> lock<T, Mutex>::read(Ts &&...lock_args) const & |
| 21 | + template <typename T, typename Mutex, template <typename...> typename Wrapper> |
| 22 | + template <template <typename> class Lock, typename Self, typename... Ts> |
| 23 | + requires std::is_lvalue_reference_v<Self> |
| 24 | + locked<const T, Lock<Mutex>> lock<T, Mutex, Wrapper>::read(this Self &&self, Ts &&...lock_args) |
23 | 25 | { |
24 | | - return {&m_value, m_mutex, std::forward<Ts>(lock_args)...}; |
| 26 | + return {&self.m_value, *std::forward<Self>(self).m_mutex, std::forward<Ts>(lock_args)...}; |
25 | 27 | } |
26 | 28 |
|
27 | | - template <typename T, typename Mutex> |
| 29 | + template <typename T, typename Mutex, template <typename...> typename Wrapper> |
28 | 30 | template <typename O> |
29 | 31 | requires std::assignable_from<T &, O> |
30 | | - void lock<T, Mutex>::assign(O &&value) & |
| 32 | + void lock<T, Mutex, Wrapper>::assign(O &&value) & |
31 | 33 | { |
32 | 34 | auto locked = write(); |
33 | 35 | *locked = std::forward<O>(value); |
34 | 36 | } |
35 | 37 |
|
36 | | - template <typename T, typename Mutex> |
37 | | - T &lock<T, Mutex>::get_unsafe() & |
38 | | - { |
39 | | - return m_value; |
40 | | - } |
41 | | - |
42 | | - template <typename T, typename Mutex> |
43 | | - T &lock<T, Mutex>::get_unsafe() const & |
| 38 | + template <typename T, typename Mutex, template <typename...> typename Wrapper> |
| 39 | + template <typename Self> |
| 40 | + requires std::is_lvalue_reference_v<Self> |
| 41 | + T &lock<T, Mutex, Wrapper>::get_unsafe(this Self &&self) |
44 | 42 | { |
45 | | - return m_value; |
| 43 | + return std::forward<Self>(self).m_value; |
46 | 44 | } |
47 | 45 |
|
48 | | - template <typename T, typename Mutex> |
49 | | - T lock<T, Mutex>::copy() const & |
| 46 | + template <typename T, typename Mutex, template <typename...> typename Wrapper> |
| 47 | + template <typename Self> |
| 48 | + requires std::is_lvalue_reference_v<Self> and std::copyable<T> |
| 49 | + T lock<T, Mutex, Wrapper>::copy(this Self &&self) |
50 | 50 | { |
51 | | - auto locked = read(); |
| 51 | + auto locked = std::forward<Self>(self).read(); |
52 | 52 | return *locked; |
53 | 53 | } |
54 | 54 | } // namespace lockpp |
0 commit comments