#pragma once namespace sead { template class ScopedLock { public: ScopedLock(T* lock) : mLocked(lock) { mLocked->lock(); } ScopedLock(const ScopedLock& other) = delete; const ScopedLock& operator=(const ScopedLock& other) = delete; virtual ~ScopedLock() { mLocked->unlock(); } protected: T* mLocked; }; template inline ScopedLock makeScopedLock(T& lock) { return ScopedLock(&lock); } template class ConditionalScopedLock { public: ConditionalScopedLock(T* lock, bool do_lock) { if (!do_lock) return; mLocked = lock; mLocked->lock(); } ConditionalScopedLock(const ConditionalScopedLock& other) = delete; const ConditionalScopedLock& operator=(const ConditionalScopedLock& other) = delete; virtual ~ConditionalScopedLock() { if (mLocked) mLocked->unlock(); } protected: T* mLocked = nullptr; }; template inline ConditionalScopedLock makeScopedLock(T& lock, bool do_lock) { return ConditionalScopedLock(&lock, do_lock); } } // namespace sead