41 lines
819 B
C++
41 lines
819 B
C++
#pragma once
|
|
|
|
#include "core/os/mutex.h"
|
|
#include "core/object/ref_counted.h"
|
|
|
|
template <typename T, typename LockT>
|
|
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 };
|
|
}; |