all repos — openbox @ 4947902d269213edee40f3f31f97721fa0dd3877

openbox fork - make it a bit more like ryudo

otk/timerqueue.hh (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#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 Timer* const l, const Timer* const r) const {
    return *r < *l;
  }
};

typedef _timer_queue<Timer*, std::vector<Timer*>, TimerLessThan> TimerQueue;

}

#endif // DOXYGEN_IGNORE

#endif // __timerqueue_hh