Listing 4
// the core interface of the Messaging class
template
<
class Listener,
typename Context = int,
class Mutex = NoSynchronization,
class BagType = std::vector<Listener*>
>
class Messaging
{
public:
// registers the listener
// listeners registered more than once will be notified
// once for each registration
void addListener(Listener *listener)
{
listeners_.add(listener);
}
// unregisters the listener
// it doesn't hurt if it's not already registered
// multiply registered listeners should also multiply
// unregister themselves
void removeListener(Listener *listener)
{
listeners_.remove(listener);
}
protected:
// this method should be called by the derived class
// to trigger event dispatching
void raiseEvent(const Context &context)
{
typedef typename BagType::iterator iterator;
BagType frozen(listeners_.getFrozen());
iterator it;
iterator itend = frozen.end();
for (it = frozen.begin(); it != itend; ++it)
{
Listener *p = static_cast<Listener*>(*it);
dispatchEvent(p, context);
}
}
// this is intended to be overriden in a derived class
// and is responsible for the actual dispatching
// this method is called for every registered listener
// (once for each registration)
// the overriding method should call the listener,
// using (or not) the context as a clue
virtual void dispatchEvent(Listener *listener,
const Context &context) = 0;
private:
// the synchronized container for keeping pointers
// to listener objects
ListenersCollection<Listener, Mutex, BagType> listeners_;
};