libboxes
boxes is a set of specialised containers built on top of STL
util.hpp
1#ifndef __BOXES_UTIL_HPP__
2#define __BOXES_UTIL_HPP__
3
4#include <boxes/compiler.hpp>
5
6namespace boxes::util {
7
8template <typename LockableT, typename FuncT>
9void withoutLock(LockableT &lockable, FuncT f) {
10 lockable.unlock();
11 f();
12 lockable.lock();
13}
14
15template <typename LockableT, typename T> class UniqueAccess {
16 class Guard;
17
18public:
19 template <typename... Args>
20 UniqueAccess(Args &&...args) : data{std::forward<Args>(args)...} {}
21
22 Guard operator*() { return Guard(*this); }
23
24 Guard operator*() const { return Guard(*this); }
25
26private:
27 LockableT lockable;
28 T data;
29
30 class Guard {
31 public:
32 Guard(UniqueAccess &uniqueAccess)
33 : uniqueAccess(uniqueAccess), lock(uniqueAccess.lockable) {}
34
35 operator T &() { return uniqueAccess.data; }
36
37 operator const T &() const { return uniqueAccess.data; }
38
39 Guard &operator=(const T &data) {
40 uniqueAccess.data = data;
41 return *this;
42 }
43
44 bool operator==(const T &data) const BOXES_NOTHROW {
45 return uniqueAccess.data == data;
46 }
47
48 private:
49 UniqueAccess &uniqueAccess;
50 std::unique_lock<LockableT> lock;
51 };
52};
53
54template <typename LockableT, typename T> auto withUniqueAccess(T &&data) {
55 return UniqueAccess<LockableT, T>(std::forward<T>(data));
56}
57
58} // namespace boxes::util
59
60#endif // __BOXES_UTIL_HPP__