-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathshared_resource.hpp
49 lines (45 loc) · 1.38 KB
/
shared_resource.hpp
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
45
46
47
48
49
#pragma once
#include <mutex>
namespace qt_monkey_common
{
template <typename DataType> class SharedResource final
{
public:
struct DataPtrWrapper final {
DataPtrWrapper() = delete;
DataPtrWrapper(const DataPtrWrapper &) = delete;
DataPtrWrapper(DataPtrWrapper &&o)
: resource_(o.resource_), moved_(o.moved_)
{
o.moved_ = true;
}
DataPtrWrapper &operator=(const DataPtrWrapper &) = delete;
~DataPtrWrapper()
{
if (!moved_) {
resource_.dataLock_.unlock();
}
}
DataType *operator->() { return &resource_.data_; }
DataType &operator*() { return resource_.data_; }
private:
SharedResource &resource_;
bool moved_;
friend class SharedResource;
DataPtrWrapper(SharedResource &resource)
: resource_(resource), moved_(false)
{
resource_.dataLock_.lock();
}
};
SharedResource() = default;
explicit SharedResource(const DataType &d) : data_(d) {}
explicit SharedResource(DataType &&d) : data_(std::move(d)) {}
SharedResource &operator=(const SharedResource &) = delete;
SharedResource(const SharedResource &) = delete;
DataPtrWrapper get() { return DataPtrWrapper(*this); }
private:
DataType data_;
std::mutex dataLock_;
};
} // namespace qt_monkey_common