00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef GRINLIZ_PUBLISHER_INCLUDED
00027 #define GRINLIZ_PUBLISHER_INCLUDED
00028
00029 #ifdef _MSC_VER
00030 #pragma warning( disable : 4786 )
00031 #endif
00032
00033
00034
00035 #include <set>
00036
00037 namespace grinliz {
00038
00054 template< class LISTENER_CLASS >
00055 class Publisher
00056 {
00057 public:
00058
00059 typedef typename std::set<LISTENER_CLASS*>::iterator iterator;
00061 typedef typename std::set<LISTENER_CLASS*>::const_iterator const_iterator;
00062
00063 Publisher() : copyValid( false ) {}
00064
00065 ~Publisher()
00066 {
00067 for( iterator listenerIterator = listeners.begin();
00068 listenerIterator != listeners.end();
00069 ++listenerIterator )
00070 {
00071 (*listenerIterator)->publishers.erase( this );
00072 }
00073 }
00074
00076 void AddListener( LISTENER_CLASS* add )
00077 {
00078 copyValid = false;
00079 listeners.insert( add );
00080 add->publishers.insert( this );
00081 }
00082
00085 void RemoveListener( LISTENER_CLASS* remove )
00086 {
00087 copyValid = false;
00088 remove->publishers.erase( this );
00089 listeners.erase( remove );
00090 }
00091
00103 const_iterator begin() { if ( !copyValid )
00104 {
00105 listenersCopy.clear();
00106 listenersCopy = listeners;
00107 copyValid = true;
00108 }
00109 return listenersCopy.begin();
00110 }
00111
00113 const_iterator end() { return listenersCopy.end(); }
00114
00115 private:
00116 std::set<LISTENER_CLASS*> listeners;
00117
00118
00119
00120
00121
00122 bool copyValid;
00123 std::set<LISTENER_CLASS*> listenersCopy;
00124 };
00125
00126
00149 template <class LISTENER_CLASS>
00150 class Listener
00151 {
00152 friend class Publisher< LISTENER_CLASS >;
00153
00154 private:
00155 std::set< Publisher<LISTENER_CLASS>* > publishers;
00156 typedef typename std::set< Publisher<LISTENER_CLASS>* >::iterator iterator;
00157
00158 public:
00159 virtual ~Listener()
00160 {
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 while ( true )
00171 {
00172 iterator it = publishers.begin();
00173 if ( it == publishers.end() ) break;
00174 (*it)->RemoveListener( static_cast< LISTENER_CLASS* >( this ) );
00175 }
00176 }
00177 };
00178
00179 };
00180 #endif