SDL++
C++wrapperfortheSDLlibrary.

event/Dispatcher.h

Go to the documentation of this file.
00001 
00021 #ifndef SDL_EVENT_DISPATCHER_H
00022 #define SDL_EVENT_DISPATCHER_H
00023 
00024 #include <algorithm>
00025 
00026 #include <boost/ptr_container/ptr_vector.hpp>
00027 #include <boost/mpl/for_each.hpp>
00028 
00029 #include "sdlpp/event/Listener.h"
00030 
00031 namespace sdl {
00032 namespace event {
00033     using namespace boost;
00034     using namespace boost::mpl;
00035 
00043     template<class Listeners, class Handler>
00044     struct Adder {
00051         Adder (Listeners& listeners, Handler& handler) : listeners_ (listeners), handler_ (handler) {};
00052 
00060         template<class Event>
00061         void operator() (const Event& event) {
00062             listeners_.push_back (new Listener<Event, Handler> (handler_, &Handler::handle));
00063         };
00064 
00065         private:
00069             Listeners& listeners_;
00070 
00074             Handler& handler_;
00075     }; //Adder
00076 
00081     class Dispatcher {
00082         public:
00086             Dispatcher () : listeners_ () {};
00087 
00095             template<class Handler>
00096             Dispatcher (Handler& handler) : listeners_ () { add (handler); };
00097     
00107             template<class Handler>
00108             Dispatcher& add (Handler& handler) {
00109                 boost::mpl::for_each<typename Handler::Events> (Adder<Listeners, Handler> (listeners_, handler));
00110                 return *this;
00111             };
00112 
00118             void operator() (const SDL_Event* event) {
00119                 Listeners::iterator cur = std::find (listeners_.begin (), listeners_.end (), event);
00120                 if (cur != listeners_.end ()) cur->operator() (event);
00121             };
00122 
00123         private:
00129             Dispatcher (const Dispatcher& rhs);
00130 
00138             Dispatcher& operator= (const Dispatcher& rhs);
00139 
00144             typedef boost::ptr_vector<basic_Listener> Listeners;
00145 
00149             Listeners listeners_;
00150     }; //Dispatcher
00151 }; //event
00152 }; //sdl
00153 
00154 #endif //SDL_EVENT_DISPATCHER_H
00155 
 All Classes Namespaces Files Functions Variables Typedefs