|
|
|
@ -20,19 +20,22 @@ concept KLockable = !std::is_reference_v<T> && requires(T & t) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
requires KLockable<T> class KScopedLock {
|
|
|
|
|
requires KLockable<T> class [[nodiscard]] KScopedLock {
|
|
|
|
|
public:
|
|
|
|
|
explicit KScopedLock(T* l) : lock_ptr(l) {
|
|
|
|
|
explicit KScopedLock(T * l) : lock_ptr(l) {
|
|
|
|
|
this->lock_ptr->Lock();
|
|
|
|
|
}
|
|
|
|
|
explicit KScopedLock(T& l) : KScopedLock(std::addressof(l)) { /* ... */
|
|
|
|
|
}
|
|
|
|
|
explicit KScopedLock(T & l) : KScopedLock(std::addressof(l)) {}
|
|
|
|
|
|
|
|
|
|
~KScopedLock() {
|
|
|
|
|
this->lock_ptr->Unlock();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
KScopedLock(const KScopedLock&) = delete;
|
|
|
|
|
KScopedLock(KScopedLock&&) = delete;
|
|
|
|
|
KScopedLock& operator=(const KScopedLock&) = delete;
|
|
|
|
|
|
|
|
|
|
KScopedLock(KScopedLock &&) = delete;
|
|
|
|
|
KScopedLock& operator=(KScopedLock&&) = delete;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
T* lock_ptr;
|
|
|
|
|