finish support for references as arguments to event handlers

This commit is contained in:
Mathieu Lacage
2007-07-19 18:57:19 +02:00
parent 7acaffa841
commit 5703b95d0e
2 changed files with 339 additions and 146 deletions

View File

@@ -471,6 +471,7 @@ static void foo4 (int, int, int, int)
static void foo5 (int, int, int, int, int)
{}
#if 1
static void ber1 (int &)
{}
static void ber2 (int &, int &)
@@ -481,6 +482,18 @@ static void ber4 (int &, int &, int &, int &)
{}
static void ber5 (int &, int &, int &, int &, int &)
{}
#endif
static void cber1 (const int &)
{}
static void cber2 (const int &, const int &)
{}
static void cber3 (const int &, const int &, const int &)
{}
static void cber4 (const int &, const int &, const int &, const int &)
{}
static void cber5 (const int &, const int &, const int &, const int &, const int &)
{}
class SimulatorTests : public Test {
@@ -509,6 +522,11 @@ private:
void baz3 (int &, int &, int &);
void baz4 (int &, int &, int &, int &);
void baz5 (int &, int &, int &, int &, int &);
void cbaz1 (const int &);
void cbaz2 (const int &, const int &);
void cbaz3 (const int &, const int &, const int &);
void cbaz4 (const int &, const int &, const int &, const int &);
void cbaz5 (const int &, const int &, const int &, const int &, const int &);
bool m_b;
bool m_a;
@@ -605,6 +623,22 @@ void
SimulatorTests::baz5 (int &, int &, int &, int &, int &)
{}
void
SimulatorTests::cbaz1 (const int &)
{}
void
SimulatorTests::cbaz2 (const int &, const int &)
{}
void
SimulatorTests::cbaz3 (const int &, const int &, const int &)
{}
void
SimulatorTests::cbaz4 (const int &, const int &, const int &, const int &)
{}
void
SimulatorTests::cbaz5 (const int &, const int &, const int &, const int &, const int &)
{}
bool
SimulatorTests::RunOneTest (void)
{
@@ -670,11 +704,11 @@ SimulatorTests::RunTests (void)
Simulator::Schedule (Seconds (0.0), &foo3, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &foo4, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &foo5, 0, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber1, 0);
Simulator::Schedule (Seconds (0.0), &ber2, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber3, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber4, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber5, 0, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &cber1, 0);
Simulator::Schedule (Seconds (0.0), &cber2, 0, 0);
Simulator::Schedule (Seconds (0.0), &cber3, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &cber4, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &cber5, 0, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::bar0, this);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::bar1, this, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::bar2, this, 0, 0);
@@ -687,18 +721,33 @@ SimulatorTests::RunTests (void)
Simulator::Schedule (Seconds (0.0), &SimulatorTests::bar3, Ptr<SimulatorTests> (this), 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::bar4, Ptr<SimulatorTests> (this), 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::bar5, Ptr<SimulatorTests> (this), 0, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::cbaz1, this, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::cbaz2, this, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::cbaz3, this, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::cbaz4, this, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::cbaz5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&foo0);
Simulator::ScheduleNow (&foo1, 0);
Simulator::ScheduleNow (&foo2, 0, 0);
Simulator::ScheduleNow (&foo3, 0, 0, 0);
Simulator::ScheduleNow (&foo4, 0, 0, 0, 0);
Simulator::ScheduleNow (&foo5, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&cber1, 0);
Simulator::ScheduleNow (&cber2, 0, 0);
Simulator::ScheduleNow (&cber3, 0, 0, 0);
Simulator::ScheduleNow (&cber4, 0, 0, 0, 0);
Simulator::ScheduleNow (&cber5, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::bar0, this);
Simulator::ScheduleNow (&SimulatorTests::bar1, this, 0);
Simulator::ScheduleNow (&SimulatorTests::bar2, this, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::bar3, this, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::bar4, this, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::bar5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::cbaz1, this, 0);
Simulator::ScheduleNow (&SimulatorTests::cbaz2, this, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::cbaz3, this, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::cbaz4, this, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::cbaz5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::bar0, Ptr<SimulatorTests> (this));
Simulator::ScheduleNow (&SimulatorTests::bar1, Ptr<SimulatorTests> (this), 0);
Simulator::ScheduleNow (&SimulatorTests::bar2, Ptr<SimulatorTests> (this), 0, 0);
@@ -711,12 +760,22 @@ SimulatorTests::RunTests (void)
Simulator::ScheduleDestroy (&foo3, 0, 0, 0);
Simulator::ScheduleDestroy (&foo4, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&foo5, 0, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&cber1, 0);
Simulator::ScheduleDestroy (&cber2, 0, 0);
Simulator::ScheduleDestroy (&cber3, 0, 0, 0);
Simulator::ScheduleDestroy (&cber4, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&cber5, 0, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar0, this);
Simulator::ScheduleDestroy (&SimulatorTests::bar1, this, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar2, this, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar3, this, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar4, this, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::cbaz1, this, 0);
Simulator::ScheduleDestroy (&SimulatorTests::cbaz2, this, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::cbaz3, this, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::cbaz4, this, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::cbaz5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar0, Ptr<SimulatorTests> (this));
Simulator::ScheduleDestroy (&SimulatorTests::bar1, Ptr<SimulatorTests> (this), 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar2, Ptr<SimulatorTests> (this), 0, 0);
@@ -724,6 +783,43 @@ SimulatorTests::RunTests (void)
Simulator::ScheduleDestroy (&SimulatorTests::bar4, Ptr<SimulatorTests> (this), 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::bar5, Ptr<SimulatorTests> (this), 0, 0, 0, 0, 0);
// the code below does not compile, as expected.
//Simulator::Schedule (Seconds (0.0), &cber1, 0.0);
#if 1
Simulator::Schedule (Seconds (0.0), &ber1, 0);
Simulator::Schedule (Seconds (0.0), &ber2, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber3, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber4, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &ber5, 0, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::baz1, this, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::baz2, this, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::baz3, this, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::baz4, this, 0, 0, 0, 0);
Simulator::Schedule (Seconds (0.0), &SimulatorTests::baz5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&ber1, 0);
Simulator::ScheduleNow (&ber2, 0, 0);
Simulator::ScheduleNow (&ber3, 0, 0, 0);
Simulator::ScheduleNow (&ber4, 0, 0, 0, 0);
Simulator::ScheduleNow (&ber5, 0, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::baz1, this, 0);
Simulator::ScheduleNow (&SimulatorTests::baz2, this, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::baz3, this, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::baz4, this, 0, 0, 0, 0);
Simulator::ScheduleNow (&SimulatorTests::baz5, this, 0, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&ber1, 0);
Simulator::ScheduleDestroy (&ber2, 0, 0);
Simulator::ScheduleDestroy (&ber3, 0, 0, 0);
Simulator::ScheduleDestroy (&ber4, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&ber5, 0, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::baz1, this, 0);
Simulator::ScheduleDestroy (&SimulatorTests::baz2, this, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::baz3, this, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::baz4, this, 0, 0, 0, 0);
Simulator::ScheduleDestroy (&SimulatorTests::baz5, this, 0, 0, 0, 0, 0);
#endif
Simulator::Run ();
Simulator::Destroy ();

View File

@@ -172,8 +172,8 @@ public:
* @param a1 the first argument to pass to the invoked method
* @returns an id for the scheduled event.
*/
template <typename T, typename OBJ, typename T1>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (T1), OBJ obj, T1 a1);
template <typename T, typename OBJ, typename U1, typename T1>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (U1), OBJ obj, T1 a1);
/**
* @param time the relative expiration time of the event.
* @param mem_ptr member method pointer to invoke
@@ -182,8 +182,8 @@ public:
* @param a2 the second argument to pass to the invoked method
* @returns an id for the scheduled event.
*/
template <typename T, typename OBJ, typename T1, typename T2>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2);
template <typename T, typename OBJ, typename U1, typename U2, typename T1, typename T2>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2);
/**
* @param time the relative expiration time of the event.
* @param mem_ptr member method pointer to invoke
@@ -193,8 +193,10 @@ public:
* @param a3 the third argument to pass to the invoked method
* @returns an id for the scheduled event.
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3);
/**
* @param time the relative expiration time of the event.
* @param mem_ptr member method pointer to invoke
@@ -205,8 +207,10 @@ public:
* @param a4 the fourth argument to pass to the invoked method
* @returns an id for the scheduled event.
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
/**
* @param time the relative expiration time of the event.
* @param mem_ptr member method pointer to invoke
@@ -218,8 +222,10 @@ public:
* @param a5 the fifth argument to pass to the invoked method
* @returns an id for the scheduled event.
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
static EventId Schedule (Time const &time, void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
/**
* @param time the relative expiration time of the event.
@@ -296,16 +302,20 @@ public:
* @param obj the object on which to invoke the member method
* @param a1 the first argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1>
static void ScheduleNow (void (T::*mem_ptr) (T1), OBJ obj, T1 a1);
template <typename T, typename OBJ,
typename U1,
typename T1>
static void ScheduleNow (void (T::*mem_ptr) (U1), OBJ obj, T1 a1);
/**
* @param mem_ptr member method pointer to invoke
* @param obj the object on which to invoke the member method
* @param a1 the first argument to pass to the invoked method
* @param a2 the second argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2>
static void ScheduleNow (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2);
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
static void ScheduleNow (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2);
/**
* @param mem_ptr member method pointer to invoke
* @param obj the object on which to invoke the member method
@@ -313,8 +323,10 @@ public:
* @param a2 the second argument to pass to the invoked method
* @param a3 the third argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
static void ScheduleNow (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
static void ScheduleNow (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3);
/**
* @param mem_ptr member method pointer to invoke
* @param obj the object on which to invoke the member method
@@ -323,8 +335,10 @@ public:
* @param a3 the third argument to pass to the invoked method
* @param a4 the fourth argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
static void ScheduleNow (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
static void ScheduleNow (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4);
/**
* @param mem_ptr member method pointer to invoke
@@ -335,8 +349,10 @@ public:
* @param a4 the fourth argument to pass to the invoked method
* @param a5 the fifth argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleNow (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleNow (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
/**
* @param f the function to invoke
@@ -346,23 +362,26 @@ public:
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
*/
template <typename T1>
static void ScheduleNow (void (*f) (T1), T1 a1);
template <typename U1,
typename T1>
static void ScheduleNow (void (*f) (U1), T1 a1);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
* @param a2 the second argument to pass to the function to invoke
*/
template <typename T1, typename T2>
static void ScheduleNow (void (*f) (T1,T2), T1 a1, T2 a2);
template <typename U1, typename U2,
typename T1, typename T2>
static void ScheduleNow (void (*f) (U1,U2), T1 a1, T2 a2);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
* @param a2 the second argument to pass to the function to invoke
* @param a3 the third argument to pass to the function to invoke
*/
template <typename T1, typename T2, typename T3>
static void ScheduleNow (void (*f) (T1,T2,T3), T1 a1, T2 a2, T3 a3);
template <typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
static void ScheduleNow (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
@@ -370,8 +389,9 @@ public:
* @param a3 the third argument to pass to the function to invoke
* @param a4 the fourth argument to pass to the function to invoke
*/
template <typename T1, typename T2, typename T3, typename T4>
static void ScheduleNow (void (*f) (T1,T2,T3,T4), T1 a1, T2 a2, T3 a3, T4 a4);
template <typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
static void ScheduleNow (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
@@ -380,8 +400,9 @@ public:
* @param a4 the fourth argument to pass to the function to invoke
* @param a5 the fifth argument to pass to the function to invoke
*/
template <typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleNow (void (*f) (T1,T2,T3,T4,T5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
template <typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleNow (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
/**
@@ -400,16 +421,20 @@ public:
* @param obj the object on which to invoke the member method
* @param a1 the first argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1>
static void ScheduleDestroy (void (T::*mem_ptr) (T1), OBJ obj, T1 a1);
template <typename T, typename OBJ,
typename U1,
typename T1>
static void ScheduleDestroy (void (T::*mem_ptr) (U1), OBJ obj, T1 a1);
/**
* @param mem_ptr member method pointer to invoke
* @param obj the object on which to invoke the member method
* @param a1 the first argument to pass to the invoked method
* @param a2 the second argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2>
static void ScheduleDestroy (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2);
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
static void ScheduleDestroy (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2);
/**
* @param mem_ptr member method pointer to invoke
* @param obj the object on which to invoke the member method
@@ -417,8 +442,10 @@ public:
* @param a2 the second argument to pass to the invoked method
* @param a3 the third argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
static void ScheduleDestroy (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
static void ScheduleDestroy (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3);
/**
* @param mem_ptr member method pointer to invoke
* @param obj the object on which to invoke the member method
@@ -427,8 +454,10 @@ public:
* @param a3 the third argument to pass to the invoked method
* @param a4 the fourth argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
static void ScheduleDestroy (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
static void ScheduleDestroy (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4);
/**
* @param mem_ptr member method pointer to invoke
@@ -439,8 +468,10 @@ public:
* @param a4 the fourth argument to pass to the invoked method
* @param a5 the fifth argument to pass to the invoked method
*/
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleDestroy (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleDestroy (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
/**
* @param f the function to invoke
@@ -450,23 +481,26 @@ public:
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
*/
template <typename T1>
static void ScheduleDestroy (void (*f) (T1), T1 a1);
template <typename U1,
typename T1>
static void ScheduleDestroy (void (*f) (U1), T1 a1);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
* @param a2 the second argument to pass to the function to invoke
*/
template <typename T1, typename T2>
static void ScheduleDestroy (void (*f) (T1,T2), T1 a1, T2 a2);
template <typename U1, typename U2,
typename T1, typename T2>
static void ScheduleDestroy (void (*f) (U1,U2), T1 a1, T2 a2);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
* @param a2 the second argument to pass to the function to invoke
* @param a3 the third argument to pass to the function to invoke
*/
template <typename T1, typename T2, typename T3>
static void ScheduleDestroy (void (*f) (T1,T2,T3), T1 a1, T2 a2, T3 a3);
template <typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
static void ScheduleDestroy (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
@@ -474,8 +508,9 @@ public:
* @param a3 the third argument to pass to the function to invoke
* @param a4 the fourth argument to pass to the function to invoke
*/
template <typename T1, typename T2, typename T3, typename T4>
static void ScheduleDestroy (void (*f) (T1,T2,T3,T4), T1 a1, T2 a2, T3 a3, T4 a4);
template <typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
static void ScheduleDestroy (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
/**
* @param f the function to invoke
* @param a1 the first argument to pass to the function to invoke
@@ -484,8 +519,9 @@ public:
* @param a4 the fourth argument to pass to the function to invoke
* @param a5 the fifth argument to pass to the function to invoke
*/
template <typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleDestroy (void (*f) (T1,T2,T3,T4,T5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
template <typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
static void ScheduleDestroy (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
/**
* Remove an event from the event list.
@@ -535,19 +571,30 @@ private:
template <typename T, typename OBJ>
static EventImpl *MakeEvent (void (T::*mem_ptr) (void), OBJ obj);
template <typename T, typename OBJ, typename T1>
static EventImpl *MakeEvent (void (T::*mem_ptr) (T1), OBJ obj, T1 a1);
template <typename T, typename OBJ, typename T1, typename T2>
static EventImpl *MakeEvent (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2);
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
static EventImpl *MakeEvent (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3);
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
static EventImpl *MakeEvent (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
static EventImpl *MakeEvent (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
template <typename T, typename OBJ,
typename U1,
typename T1>
static EventImpl *MakeEvent (void (T::*mem_ptr) (U1), OBJ obj, T1 a1);
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
static EventImpl *MakeEvent (void (*f) (void));
template <typename U1, typename T1>
template <typename U1,
typename T1>
static EventImpl *MakeEvent (void (*f) (U1), T1 a1);
template <typename U1, typename U2,
typename T1, typename T2>
@@ -625,13 +672,15 @@ EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (void), OBJ obj)
}
template <typename T, typename OBJ, typename T1>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1), OBJ obj, T1 a1)
template <typename T, typename OBJ,
typename U1,
typename T1>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1), OBJ obj, T1 a1)
{
// one argument version
class EventMemberImpl1 : public EventImpl {
public:
typedef void (T::*F)(T1);
typedef void (T::*F)(U1);
EventMemberImpl1 (OBJ obj, F function, T1 a1)
: m_obj (obj),
m_function (function),
@@ -645,18 +694,20 @@ EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1), OBJ obj, T1 a1)
}
OBJ m_obj;
F m_function;
T1 m_a1;
typename TypeTraits<T1>::ReferencedType m_a1;
} *ev = new EventMemberImpl1 (obj, mem_ptr, a1);
return ev;
}
template <typename T, typename OBJ, typename T1, typename T2>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2)
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2)
{
// two argument version
class EventMemberImpl2 : public EventImpl {
public:
typedef void (T::*F)(T1, T2);
typedef void (T::*F)(U1, U2);
EventMemberImpl2 (OBJ obj, F function, T1 a1, T2 a2)
: m_obj (obj),
@@ -672,19 +723,21 @@ EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2
}
OBJ m_obj;
F m_function;
T1 m_a1;
T2 m_a2;
typename TypeTraits<T1>::ReferencedType m_a1;
typename TypeTraits<T2>::ReferencedType m_a2;
} *ev = new EventMemberImpl2 (obj, mem_ptr, a1, a2);
return ev;
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3)
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3)
{
// three argument version
class EventMemberImpl3 : public EventImpl {
public:
typedef void (T::*F)(T1, T2, T3);
typedef void (T::*F)(U1,U2,U3);
EventMemberImpl3 (OBJ obj, F function, T1 a1, T2 a2, T3 a3)
: m_obj (obj),
@@ -701,20 +754,22 @@ EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1,
}
OBJ m_obj;
F m_function;
T1 m_a1;
T2 m_a2;
T3 m_a3;
typename TypeTraits<T1>::ReferencedType m_a1;
typename TypeTraits<T2>::ReferencedType m_a2;
typename TypeTraits<T3>::ReferencedType m_a3;
} *ev = new EventMemberImpl3 (obj, mem_ptr, a1, a2, a3);
return ev;
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
{
// four argument version
class EventMemberImpl4 : public EventImpl {
public:
typedef void (T::*F)(T1, T2, T3, T4);
typedef void (T::*F)(U1, U2, U3, U4);
EventMemberImpl4 (OBJ obj, F function, T1 a1, T2 a2, T3 a3, T4 a4)
: m_obj (obj),
@@ -732,22 +787,24 @@ EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a
}
OBJ m_obj;
F m_function;
T1 m_a1;
T2 m_a2;
T3 m_a3;
T4 m_a4;
typename TypeTraits<T1>::ReferencedType m_a1;
typename TypeTraits<T2>::ReferencedType m_a2;
typename TypeTraits<T3>::ReferencedType m_a3;
typename TypeTraits<T4>::ReferencedType m_a4;
} *ev = new EventMemberImpl4 (obj, mem_ptr, a1, a2, a3, a4);
return ev;
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
{
// five argument version
class EventMemberImpl5 : public EventImpl {
public:
typedef void (T::*F)(T1, T2, T3, T4, T5);
typedef void (T::*F)(U1, U2, U3, U4, U5);
EventMemberImpl5 (OBJ obj, F function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
: m_obj (obj),
@@ -766,11 +823,11 @@ EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
}
OBJ m_obj;
F m_function;
T1 m_a1;
T2 m_a2;
T3 m_a3;
T4 m_a4;
T5 m_a5;
typename TypeTraits<T1>::ReferencedType m_a1;
typename TypeTraits<T2>::ReferencedType m_a2;
typename TypeTraits<T3>::ReferencedType m_a3;
typename TypeTraits<T4>::ReferencedType m_a4;
typename TypeTraits<T5>::ReferencedType m_a5;
} *ev = new EventMemberImpl5 (obj, mem_ptr, a1, a2, a3, a4, a5);
return ev;
}
@@ -925,32 +982,42 @@ EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (void), OBJ ob
}
template <typename T, typename OBJ, typename T1>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (T1), OBJ obj, T1 a1)
template <typename T, typename OBJ,
typename U1,
typename T1>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (U1), OBJ obj, T1 a1)
{
return Schedule (time, MakeEvent (mem_ptr, obj, a1));
}
template <typename T, typename OBJ, typename T1, typename T2>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2)
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2)
{
return Schedule (time, MakeEvent (mem_ptr, obj, a1, a2));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3)
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3)
{
return Schedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
{
return Schedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
{
return Schedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
@@ -1001,73 +1068,88 @@ Simulator::ScheduleNow (void (T::*mem_ptr) (void), OBJ obj)
}
template <typename T, typename OBJ, typename T1>
template <typename T, typename OBJ,
typename U1,
typename T1>
void
Simulator::ScheduleNow (void (T::*mem_ptr) (T1), OBJ obj, T1 a1)
Simulator::ScheduleNow (void (T::*mem_ptr) (U1), OBJ obj, T1 a1)
{
ScheduleNow (MakeEvent (mem_ptr, obj, a1));
}
template <typename T, typename OBJ, typename T1, typename T2>
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
void
Simulator::ScheduleNow (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2)
Simulator::ScheduleNow (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2)
{
ScheduleNow (MakeEvent (mem_ptr, obj, a1, a2));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
void
Simulator::ScheduleNow (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3)
Simulator::ScheduleNow (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3)
{
ScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
void
Simulator::ScheduleNow (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
Simulator::ScheduleNow (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
{
ScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
void
Simulator::ScheduleNow (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
Simulator::ScheduleNow (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
{
ScheduleNow (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
}
template <typename T1>
template <typename U1,
typename T1>
void
Simulator::ScheduleNow (void (*f) (T1), T1 a1)
Simulator::ScheduleNow (void (*f) (U1), T1 a1)
{
ScheduleNow (MakeEvent (f, a1));
}
template <typename T1, typename T2>
template <typename U1, typename U2,
typename T1, typename T2>
void
Simulator::ScheduleNow (void (*f) (T1,T2), T1 a1, T2 a2)
Simulator::ScheduleNow (void (*f) (U1,U2), T1 a1, T2 a2)
{
ScheduleNow (MakeEvent (f, a1, a2));
}
template <typename T1, typename T2, typename T3>
template <typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
void
Simulator::ScheduleNow (void (*f) (T1,T2,T3), T1 a1, T2 a2, T3 a3)
Simulator::ScheduleNow (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
{
ScheduleNow (MakeEvent (f, a1, a2, a3));
}
template <typename T1, typename T2, typename T3, typename T4>
template <typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
void
Simulator::ScheduleNow (void (*f) (T1,T2,T3,T4), T1 a1, T2 a2, T3 a3, T4 a4)
Simulator::ScheduleNow (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
{
ScheduleNow (MakeEvent (f, a1, a2, a3, a4));
}
template <typename T1, typename T2, typename T3, typename T4, typename T5>
template <typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
void
Simulator::ScheduleNow (void (*f) (T1,T2,T3,T4,T5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
Simulator::ScheduleNow (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
{
ScheduleNow (MakeEvent (f, a1, a2, a3, a4, a5));
}
@@ -1082,73 +1164,88 @@ Simulator::ScheduleDestroy (void (T::*mem_ptr) (void), OBJ obj)
}
template <typename T, typename OBJ, typename T1>
template <typename T, typename OBJ,
typename U1,
typename T1>
void
Simulator::ScheduleDestroy (void (T::*mem_ptr) (T1), OBJ obj, T1 a1)
Simulator::ScheduleDestroy (void (T::*mem_ptr) (U1), OBJ obj, T1 a1)
{
ScheduleDestroy (MakeEvent (mem_ptr, obj, a1));
}
template <typename T, typename OBJ, typename T1, typename T2>
template <typename T, typename OBJ,
typename U1, typename U2,
typename T1, typename T2>
void
Simulator::ScheduleDestroy (void (T::*mem_ptr) (T1,T2), OBJ obj, T1 a1, T2 a2)
Simulator::ScheduleDestroy (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2)
{
ScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3>
template <typename T, typename OBJ,
typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
void
Simulator::ScheduleDestroy (void (T::*mem_ptr) (T1,T2,T3), OBJ obj, T1 a1, T2 a2, T3 a3)
Simulator::ScheduleDestroy (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3)
{
ScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4>
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
void
Simulator::ScheduleDestroy (void (T::*mem_ptr) (T1,T2,T3,T4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
Simulator::ScheduleDestroy (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
{
ScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
}
template <typename T, typename OBJ, typename T1, typename T2, typename T3, typename T4, typename T5>
template <typename T, typename OBJ,
typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
void
Simulator::ScheduleDestroy (void (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ obj,
Simulator::ScheduleDestroy (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj,
T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
{
ScheduleDestroy (MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
}
template <typename T1>
template <typename U1,
typename T1>
void
Simulator::ScheduleDestroy (void (*f) (T1), T1 a1)
Simulator::ScheduleDestroy (void (*f) (U1), T1 a1)
{
ScheduleDestroy (MakeEvent (f, a1));
}
template <typename T1, typename T2>
template <typename U1, typename U2,
typename T1, typename T2>
void
Simulator::ScheduleDestroy (void (*f) (T1,T2), T1 a1, T2 a2)
Simulator::ScheduleDestroy (void (*f) (U1,U2), T1 a1, T2 a2)
{
ScheduleDestroy (MakeEvent (f, a1, a2));
}
template <typename T1, typename T2, typename T3>
template <typename U1, typename U2, typename U3,
typename T1, typename T2, typename T3>
void
Simulator::ScheduleDestroy (void (*f) (T1,T2,T3), T1 a1, T2 a2, T3 a3)
Simulator::ScheduleDestroy (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
{
ScheduleDestroy (MakeEvent (f, a1, a2, a3));
}
template <typename T1, typename T2, typename T3, typename T4>
template <typename U1, typename U2, typename U3, typename U4,
typename T1, typename T2, typename T3, typename T4>
void
Simulator::ScheduleDestroy (void (*f) (T1,T2,T3,T4), T1 a1, T2 a2, T3 a3, T4 a4)
Simulator::ScheduleDestroy (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
{
ScheduleDestroy (MakeEvent (f, a1, a2, a3, a4));
}
template <typename T1, typename T2, typename T3, typename T4, typename T5>
template <typename U1, typename U2, typename U3, typename U4, typename U5,
typename T1, typename T2, typename T3, typename T4, typename T5>
void
Simulator::ScheduleDestroy (void (*f) (T1,T2,T3,T4,T5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
Simulator::ScheduleDestroy (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
{
ScheduleDestroy (MakeEvent (f, a1, a2, a3, a4, a5));
}