00001 00032 // header guard 00033 #ifndef LL_EVENTEMITTER_H 00034 #define LL_EVENTEMITTER_H 00035 00036 // standard headers 00037 #include <algorithm> 00038 #include <typeinfo> 00039 #include <iostream> 00040 #include <string> 00041 #include <list> 00042 00043 #include "stdtypes.h" 00044 00046 // templatized emitter class 00047 template < class T > 00048 class eventEmitter 00049 { 00050 public: 00051 typedef typename T::EventType EventType; 00052 typedef std::list< T* > ObserverContainer; 00053 typedef void ( T::*observerMethod )( const EventType& ); 00054 00055 protected: 00056 ObserverContainer observers; 00057 00058 public: 00059 eventEmitter () { }; 00060 00061 ~eventEmitter () { }; 00062 00064 // 00065 BOOL addObserver ( T* observerIn ) 00066 { 00067 if ( ! observerIn ) 00068 return FALSE; 00069 00070 // check if observer already exists 00071 if ( std::find ( observers.begin (), observers.end (), observerIn ) != observers.end () ) 00072 return FALSE; 00073 00074 // save it 00075 observers.push_back ( observerIn ); 00076 00077 return true; 00078 }; 00079 00081 // 00082 BOOL remObserver ( T* observerIn ) 00083 { 00084 if ( ! observerIn ) 00085 return FALSE; 00086 00087 observers.remove ( observerIn ); 00088 00089 return TRUE; 00090 }; 00091 00093 // 00094 void update ( observerMethod method, const EventType& msgIn ) 00095 { 00096 typename std::list< T* >::iterator iter = observers.begin (); 00097 00098 while ( iter != observers.end () ) 00099 { 00100 ( ( *iter )->*method ) ( msgIn ); 00101 00102 ++iter; 00103 }; 00104 }; 00105 }; 00106 00107 #endif // lleventemitter_h