OBTEventSource.h

Go to the documentation of this file.
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         // Constructor
00066         //-------------------------------------------------------------------------
00067         template < class TListener, class TEvent >
00068         EventSource< TListener, TEvent >::EventSource( ProcessEventFunc processEvent )
00069         { 
00070                 _processEvent = processEvent ; 
00071         }
00072 
00073         //-------------------------------------------------------------------------
00074         // Destructor
00075         //-------------------------------------------------------------------------
00076         template < class TListener, class TEvent >
00077         EventSource< TListener, TEvent >::~EventSource()
00078         {
00079         }
00080 
00081         //-------------------------------------------------------------------------
00082         // addListener
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         // removeListener
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         // publishEvent
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

Generated on Wed Oct 1 11:34:05 2008 for OBT by  doxygen 1.5.3