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