template< typename T, typename R >
class Closure0 : public Closure
{
protected:
typedef boost::function<R (T& )> FT;
T& m_Obj;
FT m_Function;
public:
Closure0( T& obj, FT func ) : m_Obj(obj), m_Function(func) { }
virtual ~Closure0() { }
virtual void Execute() {
m_Function( m_Obj );
}
};
template< typename T, typename R >
Closure* MakeClosure( T& obj, R (T::*func)( ) )
{
return new Closure0 < T, R > ( obj, func );
}
template< typename T, typename R , typename A0 >
class Closure1 : public Closure
{
protected:
typedef boost::function<R (T& , A0 )> FT;
T& m_Obj;
FT m_Function;
A0 m_A0;
public:
Closure1( T& obj, FT func , A0 a0 )
: m_Obj(obj), m_Function(func) , m_A0( a0 ) { }
virtual ~Closure1() { }
virtual void Execute() {
m_Function( m_Obj , m_A0 );
}
};
template< typename T, typename R , typename A0 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 ) , A0 a0 )
{
return new Closure1 < T, R , A0> ( obj, func , a0 );
}
template< typename T, typename R , typename A0 , typename A1 >
class Closure2 : public Closure
{
protected:
typedef boost::function<R (T& , A0 , A1 )> FT;
T& m_Obj;
FT m_Function;
A0 m_A0;
A1 m_A1;
public:
Closure2( T& obj, FT func , A0 a0 , A1 a1 )
: m_Obj(obj), m_Function(func) , m_A0( a0 ) , m_A1( a1 ) { }
virtual ~Closure2() { }
virtual void Execute() {
m_Function( m_Obj , m_A0 , m_A1 );
}
};
template< typename T, typename R , typename A0 , typename A1 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 , A1 a1 ) , A0 a0 , A1 a1 )
{
return new Closure2 < T, R , A0 , A1> ( obj, func , a0 , a1 );
}
template< typename T, typename R , typename A0 , typename A1 , typename A2 >
class Closure3 : public Closure
{
protected:
typedef boost::function<R (T& , A0 , A1 , A2 )> FT;
T& m_Obj;
FT m_Function;
A0 m_A0;
A1 m_A1;
A2 m_A2;
public:
Closure3( T& obj, FT func , A0 a0 , A1 a1 , A2 a2 )
: m_Obj(obj), m_Function(func) , m_A0( a0 ) , m_A1( a1 ) ,
m_A2( a2 ) { }
virtual ~Closure3() { }
virtual void Execute() {
m_Function( m_Obj , m_A0 , m_A1 , m_A2 );
}
};
template< typename T, typename R , typename A0 , typename A1 , typename A2 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 , A1 a1 , A2 a2 ) , A0 a0 ,
A1 a1 , A2 a2 )
{
return new Closure3 < T, R , A0 , A1 , A2> ( obj, func , a0 , a1 , a2 );
}
template< typename T, typename R , typename A0 , typename A1 , typename A2 ,
typename A3 >
class Closure4 : public Closure
{
protected:
typedef boost::function<R (T& , A0 , A1 , A2 , A3 )> FT;
T& m_Obj;
FT m_Function;
A0 m_A0;
A1 m_A1;
A2 m_A2;
A3 m_A3;
public:
Closure4( T& obj, FT func , A0 a0 , A1 a1 , A2 a2 , A3 a3 )
: m_Obj(obj), m_Function(func) , m_A0( a0 ) , m_A1( a1 ) ,
m_A2( a2 ) , m_A3( a3 ) { }
virtual ~Closure4() { }
virtual void Execute() {
m_Function( m_Obj , m_A0 , m_A1 , m_A2 , m_A3 );
}
};
template< typename T, typename R , typename A0 , typename A1 , typename A2 ,
typename A3 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 , A1 a1 , A2 a2 , A3 a3 ) ,
A0 a0 , A1 a1 , A2 a2 , A3 a3 ) {
return new Closure4 < T, R , A0 , A1 , A2 , A3> ( obj, func , a0 , a1 , a2 ,
a3 );
}