diff options
author | Florent Le Coz <louiz@louiz.org> | 2014-05-27 01:12:46 +0200 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2014-05-28 17:31:28 +0200 |
commit | 5999e6e0c32e6897b88f59f0743b4bb1fc9c521c (patch) | |
tree | 7c8523be49b221e5bd0bb5753e8695fae41ecb84 /src/utils/timed_events_manager.cpp | |
parent | e033b6a3ae2923b040eb08cfa5376efe0a3da898 (diff) | |
download | biboumi-5999e6e0c32e6897b88f59f0743b4bb1fc9c521c.tar.gz biboumi-5999e6e0c32e6897b88f59f0743b4bb1fc9c521c.tar.bz2 biboumi-5999e6e0c32e6897b88f59f0743b4bb1fc9c521c.tar.xz biboumi-5999e6e0c32e6897b88f59f0743b4bb1fc9c521c.zip |
Introduce the timed events
Diffstat (limited to 'src/utils/timed_events_manager.cpp')
-rw-r--r-- | src/utils/timed_events_manager.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/utils/timed_events_manager.cpp b/src/utils/timed_events_manager.cpp new file mode 100644 index 0000000..c3e260c --- /dev/null +++ b/src/utils/timed_events_manager.cpp @@ -0,0 +1,55 @@ +#include <utils/timed_events.hpp> + +TimedEventsManager::TimedEventsManager() +{ +} + +TimedEventsManager::~TimedEventsManager() +{ +} + +void TimedEventsManager::add_event(TimedEvent&& event) +{ + for (auto it = this->events.begin(); it != this->events.end(); ++it) + { + if (it->is_after(event)) + { + this->events.emplace(it, std::move(event)); + return; + } + } + this->events.emplace_back(std::move(event)); +} + +std::chrono::milliseconds TimedEventsManager::get_timeout() const +{ + if (this->events.empty()) + return utils::no_timeout; + return this->events.front().get_timeout() + std::chrono::milliseconds(1); +} + +std::size_t TimedEventsManager::execute_expired_events() +{ + std::size_t count = 0; + const auto now = std::chrono::steady_clock::now(); + for (auto it = this->events.begin(); it != this->events.end();) + { + if (!it->is_after(now)) + { + TimedEvent copy(std::move(*it)); + it = this->events.erase(it); + ++count; + copy.execute(); + if (copy.repeat) + { + copy.time_point += copy.repeat_delay; + this->add_event(std::move(copy)); + } + continue; + } + else + break; + } + return count; +} + |