]>
Dogcows Code - chaz/openbox/blob - src/timer.hh
1 // -*- mode: C++; indent-tabs-mode: nil; -*-
2 #ifndef _BLACKBOX_Timer_hh
3 #define _BLACKBOX_Timer_hh
6 #ifdef TIME_WITH_SYS_TIME
9 #else // !TIME_WITH_SYS_TIME
10 # ifdef HAVE_SYS_TIME_H
11 # include <sys/time.h>
12 # else // !HAVE_SYS_TIME_H
14 # endif // HAVE_SYS_TIME_H
15 #endif // TIME_WITH_SYS_TIME
24 // forward declaration
25 class TimerQueueManager
;
27 class TimeoutHandler
{
29 virtual void timeout(void) = 0;
34 TimerQueueManager
*manager
;
35 TimeoutHandler
*handler
;
38 timeval _start
, _timeout
;
40 BTimer(const BTimer
&);
41 BTimer
& operator=(const BTimer
&);
44 BTimer(TimerQueueManager
*m
, TimeoutHandler
*h
);
45 virtual ~BTimer(void);
47 void fireTimeout(void);
49 inline bool isTiming(void) const { return timing
; }
50 inline bool isRecurring(void) const { return recur
; }
52 inline const timeval
&getTimeout(void) const { return _timeout
; }
53 inline const timeval
&getStartTime(void) const { return _start
; }
55 timeval
timeRemaining(const timeval
&tm
) const;
56 bool shouldFire(const timeval
&tm
) const;
57 timeval
endpoint(void) const;
59 inline void recurring(bool b
) { recur
= b
; }
61 void setTimeout(long t
);
62 void setTimeout(const timeval
&t
);
64 void start(void); // manager acquires timer
65 void stop(void); // manager releases timer
66 void halt(void); // halts the timer
68 bool operator<(const BTimer
& other
) const
69 { return shouldFire(other
.endpoint()); }
73 template <class _Tp
, class _Sequence
, class _Compare
>
74 class _timer_queue
: protected std::priority_queue
<_Tp
, _Sequence
, _Compare
> {
76 typedef std::priority_queue
<_Tp
, _Sequence
, _Compare
> _Base
;
78 _timer_queue(void): _Base() {}
79 ~_timer_queue(void) {}
81 void release(const _Tp
& value
) {
82 c
.erase(std::remove(c
.begin(), c
.end(), value
), c
.end());
83 // after removing the item we need to make the heap again
84 std::make_heap(c
.begin(), c
.end(), comp
);
86 bool empty(void) const { return _Base::empty(); }
87 size_t size(void) const { return _Base::size(); }
88 void push(const _Tp
& value
) { _Base::push(value
); }
89 void pop(void) { _Base::pop(); }
90 const _Tp
& top(void) const { return _Base::top(); }
93 _timer_queue(const _timer_queue
&) {}
94 _timer_queue
& operator=(const _timer_queue
&) {}
97 struct TimerLessThan
{
98 bool operator()(const BTimer
* const l
, const BTimer
* const r
) const {
103 typedef _timer_queue
<BTimer
*, std::vector
<BTimer
*>, TimerLessThan
> TimerQueue
;
105 class TimerQueueManager
{
107 virtual void addTimer(BTimer
* timer
) = 0;
108 virtual void removeTimer(BTimer
* timer
) = 0;
113 #endif // _BLACKBOX_Timer_hh
This page took 0.043018 seconds and 5 git commands to generate.