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