Add util::event_loop executor

This commit is contained in:
Nikita Lisitsa 2020-11-19 23:49:18 +03:00
parent daf1a3c5f4
commit 9fa32c2dd1
2 changed files with 68 additions and 0 deletions

View file

@ -0,0 +1,32 @@
#pragma once
#include <psemek/util/executor.hpp>
#include <deque>
namespace psemek::util
{
struct event_loop
: executor
{
void post(task t) override;
void stop() override {}
void wait() override;
void wait_for(clock::duration period) override;
void wait_until(clock::time_point time) override;
std::size_t task_count() const override { return task_queue_.size(); }
~event_loop() override { stop(); }
private:
std::deque<task> task_queue_;
};
}

View file

@ -0,0 +1,36 @@
#include <psemek/util/event_loop.hpp>
namespace psemek::util
{
void event_loop::post(task t)
{
task_queue_.push_back(std::move(t));
}
void event_loop::wait()
{
while (!task_queue_.empty())
{
auto t = std::move(task_queue_.front());
task_queue_.pop_front();
t();
}
}
void event_loop::wait_for(clock::duration period)
{
wait_until(clock::now() + period);
}
void event_loop::wait_until(clock::time_point time)
{
while (!task_queue_.empty() && clock::now() < time)
{
auto t = std::move(task_queue_.front());
task_queue_.pop_front();
t();
}
}
}