00001 #ifndef _CTBcallbackBase_HXX 00002 #define _CTBcallbackBase_HXX 1 00003 00009 /*----------------------------------------------------------------------------*/ 00010 /* C Tool Box: Designed and implemented by: */ 00011 /* Walter F.J. Mueller Gesellschaft fuer Schwerionenforschung (GSI) */ 00012 /* Planckstrasse 1, D-64291 Darmstadt, Germany */ 00013 /* Email: W.F.J.Mueller@gsi.de */ 00014 /* WWW: http://www-kp3.gsi.de/www/kp3/people/mueller.html */ 00015 /*------------------------------------------+---------------------------------*/ 00016 00017 #include "CTBsimpleList.hxx" 00018 #include "CTBtreeList.hxx" 00019 00020 class CTBcallbackLink; 00021 class CTBcallbackTargetBase; 00022 00023 class CTBcallbackSourceBase { 00024 00025 friend class CTBcallbackLink; 00026 friend class CTBcallbackTargetBase; 00027 00028 public: 00029 00030 CTBcallbackSourceBase(); 00031 CTBcallbackSourceBase(const CTBcallbackSourceBase& rhs); 00032 00033 virtual ~CTBcallbackSourceBase(); 00034 00035 int NConnect() const; 00036 00037 CTBcallbackSourceBase& operator=(const CTBcallbackSourceBase& rhs); 00038 00039 bool operator! () const; 00040 00041 operator bool() const; 00042 00043 protected: 00044 00045 void Execute(void* p_arg) const; 00046 00047 protected: 00048 00049 CTBsimpleListHead<CTBcallbackLink> m_shead; 00050 }; 00051 00052 //------------------------------------------+----------------------------------- 00053 00054 class CTBcallbackTargetBase { 00055 00056 friend class CTBcallbackLink; 00057 friend class CTBcallbackSourceBase; 00058 00059 public: 00060 00061 CTBcallbackTargetBase(); 00062 CTBcallbackTargetBase(const CTBcallbackTargetBase& rhs); 00063 00064 virtual ~CTBcallbackTargetBase(); 00065 00066 int NConnect() const; 00067 void Disconnect(); 00068 00069 CTBcallbackTargetBase& operator=(const CTBcallbackTargetBase& rhs); 00070 00071 bool operator! () const; 00072 00073 operator bool() const; 00074 00075 protected: 00076 00077 void Connect(CTBcallbackSourceBase& source); 00078 void Disconnect(CTBcallbackSourceBase& source); 00079 00080 virtual void Execute(void* p_arg) const = 0; 00081 00082 protected: 00083 00084 CTBtreeListHead<CTBcallbackTargetBase,CTBcallbackLink> m_thead; 00085 }; 00086 00087 //------------------------------------------+----------------------------------- 00088 00089 class CTBcallbackLink { 00090 00091 friend class CTBcallbackSourceBase; 00092 friend class CTBcallbackTargetBase; 00093 00094 private: 00095 00096 CTBcallbackLink(CTBcallbackTargetBase& target, 00097 CTBcallbackSourceBase& source); 00098 CTBcallbackLink(CTBcallbackTargetBase& target, 00099 CTBsimpleListHead<CTBcallbackLink>& shead); 00100 00101 ~CTBcallbackLink(); 00102 00103 void Mark(); 00104 void Unmark(); 00105 00106 bool Busy() const; 00107 bool Zombie() const; 00108 bool Deletable() const; 00109 00110 void UnlinkSource(); 00111 void UnlinkTarget(); 00112 00113 private: 00114 00115 CTBsimpleListLink<CTBcallbackLink> m_slink; 00116 CTBtreeListLink<CTBcallbackTargetBase,CTBcallbackLink> m_tlink; 00117 int mi_nbusy; 00118 }; 00119 00120 #if !(defined(CTB__OutLine) || defined(CTBcallbackBase__OutLine)) 00121 #include "CTBcallbackBase.icc" 00122 #endif 00123 00124 #endif 00125 00126 00127 00128 00129 00130