From 9fa32c2dd14041bb761a1dad203f0eb045da5775 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 19 Nov 2020 23:49:18 +0300 Subject: [PATCH] Add util::event_loop executor --- libs/util/include/psemek/util/event_loop.hpp | 32 +++++++++++++++++ libs/util/source/event_loop.cpp | 36 ++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 libs/util/include/psemek/util/event_loop.hpp create mode 100644 libs/util/source/event_loop.cpp diff --git a/libs/util/include/psemek/util/event_loop.hpp b/libs/util/include/psemek/util/event_loop.hpp new file mode 100644 index 00000000..c5ea7048 --- /dev/null +++ b/libs/util/include/psemek/util/event_loop.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include + +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_queue_; + }; + + +} diff --git a/libs/util/source/event_loop.cpp b/libs/util/source/event_loop.cpp new file mode 100644 index 00000000..2064d08a --- /dev/null +++ b/libs/util/source/event_loop.cpp @@ -0,0 +1,36 @@ +#include + +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(); + } + } + +}