Signalv1ImplVC6.hxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __SIGNALV1IMPLVC6__
00023 #define __SIGNALV1IMPLVC6__
00024
00025 #ifndef __SIGNALV1__
00026 #error "This is an implementation header. You are not allowed to include it directly!"
00027 #endif
00028
00029 #include <list>
00030 #include <utility>
00031
00032 namespace SigSlot
00033 {
00034
00035 template < typename ParmType1 >
00036 class Signalv1 : public Signal
00037 {
00038 public:
00039 typedef typename CBL::Functor1<ParmType1> tCallbackType;
00040
00041 struct tCallback
00042 {
00043 tConnectionId mConnection;
00044 Slot* mSlot;
00045 tCallbackType mCallback;
00046
00047 tCallback( tConnectionId id, Slot* slot, tCallbackType cb )
00048 : mConnection( id ), mSlot( slot ), mCallback( cb )
00049 {
00050 }
00051 };
00052
00053 typedef tCallbackType* tCallbackPtr;
00054 typedef std::list<tCallbackPtr> tCallList;
00055 typedef typename std::list<tCallbackPtr >::iterator tCallIterator;
00056 typedef std::list<tCallback> tCallbackList;
00057 typedef typename std::list<tCallback>::iterator tCbListIterator;
00058 typedef typename std::list<tCallback>::const_iterator const_tCbListIterator;
00059
00060
00061 protected:
00062
00063 void AddCallback( tConnectionId pConnection, Slot* slot, tCallbackType cb )
00064 {
00065 mCallbacks.push_back( tCallback( pConnection, slot, cb ) );
00066 }
00067
00068 bool HasNoCallbacks( ) const
00069 {
00070 return mCallbacks.empty();
00071 }
00072
00073 tCallList& GetCalls( )
00074 {
00075 mCalls.clear();
00076
00077 tCbListIterator i = mCallbacks.begin();
00078 tCbListIterator end = mCallbacks.end();
00079
00080 while ( i!=end)
00081 {
00082 mCalls.push_back( &(i->mCallback) );
00083 i++;
00084 }
00085
00086 return mCalls;
00087 }
00088
00089 void RemoveCall( tConnectionId id )
00090 {
00091 tCbListIterator i = mCallbacks.begin();
00092 tCbListIterator end = mCallbacks.end();
00093
00094 while ( i!=end )
00095 {
00096 if ( i->mConnection == id )
00097 {
00098 mCallbacks.erase( i );
00099 break;
00100 }
00101 i++;
00102 }
00103 }
00104
00105 void DestroyConnections()
00106 {
00107 tCbListIterator elem;
00108
00109 while ( !mCallbacks.empty() )
00110 {
00111 elem = mCallbacks.begin();
00112
00113 elem->mSlot->Unbind( elem->mConnection );
00114 }
00115 }
00116
00117
00118 public:
00119
00120 virtual ~Signalv1()
00121 {
00122 DestroyConnections();
00123 }
00124
00125 void Connect( Slotv1<ParmType1>& slot )
00126 {
00127 Connection c( AssignConnection(), this );
00128
00129 AddCallback( c.GetID(), &slot, slot.GetMethod() );
00130
00131 slot.Bind(c);
00132 }
00133
00134 void Emit( ParmType1 parm )
00135 {
00136 if ( HasNoCallbacks() )
00137 return;
00138
00139 tCallList calls = GetCalls();
00140 tCallIterator i = calls.begin();
00141 tCallIterator end = calls.end();
00142
00143 while ( i != end )
00144 {
00145 (*(*i))( parm );
00146 i++;
00147 }
00148
00149 }
00150
00151 void FreeConnection( Connection* pConnection )
00152 {
00153 RemoveCall( pConnection->GetID() );
00154 FreeConnectionId( pConnection->GetID() );
00155 }
00156
00157 private:
00158
00159 tCallList mCalls;
00160 tCallbackList mCallbacks;
00161
00162
00163 };
00164
00165 }
00166
00167
00168 #endif // Signalv1ImplVC6.hxx
00169