#pragma once

#include "mutex.hpp"


namespace env
{

class Condition : private noncopyable
{
public:
  Condition();
  ~Condition();

  void Lock() { m_mutex.Lock(); }
  void TryLock() { m_mutex.TryLock(); }
  void Unlock() { m_mutex.Unlock(); }

  void Signal();
  void SignalAll();
  void Wait();

  class Guard
  {
    Condition & m_cond;
  public:
    Guard(Condition & c) : m_cond(c) { m_cond.Lock(); }
    ~Guard() { m_cond.Unlock(); }
  };

private:
  Mutex m_mutex;
  pthread_cond_t m_condition;
};

}