00001 #ifndef OBTEventSource_H
00002 #define OBTEventSource_H
00003
00004 #include <vector>
00005 #include "OBT.h"
00006
00007 namespace OBT
00008 {
00018 template < class TListener, class TEvent >
00019 class EventSource
00020 {
00022 typedef void ( TListener ::*ProcessEventFunc )( const TEvent& );
00023 public:
00024
00029 EventSource( ProcessEventFunc processEvent ) ;
00030
00034 virtual ~EventSource( ) ;
00035
00040 void addListener( TListener& listener ) ;
00041
00046 void removeListener( TListener& listener ) ;
00047
00053 void publishEvent( const TEvent& event ) ;
00054
00055 private:
00056
00058 std::vector< TListener* > _listeners ;
00059
00061 ProcessEventFunc _processEvent ;
00062 };
00063
00064
00065
00066
00067 template < class TListener, class TEvent >
00068 EventSource< TListener, TEvent >::EventSource( ProcessEventFunc processEvent )
00069 {
00070 _processEvent = processEvent ;
00071 }
00072
00073
00074
00075
00076 template < class TListener, class TEvent >
00077 EventSource< TListener, TEvent >::~EventSource()
00078 {
00079 }
00080
00081
00082
00083
00084 template < class TListener, class TEvent >
00085 void
00086 EventSource< TListener, TEvent >::addListener( TListener& listener )
00087 {
00088 _listeners.push_back( &listener );
00089 }
00090
00091
00092
00093
00094 template < class TListener, class TEvent >
00095 void
00096 EventSource< TListener, TEvent >::removeListener( TListener& listener )
00097 {
00098 std::vector< TListener* >::iterator ite( _listeners.begin() ) ;
00099 while ( ite != _listeners.end() )
00100 {
00101 if ( &listener == *ite )
00102 {
00103 _listeners.erase( ite ) ;
00104 ite = _listeners.end() ;
00105 }
00106 else
00107 {
00108 ++ite ;
00109 }
00110 }
00111 }
00112
00113
00114
00115
00116 template < class TListener, class TEvent >
00117 void
00118 EventSource< TListener, TEvent >::publishEvent( const TEvent& event )
00119 {
00120 std::vector< TListener* >::iterator ite( _listeners.begin() ) ;
00121 for ( ; ite != _listeners.end() ; ++ite )
00122 {
00123 ( ( *ite )->*_processEvent )( event );
00124 }
00125 }
00126 }
00127
00128 #endif // HEADER