summaryrefslogtreecommitdiff
path: root/otk/timerqueue.hh
diff options
context:
space:
mode:
Diffstat (limited to 'otk/timerqueue.hh')
-rw-r--r--otk/timerqueue.hh52
1 files changed, 52 insertions, 0 deletions
diff --git a/otk/timerqueue.hh b/otk/timerqueue.hh
new file mode 100644
index 00000000..f9237a67
--- /dev/null
+++ b/otk/timerqueue.hh
@@ -0,0 +1,52 @@
+// -*- mode: C++; indent-tabs-mode: nil; -*-
+#ifndef __timerqueue_hh
+#define __timerqueue_hh
+
+#ifndef DOXYGEN_IGNORE
+
+#include "timer.hh"
+
+#include <queue>
+#include <vector>
+#include <algorithm>
+
+namespace otk {
+
+template <class _Tp, class _Sequence, class _Compare>
+class _timer_queue: protected std::priority_queue<_Tp, _Sequence, _Compare> {
+public:
+ typedef std::priority_queue<_Tp, _Sequence, _Compare> _Base;
+
+ _timer_queue(): _Base() {}
+ ~_timer_queue() {}
+
+ void release(const _Tp& value) {
+ c.erase(std::remove(c.begin(), c.end(), value), c.end());
+ // after removing the item we need to make the heap again
+ std::make_heap(c.begin(), c.end(), comp);
+ }
+ bool empty() const { return _Base::empty(); }
+ size_t size() const { return _Base::size(); }
+ void push(const _Tp& value) { _Base::push(value); }
+ void pop() { _Base::pop(); }
+ const _Tp& top() const { return _Base::top(); }
+private:
+ // no copying!
+ _timer_queue(const _timer_queue&) {}
+ _timer_queue& operator=(const _timer_queue&) {}
+};
+
+struct TimerLessThan {
+ bool operator()(const OBTimer* const l, const OBTimer* const r) const {
+ return *r < *l;
+ }
+};
+
+typedef _timer_queue<OBTimer*,
+ std::vector<OBTimer*>, TimerLessThan> TimerQueue;
+
+}
+
+#endif // DOXYGEN_IGNORE
+
+#endif // __timerqueue_hh