// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include namespace Kernel { template concept KLockable = ! std::is_reference_v&& requires(T& t) { { t.Lock() } -> std::same_as; { t.Unlock() } -> std::same_as; }; template requires KLockable class [[nodiscard]] KScopedLock { public: explicit KScopedLock(T* l) : lock_ptr(l) { this->lock_ptr->Lock(); } explicit KScopedLock(T& l) : KScopedLock(std::addressof(l)) {} ~KScopedLock() { this->lock_ptr->Unlock(); } KScopedLock(const KScopedLock&) = delete; KScopedLock& operator=(const KScopedLock&) = delete; KScopedLock(KScopedLock&&) = delete; KScopedLock& operator=(KScopedLock&&) = delete; private: T* lock_ptr; }; } // namespace Kernel