Program Listing for File locked_reference.hpp
↰ Return to documentation for file (include/data_tamer/details/locked_reference.hpp
)
#pragma once
#include "data_tamer/details/mutex.hpp"
#include <utility>
namespace DataTamer
{
template <typename T>
class LockedPtr
{
public:
LockedPtr(T* obj, Mutex* mutex);
LockedPtr(const LockedPtr&) = delete;
LockedPtr& operator=(const LockedPtr&) = delete;
LockedPtr(LockedPtr&&);
LockedPtr& operator=(LockedPtr&&);
~LockedPtr();
operator bool() const { return obj_ != nullptr; }
T& operator*() { return *obj_; }
T* operator->() { return obj_; }
private:
T* obj_ = nullptr;
Mutex* mutex_ = nullptr;
};
//----------------------------------------------------
//----------------------------------------------------
//----------------------------------------------------
template <typename T>
inline LockedPtr<T>::LockedPtr(T* obj, Mutex* mutex) : obj_(obj), mutex_(mutex)
{
if(mutex_)
{
mutex_->lock();
}
}
template <typename T>
inline LockedPtr<T>::LockedPtr(LockedPtr&& other) : mutex_(other.mutex_)
{
std::swap(obj_, other.obj_);
}
template <typename T>
inline LockedPtr<T>& LockedPtr<T>::operator=(LockedPtr<T>&& other)
{
mutex_ = &other.mutex_;
std::swap(obj_, other.obj_);
return *this;
}
template <typename T>
inline LockedPtr<T>::~LockedPtr()
{
if(mutex_)
{
mutex_->unlock();
}
}
} // namespace DataTamer