#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; };