Clean up callbacks
base/callback.hh: Don't remove a callback when it is processed. Document the callback class --HG-- extra : convert_revision : 9d15500434fe0e5d623c624aac86976708adf0eb
This commit is contained in:
parent
e0b065ff7c
commit
df488c0e70
1 changed files with 59 additions and 9 deletions
|
@ -31,26 +31,76 @@
|
|||
|
||||
#include <list>
|
||||
|
||||
class Callback {
|
||||
/**
|
||||
* Generic callback class. This base class provides a virutal process
|
||||
* function that gets called when the callback queue is processed.
|
||||
*/
|
||||
class Callback
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* virtualize the destructor to make sure that the correct one
|
||||
* gets called.
|
||||
*/
|
||||
virtual ~Callback() {}
|
||||
|
||||
/**
|
||||
* virtual process function that is invoked when the callback
|
||||
* queue is executed.
|
||||
*/
|
||||
virtual void process() = 0;
|
||||
};
|
||||
|
||||
class CallbackQueue
|
||||
{
|
||||
protected:
|
||||
std::list<Callback *> callbacks;
|
||||
/**
|
||||
* Simple typedef for the data structure that stores all of the
|
||||
* callbacks.
|
||||
*/
|
||||
typedef std::list<Callback *> queue;
|
||||
|
||||
/**
|
||||
* List of all callbacks. To be called in fifo order.
|
||||
*/
|
||||
queue callbacks;
|
||||
|
||||
public:
|
||||
void add(Callback *callback) { callbacks.push_back(callback); }
|
||||
bool empty() const { return callbacks.empty(); }
|
||||
void processOne() {
|
||||
Callback *c = callbacks.front();
|
||||
callbacks.pop_front();
|
||||
c->process();
|
||||
/**
|
||||
* Add a callback to the end of the queue
|
||||
* @param callback the callback to be added to the queue
|
||||
*/
|
||||
void add(Callback *callback)
|
||||
{
|
||||
callbacks.push_back(callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find out if there are any callbacks in the queue
|
||||
*/
|
||||
bool empty() const { return callbacks.empty(); }
|
||||
|
||||
/**
|
||||
* process all callbacks
|
||||
*/
|
||||
void process()
|
||||
{
|
||||
queue::iterator i = callbacks.begin();
|
||||
queue::iterator end = callbacks.end();
|
||||
|
||||
while (i != end) {
|
||||
(*i)->process();
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* clear the callback queue
|
||||
*/
|
||||
void clear()
|
||||
{
|
||||
callbacks.clear();
|
||||
}
|
||||
void processAll() { while (!empty()) processOne(); }
|
||||
};
|
||||
|
||||
#endif // __CALLBACK_HH__
|
||||
|
|
Loading…
Reference in a new issue