00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef TRACED_CALLBACK_H
00022 #define TRACED_CALLBACK_H
00023
00024 #include <list>
00025 #include "callback.h"
00026
00027 namespace ns3 {
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 template<typename T1 = empty, typename T2 = empty,
00040 typename T3 = empty, typename T4 = empty,
00041 typename T5 = empty, typename T6 = empty,
00042 typename T7 = empty, typename T8 = empty>
00043 class TracedCallback
00044 {
00045 public:
00046 TracedCallback ();
00047
00048
00049
00050
00051
00052
00053 void ConnectWithoutContext (const CallbackBase & callback);
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void Connect (const CallbackBase & callback, std::string path);
00064
00065
00066
00067
00068
00069
00070
00071 void DisconnectWithoutContext (const CallbackBase & callback);
00072
00073
00074
00075
00076
00077
00078
00079
00080 void Disconnect (const CallbackBase & callback, std::string path);
00081 void operator() (void) const;
00082 void operator() (T1 a1) const;
00083 void operator() (T1 a1, T2 a2) const;
00084 void operator() (T1 a1, T2 a2, T3 a3) const;
00085 void operator() (T1 a1, T2 a2, T3 a3, T4 a4) const;
00086 void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) const;
00087 void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) const;
00088 void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7) const;
00089 void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8) const;
00090
00091 private:
00092 typedef std::list<Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> > CallbackList;
00093 CallbackList m_callbackList;
00094 };
00095
00096 }
00097
00098
00099
00100 namespace ns3 {
00101
00102 template<typename T1, typename T2,
00103 typename T3, typename T4,
00104 typename T5, typename T6,
00105 typename T7, typename T8>
00106 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::TracedCallback ()
00107 : m_callbackList ()
00108 {}
00109 template<typename T1, typename T2,
00110 typename T3, typename T4,
00111 typename T5, typename T6,
00112 typename T7, typename T8>
00113 void
00114 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::ConnectWithoutContext (const CallbackBase & callback)
00115 {
00116 Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> cb;
00117 cb.Assign (callback);
00118 m_callbackList.push_back (cb);
00119 }
00120 template<typename T1, typename T2,
00121 typename T3, typename T4,
00122 typename T5, typename T6,
00123 typename T7, typename T8>
00124 void
00125 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::Connect (const CallbackBase & callback, std::string path)
00126 {
00127 Callback<void,std::string,T1,T2,T3,T4,T5,T6,T7,T8> cb;
00128 cb.Assign (callback);
00129 Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> realCb = cb.Bind (path);
00130 m_callbackList.push_back (realCb);
00131 }
00132 template<typename T1, typename T2,
00133 typename T3, typename T4,
00134 typename T5, typename T6,
00135 typename T7, typename T8>
00136 void
00137 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::DisconnectWithoutContext (const CallbackBase & callback)
00138 {
00139 for (typename CallbackList::iterator i = m_callbackList.begin ();
00140 i != m_callbackList.end (); )
00141 {
00142 if ((*i).IsEqual (callback))
00143 {
00144 i = m_callbackList.erase (i);
00145 }
00146 else
00147 {
00148 i++;
00149 }
00150 }
00151 }
00152 template<typename T1, typename T2,
00153 typename T3, typename T4,
00154 typename T5, typename T6,
00155 typename T7, typename T8>
00156 void
00157 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::Disconnect (const CallbackBase & callback, std::string path)
00158 {
00159 Callback<void,std::string,T1,T2,T3,T4,T5,T6,T7,T8> cb;
00160 cb.Assign (callback);
00161 Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> realCb = cb.Bind (path);
00162 DisconnectWithoutContext (realCb);
00163 }
00164 template<typename T1, typename T2,
00165 typename T3, typename T4,
00166 typename T5, typename T6,
00167 typename T7, typename T8>
00168 void
00169 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (void) const
00170 {
00171 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00172 i != m_callbackList.end (); i++)
00173 {
00174 (*i) ();
00175 }
00176 }
00177 template<typename T1, typename T2,
00178 typename T3, typename T4,
00179 typename T5, typename T6,
00180 typename T7, typename T8>
00181 void
00182 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1) const
00183 {
00184 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00185 i != m_callbackList.end (); i++)
00186 {
00187 (*i) (a1);
00188 }
00189 }
00190 template<typename T1, typename T2,
00191 typename T3, typename T4,
00192 typename T5, typename T6,
00193 typename T7, typename T8>
00194 void
00195 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2) const
00196 {
00197 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00198 i != m_callbackList.end (); i++)
00199 {
00200 (*i) (a1, a2);
00201 }
00202 }
00203 template<typename T1, typename T2,
00204 typename T3, typename T4,
00205 typename T5, typename T6,
00206 typename T7, typename T8>
00207 void
00208 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2, T3 a3) const
00209 {
00210 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00211 i != m_callbackList.end (); i++)
00212 {
00213 (*i) (a1, a2, a3);
00214 }
00215 }
00216 template<typename T1, typename T2,
00217 typename T3, typename T4,
00218 typename T5, typename T6,
00219 typename T7, typename T8>
00220 void
00221 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2, T3 a3, T4 a4) const
00222 {
00223 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00224 i != m_callbackList.end (); i++)
00225 {
00226 (*i) (a1, a2, a3, a4);
00227 }
00228 }
00229 template<typename T1, typename T2,
00230 typename T3, typename T4,
00231 typename T5, typename T6,
00232 typename T7, typename T8>
00233 void
00234 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) const
00235 {
00236 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00237 i != m_callbackList.end (); i++)
00238 {
00239 (*i) (a1, a2, a3, a4, a5);
00240 }
00241 }
00242 template<typename T1, typename T2,
00243 typename T3, typename T4,
00244 typename T5, typename T6,
00245 typename T7, typename T8>
00246 void
00247 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) const
00248 {
00249 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00250 i != m_callbackList.end (); i++)
00251 {
00252 (*i) (a1, a2, a3, a4, a5, a6);
00253 }
00254 }
00255 template<typename T1, typename T2,
00256 typename T3, typename T4,
00257 typename T5, typename T6,
00258 typename T7, typename T8>
00259 void
00260 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7) const
00261 {
00262 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00263 i != m_callbackList.end (); i++)
00264 {
00265 (*i) (a1, a2, a3, a4, a5, a6, a7);
00266 }
00267 }
00268 template<typename T1, typename T2,
00269 typename T3, typename T4,
00270 typename T5, typename T6,
00271 typename T7, typename T8>
00272 void
00273 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8) const
00274 {
00275 for (typename CallbackList::const_iterator i = m_callbackList.begin ();
00276 i != m_callbackList.end (); i++)
00277 {
00278 (*i) (a1, a2, a3, a4, a5, a6, a7, a8);
00279 }
00280 }
00281
00282 }
00283
00284 #endif