SDL++
C++wrapperfortheSDLlibrary.
|
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