#pragma once #include template class Condition { public: std::mutex m_mutex; std::condition_variable m_condition; ~Condition() { m_condition.notify_all(); } void notify(std::unique_ptr data) noexcept { { std::lock_guard eventLock(m_mutex); any.swap(data); } // wake up one waiter m_condition.notify_one(); }; std::unique_ptr wait(unsigned timeout=0) { std::unique_lock ul(m_mutex); if (!timeout) { m_condition.wait(ul,[&]() { if (!any) return false; return true; }); } else{ if(!any){ std::cv_status status = m_condition.wait_for(ul, std::chrono::milliseconds(timeout)); if (status == std::cv_status::timeout) { return {}; } } } return std::unique_ptr(any.release()); } private: std::unique_ptr any; };