00001 #ifndef MAKE_EVENT_H
00002 #define MAKE_EVENT_H
00003
00004 namespace ns3 {
00005
00006 class EventImpl;
00007
00008 template <typename MEM, typename OBJ>
00009 EventImpl *MakeEvent (MEM mem_ptr, OBJ obj);
00010
00011 template <typename MEM, typename OBJ,
00012 typename T1>
00013 EventImpl *MakeEvent (MEM mem_ptr, OBJ obj, T1 a1);
00014
00015 template <typename MEM, typename OBJ,
00016 typename T1, typename T2>
00017 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
00018
00019 template <typename MEM, typename OBJ,
00020 typename T1, typename T2, typename T3>
00021 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
00022
00023 template <typename MEM, typename OBJ,
00024 typename T1, typename T2, typename T3, typename T4>
00025 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
00026
00027 template <typename MEM, typename OBJ,
00028 typename T1, typename T2, typename T3, typename T4, typename T5>
00029 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj,
00030 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00031
00032 EventImpl * MakeEvent (void (*f) (void));
00033 template <typename U1,
00034 typename T1>
00035 EventImpl * MakeEvent (void (*f) (U1), T1 a1);
00036
00037 template <typename U1, typename U2,
00038 typename T1, typename T2>
00039 EventImpl * MakeEvent (void (*f) (U1,U2), T1 a1, T2 a2);
00040
00041 template <typename U1, typename U2, typename U3,
00042 typename T1, typename T2, typename T3>
00043 EventImpl * MakeEvent (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
00044
00045 template <typename U1, typename U2, typename U3, typename U4,
00046 typename T1, typename T2, typename T3, typename T4>
00047 EventImpl * MakeEvent (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
00048
00049 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00050 typename T1, typename T2, typename T3, typename T4, typename T5>
00051 EventImpl * MakeEvent (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00052
00053 }
00054
00055
00056
00057
00058
00059 #include "event-impl.h"
00060 #include "ns3/type-traits.h"
00061
00062 namespace ns3 {
00063
00064 template <typename T>
00065 struct EventMemberImplObjTraits;
00066
00067 template <typename T>
00068 struct EventMemberImplObjTraits<T *>
00069 {
00070 static T &GetReference (T *p) {
00071 return *p;
00072 }
00073 };
00074
00075 template <typename MEM, typename OBJ>
00076 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj)
00077 {
00078
00079 class EventMemberImpl0 : public EventImpl {
00080 public:
00081 EventMemberImpl0 (OBJ obj, MEM function)
00082 : m_obj (obj),
00083 m_function (function)
00084 {}
00085 virtual ~EventMemberImpl0 () {}
00086 private:
00087 virtual void Notify (void) {
00088 (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) ();
00089 }
00090 OBJ m_obj;
00091 MEM m_function;
00092 } * ev = new EventMemberImpl0 (obj, mem_ptr);
00093 return ev;
00094 }
00095
00096
00097 template <typename MEM, typename OBJ,
00098 typename T1>
00099 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1)
00100 {
00101
00102 class EventMemberImpl1 : public EventImpl {
00103 public:
00104 EventMemberImpl1 (OBJ obj, MEM function, T1 a1)
00105 : m_obj (obj),
00106 m_function (function),
00107 m_a1 (a1)
00108 {}
00109 protected:
00110 virtual ~EventMemberImpl1 () {}
00111 private:
00112 virtual void Notify (void) {
00113 (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (m_a1);
00114 }
00115 OBJ m_obj;
00116 MEM m_function;
00117 typename TypeTraits<T1>::ReferencedType m_a1;
00118 } *ev = new EventMemberImpl1 (obj, mem_ptr, a1);
00119 return ev;
00120 }
00121
00122 template <typename MEM, typename OBJ,
00123 typename T1, typename T2>
00124 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
00125 {
00126
00127 class EventMemberImpl2 : public EventImpl {
00128 public:
00129 EventMemberImpl2 (OBJ obj, MEM function, T1 a1, T2 a2)
00130 : m_obj (obj),
00131 m_function (function),
00132 m_a1 (a1),
00133 m_a2 (a2)
00134 { }
00135 protected:
00136 virtual ~EventMemberImpl2 () {}
00137 private:
00138 virtual void Notify (void) {
00139 (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (m_a1, m_a2);
00140 }
00141 OBJ m_obj;
00142 MEM m_function;
00143 typename TypeTraits<T1>::ReferencedType m_a1;
00144 typename TypeTraits<T2>::ReferencedType m_a2;
00145 } *ev = new EventMemberImpl2 (obj, mem_ptr, a1, a2);
00146 return ev;
00147 }
00148
00149 template <typename MEM, typename OBJ,
00150 typename T1, typename T2, typename T3>
00151 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
00152 {
00153
00154 class EventMemberImpl3 : public EventImpl {
00155 public:
00156 EventMemberImpl3 (OBJ obj, MEM function, T1 a1, T2 a2, T3 a3)
00157 : m_obj (obj),
00158 m_function (function),
00159 m_a1 (a1),
00160 m_a2 (a2),
00161 m_a3 (a3)
00162 { }
00163 protected:
00164 virtual ~EventMemberImpl3 () {}
00165 private:
00166 virtual void Notify (void) {
00167 (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (m_a1, m_a2, m_a3);
00168 }
00169 OBJ m_obj;
00170 MEM m_function;
00171 typename TypeTraits<T1>::ReferencedType m_a1;
00172 typename TypeTraits<T2>::ReferencedType m_a2;
00173 typename TypeTraits<T3>::ReferencedType m_a3;
00174 } *ev = new EventMemberImpl3 (obj, mem_ptr, a1, a2, a3);
00175 return ev;
00176 }
00177
00178 template <typename MEM, typename OBJ,
00179 typename T1, typename T2, typename T3, typename T4>
00180 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
00181 {
00182
00183 class EventMemberImpl4 : public EventImpl {
00184 public:
00185 EventMemberImpl4 (OBJ obj, MEM function, T1 a1, T2 a2, T3 a3, T4 a4)
00186 : m_obj (obj),
00187 m_function (function),
00188 m_a1 (a1),
00189 m_a2 (a2),
00190 m_a3 (a3),
00191 m_a4 (a4)
00192 { }
00193 protected:
00194 virtual ~EventMemberImpl4 () {}
00195 private:
00196 virtual void Notify (void) {
00197 (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (m_a1, m_a2, m_a3, m_a4);
00198 }
00199 OBJ m_obj;
00200 MEM m_function;
00201 typename TypeTraits<T1>::ReferencedType m_a1;
00202 typename TypeTraits<T2>::ReferencedType m_a2;
00203 typename TypeTraits<T3>::ReferencedType m_a3;
00204 typename TypeTraits<T4>::ReferencedType m_a4;
00205 } *ev = new EventMemberImpl4 (obj, mem_ptr, a1, a2, a3, a4);
00206 return ev;
00207 }
00208
00209 template <typename MEM, typename OBJ,
00210 typename T1, typename T2, typename T3, typename T4, typename T5>
00211 EventImpl * MakeEvent (MEM mem_ptr, OBJ obj,
00212 T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00213 {
00214
00215 class EventMemberImpl5 : public EventImpl {
00216 public:
00217 EventMemberImpl5 (OBJ obj, MEM function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00218 : m_obj (obj),
00219 m_function (function),
00220 m_a1 (a1),
00221 m_a2 (a2),
00222 m_a3 (a3),
00223 m_a4 (a4),
00224 m_a5 (a5)
00225 { }
00226 protected:
00227 virtual ~EventMemberImpl5 () {}
00228 private:
00229 virtual void Notify (void) {
00230 (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (m_a1, m_a2, m_a3, m_a4, m_a5);
00231 }
00232 OBJ m_obj;
00233 MEM m_function;
00234 typename TypeTraits<T1>::ReferencedType m_a1;
00235 typename TypeTraits<T2>::ReferencedType m_a2;
00236 typename TypeTraits<T3>::ReferencedType m_a3;
00237 typename TypeTraits<T4>::ReferencedType m_a4;
00238 typename TypeTraits<T5>::ReferencedType m_a5;
00239 } *ev = new EventMemberImpl5 (obj, mem_ptr, a1, a2, a3, a4, a5);
00240 return ev;
00241 }
00242
00243 template <typename U1, typename T1>
00244 EventImpl * MakeEvent (void (*f) (U1), T1 a1)
00245 {
00246
00247 class EventFunctionImpl1 : public EventImpl {
00248 public:
00249 typedef void (*F)(U1);
00250
00251 EventFunctionImpl1 (F function, T1 a1)
00252 : m_function (function),
00253 m_a1 (a1)
00254 { }
00255 protected:
00256 virtual ~EventFunctionImpl1 () {}
00257 private:
00258 virtual void Notify (void) {
00259 (*m_function) (m_a1);
00260 }
00261 F m_function;
00262 typename TypeTraits<T1>::ReferencedType m_a1;
00263 } *ev = new EventFunctionImpl1 (f, a1);
00264 return ev;
00265 }
00266
00267 template <typename U1, typename U2, typename T1, typename T2>
00268 EventImpl * MakeEvent (void (*f) (U1,U2), T1 a1, T2 a2)
00269 {
00270
00271 class EventFunctionImpl2 : public EventImpl {
00272 public:
00273 typedef void (*F)(U1, U2);
00274
00275 EventFunctionImpl2 (F function, T1 a1, T2 a2)
00276 : m_function (function),
00277 m_a1 (a1),
00278 m_a2 (a2)
00279 {}
00280 protected:
00281 virtual ~EventFunctionImpl2 () {}
00282 private:
00283 virtual void Notify (void) {
00284 (*m_function) (m_a1, m_a2);
00285 }
00286 F m_function;
00287 typename TypeTraits<T1>::ReferencedType m_a1;
00288 typename TypeTraits<T2>::ReferencedType m_a2;
00289 } *ev = new EventFunctionImpl2 (f, a1, a2);
00290 return ev;
00291 }
00292
00293 template <typename U1, typename U2, typename U3,
00294 typename T1, typename T2, typename T3>
00295 EventImpl * MakeEvent (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
00296 {
00297
00298 class EventFunctionImpl3 : public EventImpl {
00299 public:
00300 typedef void (*F)(U1, U2, U3);
00301
00302 EventFunctionImpl3 (F function, T1 a1, T2 a2, T3 a3)
00303 : m_function (function),
00304 m_a1 (a1),
00305 m_a2 (a2),
00306 m_a3 (a3)
00307 { }
00308 protected:
00309 virtual ~EventFunctionImpl3 () {}
00310 private:
00311 virtual void Notify (void) {
00312 (*m_function) (m_a1, m_a2, m_a3);
00313 }
00314 F m_function;
00315 typename TypeTraits<T1>::ReferencedType m_a1;
00316 typename TypeTraits<T2>::ReferencedType m_a2;
00317 typename TypeTraits<T3>::ReferencedType m_a3;
00318 } *ev = new EventFunctionImpl3 (f, a1, a2, a3);
00319 return ev;
00320 }
00321
00322 template <typename U1, typename U2, typename U3, typename U4,
00323 typename T1, typename T2, typename T3, typename T4>
00324 EventImpl * MakeEvent (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
00325 {
00326
00327 class EventFunctionImpl4 : public EventImpl {
00328 public:
00329 typedef void (*F)(U1, U2, U3, U4);
00330
00331 EventFunctionImpl4 (F function, T1 a1, T2 a2, T3 a3, T4 a4)
00332 : m_function (function),
00333 m_a1 (a1),
00334 m_a2 (a2),
00335 m_a3 (a3),
00336 m_a4 (a4)
00337 { }
00338 protected:
00339 virtual ~EventFunctionImpl4 () {}
00340 private:
00341 virtual void Notify (void) {
00342 (*m_function) (m_a1, m_a2, m_a3, m_a4);
00343 }
00344 F m_function;
00345 typename TypeTraits<T1>::ReferencedType m_a1;
00346 typename TypeTraits<T2>::ReferencedType m_a2;
00347 typename TypeTraits<T3>::ReferencedType m_a3;
00348 typename TypeTraits<T4>::ReferencedType m_a4;
00349 } *ev = new EventFunctionImpl4 (f, a1, a2, a3, a4);
00350 return ev;
00351 }
00352
00353 template <typename U1, typename U2, typename U3, typename U4, typename U5,
00354 typename T1, typename T2, typename T3, typename T4, typename T5>
00355 EventImpl * MakeEvent (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00356 {
00357
00358 class EventFunctionImpl5 : public EventImpl {
00359 public:
00360 typedef void (*F)(U1,U2,U3,U4,U5);
00361
00362 EventFunctionImpl5 (F function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00363 : m_function (function),
00364 m_a1 (a1),
00365 m_a2 (a2),
00366 m_a3 (a3),
00367 m_a4 (a4),
00368 m_a5 (a5)
00369 {}
00370 protected:
00371 virtual ~EventFunctionImpl5 () {}
00372 private:
00373 virtual void Notify (void) {
00374 (*m_function) (m_a1, m_a2, m_a3, m_a4, m_a5);
00375 }
00376 F m_function;
00377 typename TypeTraits<T1>::ReferencedType m_a1;
00378 typename TypeTraits<T2>::ReferencedType m_a2;
00379 typename TypeTraits<T3>::ReferencedType m_a3;
00380 typename TypeTraits<T4>::ReferencedType m_a4;
00381 typename TypeTraits<T5>::ReferencedType m_a5;
00382 } *ev = new EventFunctionImpl5 (f, a1, a2, a3, a4, a5);
00383 return ev;
00384 }
00385
00386 }
00387
00388 #endif