|
|
@ -9,25 +9,8 @@ |
|
|
|
|
|
|
|
|
namespace Common { |
|
|
namespace Common { |
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Wraps an object, only allowing access to it via a locking reference wrapper. Good to ensure no |
|
|
|
|
|
* one forgets to lock a mutex before acessing an object. To access the wrapped object construct a |
|
|
|
|
|
* SyncronizedRef on this wrapper. Inspired by Rust's Mutex type |
|
|
|
|
|
* (http://doc.rust-lang.org/std/sync/struct.Mutex.html). |
|
|
|
|
|
*/ |
|
|
|
|
|
template <typename T> |
|
|
template <typename T> |
|
|
class SynchronizedWrapper { |
|
|
|
|
|
public: |
|
|
|
|
|
template <typename... Args> |
|
|
|
|
|
SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {} |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
template <typename U> |
|
|
|
|
|
friend class SynchronizedRef; |
|
|
|
|
|
|
|
|
|
|
|
std::mutex mutex; |
|
|
|
|
|
T data; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
class SynchronizedWrapper; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Synchronized reference, that keeps a SynchronizedWrapper's mutex locked during its lifetime. This |
|
|
* Synchronized reference, that keeps a SynchronizedWrapper's mutex locked during its lifetime. This |
|
|
@ -75,4 +58,28 @@ private: |
|
|
SynchronizedWrapper<T>* wrapper; |
|
|
SynchronizedWrapper<T>* wrapper; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Wraps an object, only allowing access to it via a locking reference wrapper. Good to ensure no |
|
|
|
|
|
* one forgets to lock a mutex before acessing an object. To access the wrapped object construct a |
|
|
|
|
|
* SyncronizedRef on this wrapper. Inspired by Rust's Mutex type |
|
|
|
|
|
* (http://doc.rust-lang.org/std/sync/struct.Mutex.html). |
|
|
|
|
|
*/ |
|
|
|
|
|
template <typename T> |
|
|
|
|
|
class SynchronizedWrapper { |
|
|
|
|
|
public: |
|
|
|
|
|
template <typename... Args> |
|
|
|
|
|
SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {} |
|
|
|
|
|
|
|
|
|
|
|
SynchronizedRef<T> Lock() { |
|
|
|
|
|
return {*this}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
template <typename U> |
|
|
|
|
|
friend class SynchronizedRef; |
|
|
|
|
|
|
|
|
|
|
|
std::mutex mutex; |
|
|
|
|
|
T data; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
} // namespace Common |
|
|
} // namespace Common |