src/simulator/timer.h
changeset 1941 c4eb28d51689
parent 1695 fa84cc049e9c
child 1972 2ff527c2643d
--- a/src/simulator/timer.h	Tue Oct 09 11:38:01 2007 +0100
+++ b/src/simulator/timer.h	Wed Oct 10 13:18:15 2007 +0200
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2005,2007 INRIA
+ * Copyright (c) 2007 INRIA
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -256,35 +256,6 @@
   void Resume (void);
 
 private:
-  template <typename FN>
-  void DoSetFunction (IntToType<0>, FN fn);
-  template <typename FN>
-  void DoSetFunction (IntToType<1>, FN fn);
-  template <typename FN>
-  void DoSetFunction (IntToType<2>, FN fn);
-  template <typename FN>
-  void DoSetFunction (IntToType<3>, FN fn);
-  template <typename FN>
-  void DoSetFunction (IntToType<4>, FN fn);
-  template <typename FN>
-  void DoSetFunction (IntToType<5>, FN fn);
-  template <typename FN>
-  void DoSetFunction (IntToType<6>, FN fn);
-
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<0>, MEM_PTR memPtr, OBJ_PTR objPtr);
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<1>, MEM_PTR memPtr, OBJ_PTR objPtr);
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<2>, MEM_PTR memPtr, OBJ_PTR objPtr);
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<3>, MEM_PTR memPtr, OBJ_PTR objPtr);
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<4>, MEM_PTR memPtr, OBJ_PTR objPtr);
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<5>, MEM_PTR memPtr, OBJ_PTR objPtr);
-  template <typename MEM_PTR, typename OBJ_PTR>
-  void DoSetFunction (IntToType<6>, MEM_PTR memPtr, OBJ_PTR objPtr);
 
   enum {
     TIMER_SUSPENDED = (1<<7)
@@ -299,569 +270,26 @@
 
 } // namespace ns3
 
-
-// The actual implementation.
-#include "simulator.h"
-#include "ns3/type-traits.h"
+#include "timer-impl.h"
 
 namespace ns3 {
 
 
-template <typename T>
-struct TimerTraits
-{
-  typedef typename TypeTraits<typename TypeTraits<T>::ReferencedType>::NonConstType StoredType;
-  typedef const StoredType &ParameterType;
-};
-
-class TimerImpl
-{
-public:
-  virtual ~TimerImpl () {}
-  virtual EventId Schedule (const Time &delay) = 0;
-};
-
-
-template <typename T1>
-struct TimerImplOne : public TimerImpl
-{
-  virtual void SetArguments (T1 a1) = 0;
-};
-template <typename T1, typename T2>
-struct TimerImplTwo : public TimerImpl
-{
-  virtual void SetArguments (T1 a1,T2 a2) = 0;
-};
-template <typename T1, typename T2, typename T3>
-struct TimerImplThree : public TimerImpl
-{
-  virtual void SetArguments (T1 a1,T2 a2,T3 a3) = 0;
-};
-template <typename T1, typename T2, typename  T3, typename T4>
-struct TimerImplFour : public TimerImpl
-{
-  virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4) = 0;
-};
-template <typename T1, typename T2, typename  T3, typename T4, typename T5>
-struct TimerImplFive : public TimerImpl
-{
-  virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5) = 0;
-};
-template <typename T1, typename T2, typename  T3, typename T4, typename T5, typename T6>
-struct TimerImplSix : public TimerImpl
-{
-  virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5, T6 a6) = 0;
-};
-
-
 template <typename FN>
 void 
 Timer::SetFunction (FN fn)
 {
-  NS_ASSERT (TypeTraits<FN>::IsFunctionPointer);
-  DoSetFunction (IntToType<TypeTraits<FN>::FunctionPointerTraits::nArgs> (), fn);
-}
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<0>, FN fn)
-{
-  struct FnTimerImplZero : public TimerImpl
-  {
-    FnTimerImplZero (FN fn) 
-      : m_fn (fn) {}
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn);
-    }
-    FN m_fn;
-  } *function = new FnTimerImplZero (fn);
   delete m_impl;
-  m_impl = function;
-}
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<1>, FN fn)
-{
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-
-  struct FnTimerImplOne : public TimerImplOne<T1Parameter>
-  {
-    FnTimerImplOne (FN fn) 
-      : m_fn (fn) {}
-    virtual void SetArguments (T1Parameter a1) {
-      m_a1 = a1;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn, m_a1);
-    }
-    FN m_fn;
-    T1Stored m_a1;
-  } *function = new FnTimerImplOne (fn);
-  delete m_impl;
-  m_impl = function;  
-}
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<2>, FN fn)
-{
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-
-  struct FnTimerImplTwo : public TimerImplTwo<T1Parameter,T2Parameter>
-  {
-    FnTimerImplTwo (FN fn) 
-      : m_fn (fn) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2) {
-      m_a1 = a1;
-      m_a2 = a2;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn, m_a1, m_a2);
-    }
-    FN m_fn;
-    T1Stored m_a1;
-    T2Stored m_a2;
-  } *function = new FnTimerImplTwo (fn);
-  delete m_impl;
-  m_impl = function;  
-}
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<3>, FN fn)
-{
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-
-  struct FnTimerImplThree : public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
-  {
-    FnTimerImplThree (FN fn) 
-      : m_fn (fn) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3);
-    }
-    FN m_fn;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-  } *function = new FnTimerImplThree (fn);
-  delete m_impl;
-  m_impl = function;  
+  m_impl = MakeTimerImpl (fn);
 }
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<4>, FN fn)
-{
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg4Type T4;
-  typedef typename TimerTraits<T4>::ParameterType T4Parameter;
-  typedef typename TimerTraits<T4>::StoredType T4Stored;
-
-  struct FnTimerImplFour : public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
-  {
-    FnTimerImplFour (FN fn) 
-      : m_fn (fn) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-      m_a4 = a4;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4);
-    }
-    FN m_fn;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-    T4Stored m_a4;
-  } *function = new FnTimerImplFour (fn);
-  delete m_impl;
-  m_impl = function;  
-}
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<5>, FN fn)
-{
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg4Type T4;
-  typedef typename TimerTraits<T4>::ParameterType T4Parameter;
-  typedef typename TimerTraits<T4>::StoredType T4Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg5Type T5;
-  typedef typename TimerTraits<T5>::ParameterType T5Parameter;
-  typedef typename TimerTraits<T5>::StoredType T5Stored;
-
-  struct FnTimerImplFive : public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
-  {
-    FnTimerImplFive (FN fn) 
-      : m_fn (fn) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-      m_a4 = a4;
-      m_a5 = a5;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5);
-    }
-    FN m_fn;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-    T4Stored m_a4;
-    T5Stored m_a5;
-  } *function = new FnTimerImplFive (fn);
-  delete m_impl;
-  m_impl = function;  
-}
-
-template <typename FN>
-void 
-Timer::DoSetFunction (IntToType<6>, FN fn)
-{
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg4Type T4;
-  typedef typename TimerTraits<T4>::ParameterType T4Parameter;
-  typedef typename TimerTraits<T4>::StoredType T4Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg5Type T5;
-  typedef typename TimerTraits<T5>::ParameterType T5Parameter;
-  typedef typename TimerTraits<T5>::StoredType T5Stored;
-  typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg6Type T6;
-  typedef typename TimerTraits<T6>::ParameterType T6Parameter;
-  typedef typename TimerTraits<T6>::StoredType T6Stored;
-
-  struct FnTimerImplSix : public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
-  {
-    FnTimerImplSix (FN fn) 
-      : m_fn (fn) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5, T6Parameter a6) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-      m_a4 = a4;
-      m_a5 = a5;
-      m_a6 = a6;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
-    }
-    FN m_fn;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-    T4Stored m_a4;
-    T5Stored m_a5;
-    T6Stored m_a6;
-  } *function = new FnTimerImplSix (fn);
-  delete m_impl;
-  m_impl = function;  
-}
-
 template <typename MEM_PTR, typename OBJ_PTR>
 void 
 Timer::SetFunction (MEM_PTR memPtr, OBJ_PTR objPtr)
 {
-  NS_ASSERT (TypeTraits<MEM_PTR>::IsPointerToMember);
-  DoSetFunction (IntToType<TypeTraits<MEM_PTR>::PointerToMemberTraits::nArgs> () , memPtr, objPtr);
-}
-
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<0>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  struct MemFnTimerImplZero : public TimerImpl
-  {
-    MemFnTimerImplZero (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-  } *function = new MemFnTimerImplZero (memPtr, objPtr);
   delete m_impl;
-  m_impl = function;    
-}
-
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<1>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  
-  struct MemFnTimerImplOne : public TimerImplOne<T1Parameter>
-  {
-    MemFnTimerImplOne (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual void SetArguments (T1Parameter a1) {
-      m_a1 = a1;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-    T1Stored m_a1;
-  } *function = new MemFnTimerImplOne (memPtr, objPtr);
-  delete m_impl;
-  m_impl = function;    
-}
-
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<2>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  
-  struct MemFnTimerImplTwo : public TimerImplTwo<T1Parameter,T2Parameter>
-  {
-    MemFnTimerImplTwo (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2) {
-      m_a1 = a1;
-      m_a2 = a2;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-    T1Stored m_a1;
-    T2Stored m_a2;
-  } *function = new MemFnTimerImplTwo (memPtr, objPtr);
-  delete m_impl;
-  m_impl = function;    
-}
-
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<3>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  
-  struct MemFnTimerImplThree : public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
-  {
-    MemFnTimerImplThree (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-  } *function = new MemFnTimerImplThree (memPtr, objPtr);
-  delete m_impl;
-  m_impl = function;    
+  m_impl = MakeTimerImpl (memPtr, objPtr);
 }
 
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<4>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg4Type T4;
-  typedef typename TimerTraits<T4>::ParameterType T4Parameter;
-  typedef typename TimerTraits<T4>::StoredType T4Stored;
-  
-  struct MemFnTimerImplFour : public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
-  {
-    MemFnTimerImplFour (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-      m_a4 = a4;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-    T4Stored m_a4;
-  } *function = new MemFnTimerImplFour (memPtr, objPtr);
-  delete m_impl;
-  m_impl = function;    
-}
-
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<5>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg4Type T4;
-  typedef typename TimerTraits<T4>::ParameterType T4Parameter;
-  typedef typename TimerTraits<T4>::StoredType T4Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg5Type T5;
-  typedef typename TimerTraits<T5>::ParameterType T5Parameter;
-  typedef typename TimerTraits<T5>::StoredType T5Stored;
-  
-  struct MemFnTimerImplFive : public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
-  {
-    MemFnTimerImplFive (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-      m_a4 = a4;
-      m_a5 = a5;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-    T4Stored m_a4;
-    T5Stored m_a5;
-  } *function = new MemFnTimerImplFive (memPtr, objPtr);
-  delete m_impl;
-  m_impl = function;    
-}
-
-template <typename MEM_PTR, typename OBJ_PTR>
-void 
-Timer::DoSetFunction (IntToType<6>, MEM_PTR memPtr, OBJ_PTR objPtr)
-{
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
-  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
-  typedef typename TimerTraits<T1>::StoredType T1Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
-  typedef typename TimerTraits<T2>::ParameterType T2Parameter;
-  typedef typename TimerTraits<T2>::StoredType T2Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
-  typedef typename TimerTraits<T3>::ParameterType T3Parameter;
-  typedef typename TimerTraits<T3>::StoredType T3Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg4Type T4;
-  typedef typename TimerTraits<T4>::ParameterType T4Parameter;
-  typedef typename TimerTraits<T4>::StoredType T4Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg5Type T5;
-  typedef typename TimerTraits<T5>::ParameterType T5Parameter;
-  typedef typename TimerTraits<T5>::StoredType T5Stored;
-  typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg6Type T6;
-  typedef typename TimerTraits<T6>::ParameterType T6Parameter;
-  typedef typename TimerTraits<T6>::StoredType T6Stored;
-  
-  struct MemFnTimerImplSix : public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
-  {
-    MemFnTimerImplSix (MEM_PTR memPtr, OBJ_PTR objPtr) 
-      : m_memPtr (memPtr), m_objPtr (objPtr) {}
-    virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5,T6Parameter a6) {
-      m_a1 = a1;
-      m_a2 = a2;
-      m_a3 = a3;
-      m_a4 = a4;
-      m_a5 = a5;
-      m_a6 = a6;
-    }
-    virtual EventId Schedule (const Time &delay) {
-      return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
-    }
-    MEM_PTR m_memPtr;
-    OBJ_PTR m_objPtr;
-    T1Stored m_a1;
-    T2Stored m_a2;
-    T3Stored m_a3;
-    T4Stored m_a4;
-    T5Stored m_a5;
-    T6Stored m_a6;
-  } *function = new MemFnTimerImplSix (memPtr, objPtr);
-  delete m_impl;
-  m_impl = function;    
-}
-
-
 template <typename T1>
 void 
 Timer::SetArguments (T1 a1)
@@ -871,18 +299,8 @@
       NS_FATAL_ERROR ("You cannot set the arguments of a Timer before setting its function.");
       return;
     }
-  typedef struct TimerImplOne<
-    typename TimerTraits<T1>::ParameterType
-    > TimerImplBase;
-  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (m_impl);
-  if (impl == 0)
-    {
-      NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
-      return;
-    }
-  impl->SetArguments (a1);
+  m_impl->SetArgs (a1);
 }
-
 template <typename T1, typename T2>
 void 
 Timer::SetArguments (T1 a1, T2 a2)
@@ -892,17 +310,7 @@
       NS_FATAL_ERROR ("You cannot set the arguments of a Timer before setting its function.");
       return;
     }
-  typedef struct TimerImplTwo<
-    typename TimerTraits<T1>::ParameterType,
-    typename TimerTraits<T2>::ParameterType
-    > TimerImplBase;
-  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (m_impl);
-  if (impl == 0)
-    {
-      NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
-      return;
-    }
-  impl->SetArguments (a1, a2);
+  m_impl->SetArgs (a1, a2);
 }
 
 template <typename T1, typename T2, typename T3>
@@ -914,18 +322,7 @@
       NS_FATAL_ERROR ("You cannot set the arguments of a Timer before setting its function.");
       return;
     }
-  typedef struct TimerImplThree<
-    typename TimerTraits<T1>::ParameterType,
-    typename TimerTraits<T2>::ParameterType,
-    typename TimerTraits<T3>::ParameterType
-    > TimerImplBase;
-  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (m_impl);
-  if (impl == 0)
-    {
-      NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
-      return;
-    }
-  impl->SetArguments (a1, a2, a3);
+  m_impl->SetArgs (a1, a2, a3);
 }
 
 template <typename T1, typename T2, typename T3, typename T4>
@@ -937,19 +334,7 @@
       NS_FATAL_ERROR ("You cannot set the arguments of a Timer before setting its function.");
       return;
     }
-  typedef struct TimerImplFour<
-    typename TimerTraits<T1>::ParameterType,
-    typename TimerTraits<T2>::ParameterType,
-    typename TimerTraits<T3>::ParameterType,
-    typename TimerTraits<T4>::ParameterType
-    > TimerImplBase;
-  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (m_impl);
-  if (impl == 0)
-    {
-      NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
-      return;
-    }
-  impl->SetArguments (a1, a2, a3, a4);
+  m_impl->SetArgs (a1, a2, a3, a4);
 }
 
 template <typename T1, typename T2, typename T3, typename T4, typename T5>
@@ -961,20 +346,7 @@
       NS_FATAL_ERROR ("You cannot set the arguments of a Timer before setting its function.");
       return;
     }
-  typedef struct TimerImplFive<
-    typename TimerTraits<T1>::ParameterType,
-    typename TimerTraits<T2>::ParameterType,
-    typename TimerTraits<T3>::ParameterType,
-    typename TimerTraits<T4>::ParameterType,
-    typename TimerTraits<T5>::ParameterType
-    > TimerImplBase;
-  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (m_impl);
-  if (impl == 0)
-    {
-      NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
-      return;
-    }
-  impl->SetArguments (a1, a2, a3, a4, a5);
+  m_impl->SetArgs (a1, a2, a3, a4, a5);
 }
 
 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
@@ -986,25 +358,9 @@
       NS_FATAL_ERROR ("You cannot set the arguments of a Timer before setting its function.");
       return;
     }
-  typedef struct TimerImplSix<
-    typename TimerTraits<T1>::ParameterType,
-    typename TimerTraits<T2>::ParameterType,
-    typename TimerTraits<T3>::ParameterType,
-    typename TimerTraits<T4>::ParameterType,
-    typename TimerTraits<T5>::ParameterType,
-    typename TimerTraits<T6>::ParameterType
-    > TimerImplBase;
-  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (m_impl);
-  if (impl == 0)
-    {
-      NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
-      return;
-    }
-  impl->SetArguments (a1, a2, a3, a4, a5, a6);
+  m_impl->SetArgs (a1, a2, a3, a4, a5, a6);
 }
 
-
-
 } // namespace ns3
 
 #endif /* TIMER_H */