Plasma Engine  2.0
Loading...
Searching...
No Matches
LockedObject.h
1#pragma once
2
5template <typename T, typename O>
7{
8public:
9 PL_ALWAYS_INLINE explicit plLockedObject(T& ref_lock, O* pObject)
10 : m_pLock(&ref_lock)
11 , m_pObject(pObject)
12 {
13 m_pLock->Lock();
14 }
15
16 plLockedObject() = default;
17
18 PL_ALWAYS_INLINE plLockedObject(plLockedObject<T, O>&& rhs) { *this = std::move(rhs); }
19
20 plLockedObject(const plLockedObject<T, O>& rhs) = delete;
21
22 void operator=(const plLockedObject<T, O>&& rhs)
23 {
24 if (m_pLock)
25 {
26 m_pLock->Unlock();
27 }
28
29 m_pLock = rhs.m_pLock;
30 rhs.m_pLock = nullptr;
31 m_pObject = rhs.m_pObject;
32 rhs.m_pObject = nullptr;
33 }
34
35 void operator=(const plLockedObject<T, O>& rhs) = delete;
36
37 PL_ALWAYS_INLINE ~plLockedObject()
38 {
39 if (m_pLock)
40 {
41 m_pLock->Unlock();
42 }
43 }
44
46 PL_ALWAYS_INLINE bool isValid() const { return m_pObject != nullptr; }
47
48 O* Borrow() { return m_pObject; }
49
50 const O* Borrow() const { return m_pObject; }
51
52 O* operator->() { return m_pObject; }
53
54 const O* operator->() const { return m_pObject; }
55
56 O& operator*() { return *m_pObject; }
57
58 const O& operator*() const { return *m_pObject; }
59
60 bool operator==(const O* rhs) const { return m_pObject == rhs; }
61
62 bool operator!=(const O* rhs) const { return m_pObject != rhs; }
63
64 bool operator!() const { return m_pObject == nullptr; }
65
66 operator bool() const { return m_pObject != nullptr; }
67
68private:
69 mutable T* m_pLock = nullptr;
70 mutable O* m_pObject = nullptr;
71};
Provides access to an object while managing a lock (e.g. a mutex) that ensures that during its lifeti...
Definition LockedObject.h:7
PL_ALWAYS_INLINE bool isValid() const
Whether the encapsulated object exists at all or is nullptr.
Definition LockedObject.h:46