#pragma once #include "core/os/mutex.h" #include "core/object/ref_counted.h" template class ResourceAccess final { public: ResourceAccess(T& resource, LockT& lock) : Resource{ resource } , Lock{ lock } { Lock.lock(); } ~ResourceAccess() { if (validLock) Lock.unlock(); } ResourceAccess(const ResourceAccess& other) = delete; ResourceAccess& operator=(const ResourceAccess& other) = delete; ResourceAccess& operator=(ResourceAccess&& other) noexcept = delete; ResourceAccess(ResourceAccess&& other) noexcept : Resource{ other.Resource } , Lock{ other.Lock } , validLock{ true } { other.validLock = false; } public: T& GetResource() { return Resource; } T* operator->() { return &Resource; } private: T& Resource; LockT& Lock; bool validLock{ true }; };