mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-07 03:54:40 +00:00
ed73d130f9
Use LRU modification to hold currently used items. Use RecastMesh binary data for item key. Store original pointer of btCollisionShape in user pointer to make available it as an identifier within all duplicates. Use pointer to heights data array for btHeightfieldTerrainShape.
110 lines
2.4 KiB
C++
110 lines
2.4 KiB
C++
#ifndef OPENMW_COMPONENTS_MISC_GUARDED_H
|
|
#define OPENMW_COMPONENTS_MISC_GUARDED_H
|
|
|
|
#include <mutex>
|
|
#include <memory>
|
|
|
|
namespace Misc
|
|
{
|
|
template <class T>
|
|
class Locked
|
|
{
|
|
public:
|
|
Locked(std::mutex& mutex, T& value)
|
|
: mLock(mutex), mValue(value)
|
|
{}
|
|
|
|
T& get() const
|
|
{
|
|
return mValue.get();
|
|
}
|
|
|
|
T* operator ->() const
|
|
{
|
|
return std::addressof(get());
|
|
}
|
|
|
|
T& operator *() const
|
|
{
|
|
return get();
|
|
}
|
|
|
|
private:
|
|
std::unique_lock<std::mutex> mLock;
|
|
std::reference_wrapper<T> mValue;
|
|
};
|
|
|
|
template <class T>
|
|
class ScopeGuarded
|
|
{
|
|
public:
|
|
ScopeGuarded() = default;
|
|
|
|
ScopeGuarded(const T& value)
|
|
: mValue(value)
|
|
{}
|
|
|
|
ScopeGuarded(T&& value)
|
|
: mValue(std::move(value))
|
|
{}
|
|
|
|
template <class ... Args>
|
|
ScopeGuarded(Args&& ... args)
|
|
: mValue(std::forward<Args>(args) ...)
|
|
{}
|
|
|
|
ScopeGuarded(const ScopeGuarded& other)
|
|
: mMutex()
|
|
, mValue(other.lock().get())
|
|
{}
|
|
|
|
ScopeGuarded(ScopeGuarded&& other)
|
|
: mMutex()
|
|
, mValue(std::move(other.lock().get()))
|
|
{}
|
|
|
|
Locked<T> lock()
|
|
{
|
|
return Locked<T>(mMutex, mValue);
|
|
}
|
|
|
|
Locked<const T> lockConst()
|
|
{
|
|
return Locked<const T>(mMutex, mValue);
|
|
}
|
|
|
|
private:
|
|
std::mutex mMutex;
|
|
T mValue;
|
|
};
|
|
|
|
template <class T>
|
|
class SharedGuarded
|
|
{
|
|
public:
|
|
SharedGuarded()
|
|
: mMutex(std::make_shared<std::mutex>())
|
|
{}
|
|
|
|
SharedGuarded(std::shared_ptr<T> value)
|
|
: mMutex(std::make_shared<std::mutex>()), mValue(std::move(value))
|
|
{}
|
|
|
|
Locked<T> lock() const
|
|
{
|
|
return Locked<T>(*mMutex, *mValue);
|
|
}
|
|
|
|
Locked<const T> lockConst() const
|
|
{
|
|
return Locked<const T>(*mMutex, *mValue);
|
|
}
|
|
|
|
private:
|
|
std::shared_ptr<std::mutex> mMutex;
|
|
std::shared_ptr<T> mValue;
|
|
};
|
|
}
|
|
|
|
#endif
|