/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * 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 * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Mathieu Lacage */ #ifndef TIMER_IMPL_H #define TIMER_IMPL_H #include "simulator.h" #include "ns3/type-traits.h" #include "ns3/fatal-error.h" #include "ns3/int-to-type.h" namespace ns3 { class TimerImpl { public: virtual ~TimerImpl () {} template void SetArgs (T1 a1); template void SetArgs (T1 a1, T2 a2); template void SetArgs (T1 a1, T2 a2, T3 a3); template void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4); template void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5); template void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6); virtual EventId Schedule (const Time &delay) = 0; virtual void Invoke (void) = 0; }; template struct TimerImplOne : public TimerImpl { virtual void SetArguments (T1 a1) = 0; }; template struct TimerImplTwo : public TimerImpl { virtual void SetArguments (T1 a1,T2 a2) = 0; }; template struct TimerImplThree : public TimerImpl { virtual void SetArguments (T1 a1,T2 a2,T3 a3) = 0; }; template struct TimerImplFour : public TimerImpl { virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4) = 0; }; template struct TimerImplFive : public TimerImpl { virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5) = 0; }; template struct TimerImplSix : public TimerImpl { virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5, T6 a6) = 0; }; template struct TimerTraits { typedef typename TypeTraits::ReferencedType>::NonConstType StoredType; typedef const StoredType &ParameterType; }; template TimerImpl * MakeTimerImpl (FN fn) { NS_ASSERT (TypeTraits::IsFunctionPointer); return MakeTimerImpl (IntToType::FunctionPointerTraits::nArgs> (), fn); } template TimerImpl * MakeTimerImpl (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); } virtual void Invoke (void) { m_fn (); } FN m_fn; } *function = new FnTimerImplZero (fn); return function; } template TimerImpl * MakeTimerImpl (IntToType<1>, FN fn) { typedef typename TypeTraits::FunctionPointerTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; struct FnTimerImplOne : public TimerImplOne { 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); } virtual void Invoke (void) { m_fn (m_a1); } FN m_fn; T1Stored m_a1; } *function = new FnTimerImplOne (fn); return function; } template TimerImpl * MakeTimerImpl (IntToType<2>, FN fn) { typedef typename TypeTraits::FunctionPointerTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; struct FnTimerImplTwo : public TimerImplTwo { 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); } virtual void Invoke (void) { m_fn (m_a1, m_a2); } FN m_fn; T1Stored m_a1; T2Stored m_a2; } *function = new FnTimerImplTwo (fn); return function; } template TimerImpl * MakeTimerImpl (IntToType<3>, FN fn) { typedef typename TypeTraits::FunctionPointerTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; struct FnTimerImplThree : public TimerImplThree { 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); } virtual void Invoke (void) { m_fn (m_a1, m_a2, m_a3); } FN m_fn; T1Stored m_a1; T2Stored m_a2; T3Stored m_a3; } *function = new FnTimerImplThree (fn); return function; } template TimerImpl * MakeTimerImpl (IntToType<4>, FN fn) { typedef typename TypeTraits::FunctionPointerTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg4Type T4; typedef typename TimerTraits::ParameterType T4Parameter; typedef typename TimerTraits::StoredType T4Stored; struct FnTimerImplFour : public TimerImplFour { 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); } virtual void Invoke (void) { 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); return function; } template TimerImpl * MakeTimerImpl (IntToType<5>, FN fn) { typedef typename TypeTraits::FunctionPointerTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg4Type T4; typedef typename TimerTraits::ParameterType T4Parameter; typedef typename TimerTraits::StoredType T4Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg5Type T5; typedef typename TimerTraits::ParameterType T5Parameter; typedef typename TimerTraits::StoredType T5Stored; struct FnTimerImplFive : public TimerImplFive { 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); } virtual void Invoke (void) { 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); return function; } template TimerImpl * MakeTimerImpl (IntToType<6>, FN fn) { typedef typename TypeTraits::FunctionPointerTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg4Type T4; typedef typename TimerTraits::ParameterType T4Parameter; typedef typename TimerTraits::StoredType T4Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg5Type T5; typedef typename TimerTraits::ParameterType T5Parameter; typedef typename TimerTraits::StoredType T5Stored; typedef typename TypeTraits::FunctionPointerTraits::Arg6Type T6; typedef typename TimerTraits::ParameterType T6Parameter; typedef typename TimerTraits::StoredType T6Stored; struct FnTimerImplSix : public TimerImplSix { 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); } virtual void Invoke (void) { 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); return function; } template struct TimerImplMemberTraits; template struct TimerImplMemberTraits { static T &GetReference (T *p) { return *p; } }; template TimerImpl * MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr) { NS_ASSERT (TypeTraits::IsPointerToMember); return MakeTimerImpl (IntToType::PointerToMemberTraits::nArgs> () , memPtr, objPtr); } template TimerImpl * MakeTimerImpl (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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (); } MEM_PTR m_memPtr; OBJ_PTR m_objPtr; } *function = new MemFnTimerImplZero (memPtr, objPtr); return function; } template TimerImpl * MakeTimerImpl (IntToType<1>, MEM_PTR memPtr, OBJ_PTR objPtr) { typedef typename TypeTraits::PointerToMemberTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; struct MemFnTimerImplOne : public TimerImplOne { 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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (m_a1); } MEM_PTR m_memPtr; OBJ_PTR m_objPtr; T1Stored m_a1; } *function = new MemFnTimerImplOne (memPtr, objPtr); return function; } template TimerImpl * MakeTimerImpl (IntToType<2>, MEM_PTR memPtr, OBJ_PTR objPtr) { typedef typename TypeTraits::PointerToMemberTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; struct MemFnTimerImplTwo : public TimerImplTwo { 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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2); } MEM_PTR m_memPtr; OBJ_PTR m_objPtr; T1Stored m_a1; T2Stored m_a2; } *function = new MemFnTimerImplTwo (memPtr, objPtr); return function; } template TimerImpl * MakeTimerImpl (IntToType<3>, MEM_PTR memPtr, OBJ_PTR objPtr) { typedef typename TypeTraits::PointerToMemberTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; struct MemFnTimerImplThree : public TimerImplThree { 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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (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); return function; } template TimerImpl * MakeTimerImpl (IntToType<4>, MEM_PTR memPtr, OBJ_PTR objPtr) { typedef typename TypeTraits::PointerToMemberTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg4Type T4; typedef typename TimerTraits::ParameterType T4Parameter; typedef typename TimerTraits::StoredType T4Stored; struct MemFnTimerImplFour : public TimerImplFour { 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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (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); return function; } template TimerImpl * MakeTimerImpl (IntToType<5>, MEM_PTR memPtr, OBJ_PTR objPtr) { typedef typename TypeTraits::PointerToMemberTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg4Type T4; typedef typename TimerTraits::ParameterType T4Parameter; typedef typename TimerTraits::StoredType T4Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg5Type T5; typedef typename TimerTraits::ParameterType T5Parameter; typedef typename TimerTraits::StoredType T5Stored; struct MemFnTimerImplFive : public TimerImplFive { 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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (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); return function; } template TimerImpl * MakeTimerImpl (IntToType<6>, MEM_PTR memPtr, OBJ_PTR objPtr) { typedef typename TypeTraits::PointerToMemberTraits::Arg1Type T1; typedef typename TimerTraits::ParameterType T1Parameter; typedef typename TimerTraits::StoredType T1Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg2Type T2; typedef typename TimerTraits::ParameterType T2Parameter; typedef typename TimerTraits::StoredType T2Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg3Type T3; typedef typename TimerTraits::ParameterType T3Parameter; typedef typename TimerTraits::StoredType T3Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg4Type T4; typedef typename TimerTraits::ParameterType T4Parameter; typedef typename TimerTraits::StoredType T4Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg5Type T5; typedef typename TimerTraits::ParameterType T5Parameter; typedef typename TimerTraits::StoredType T5Stored; typedef typename TypeTraits::PointerToMemberTraits::Arg6Type T6; typedef typename TimerTraits::ParameterType T6Parameter; typedef typename TimerTraits::StoredType T6Stored; struct MemFnTimerImplSix : public TimerImplSix { 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); } virtual void Invoke (void) { (TimerImplMemberTraits::GetReference (m_objPtr).*m_memPtr) (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); return function; } template void TimerImpl::SetArgs (T1 a1) { typedef struct TimerImplOne< typename TimerTraits::ParameterType > TimerImplBase; TimerImplBase *impl = dynamic_cast (this); if (impl == 0) { NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function."); return; } impl->SetArguments (a1); } template void TimerImpl::SetArgs (T1 a1, T2 a2) { typedef struct TimerImplTwo< typename TimerTraits::ParameterType, typename TimerTraits::ParameterType > TimerImplBase; TimerImplBase *impl = dynamic_cast (this); if (impl == 0) { NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function."); return; } impl->SetArguments (a1, a2); } template void TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3) { typedef struct TimerImplThree< typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType > TimerImplBase; TimerImplBase *impl = dynamic_cast (this); if (impl == 0) { NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function."); return; } impl->SetArguments (a1, a2, a3); } template void TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4) { typedef struct TimerImplFour< typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType > TimerImplBase; TimerImplBase *impl = dynamic_cast (this); if (impl == 0) { NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function."); return; } impl->SetArguments (a1, a2, a3, a4); } template void TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) { typedef struct TimerImplFive< typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType > TimerImplBase; TimerImplBase *impl = dynamic_cast (this); if (impl == 0) { NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function."); return; } impl->SetArguments (a1, a2, a3, a4, a5); } template void TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) { typedef struct TimerImplSix< typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType, typename TimerTraits::ParameterType > TimerImplBase; TimerImplBase *impl = dynamic_cast (this); 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); } } // namespace ns3 #endif /* TIMER_IMPL_H */