#pragma once
#include "KRYObject.h"
template<typename R> class KRYFunction{};
template<typename R>
class KRYFunction < R() >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()() = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)()) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()() { return m_handler(); }
private:
R(*m_handler)();
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)())
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()()
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)();
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)();
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()()
{
return (*m_fun)();
}
template<typename C>
void set(C* target, R(C::*handler)())
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)())
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};
template<typename R, typename P1>
class KRYFunction < R(P1) >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()(P1) = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)(P1)) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()(P1 p1) { return m_handler(p1); }
private:
R(*m_handler)(P1);
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)(P1))
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()(P1 p1)
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)(p1);
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)(P1);
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()(P1 p1)
{
return (*m_fun)(p1);
}
template<typename C>
void set(C* target, R(C::*handler)(P1))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)(P1))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};
template<typename R, typename P1, typename P2>
class KRYFunction < R(P1, P2) >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()(P1, P2) = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)(P1, P2)) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()(P1 p1, P2 p2) { return m_handler(p1, p2); }
private:
R(*m_handler)(P1, P2);
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)(P1, P2))
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()(P1 p1, P2 p2)
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)(p1, p2);
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)(P1, P2);
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()(P1 p1, P2 p2)
{
return (*m_fun)(p1, p2);
}
template<typename C>
void set(C* target, R(C::*handler)(P1, P2))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)(P1, P2))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};
template<typename R, typename P1, typename P2, typename P3>
class KRYFunction < R(P1, P2, P3) >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()(P1, P2, P3) = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)(P1, P2, P3)) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3) { return m_handler(p1, p2, p3); }
private:
R(*m_handler)(P1, P2, P3);
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)(P1, P2, P3))
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3)
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)(p1, p2, p3);
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)(P1, P2, P3);
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()(P1 p1, P2 p2, P3 p3)
{
return (*m_fun)(p1, p2, p3);
}
template<typename C>
void set(C* target, R(C::*handler)(P1, P2, P3))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)(P1, P2, P3))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};
template<typename R, typename P1, typename P2, typename P3, typename P4>
class KRYFunction < R(P1, P2, P3, P4) >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()(P1, P2, P3, P4) = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)(P1, P2, P3, P4)) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4) { return m_handler(p1, p2, p3, p4); }
private:
R(*m_handler)(P1, P2, P3, P4);
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)(P1, P2, P3, P4))
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4)
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)(p1, p2, p3, p4);
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)(P1, P2, P3, P4);
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4)
{
return (*m_fun)(p1, p2, p3, p4);
}
template<typename C>
void set(C* target, R(C::*handler)(P1, P2, P3, P4))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)(P1, P2, P3, P4))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};
template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
class KRYFunction < R(P1, P2, P3, P4, P5) >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()(P1, P2, P3, P4, P5) = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)(P1, P2, P3, P4, P5)) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { return m_handler(p1, p2, p3, p4, p5); }
private:
R(*m_handler)(P1, P2, P3, P4, P5);
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)(P1, P2, P3, P4, P5))
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)(p1, p2, p3, p4, p5);
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)(P1, P2, P3, P4, P5);
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
{
return (*m_fun)(p1, p2, p3, p4, p5);
}
template<typename C>
void set(C* target, R(C::*handler)(P1, P2, P3, P4, P5))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)(P1, P2, P3, P4, P5))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};
template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
class KRYFunction < R(P1, P2, P3, P4, P5, P6) >
{
private:
class FunctionBase
{
public:
virtual ~FunctionBase(){}
virtual R operator ()(P1, P2, P3, P4, P5, P6) = 0;
virtual bool able() = 0;
};
class GlobalFunction :public FunctionBase
{
public:
GlobalFunction(R(*handler)(P1, P2, P3, P4, P5, P6)) { m_handler = handler; }
bool able() { return 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { return m_handler(p1, p2, p3, p4, p5, p6); }
private:
R(*m_handler)(P1, P2, P3, P4, P5, P6);
};
template<typename C>
class MemberFunction :public FunctionBase
{
public:
MemberFunction(KRYWeakPtr<C> target, R(C::*handler)(P1, P2, P3, P4, P5, P6))
{
m_target = target;
m_handler = handler;
}
bool able() { return m_target && 0 != m_handler; }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
{
C *ptr = m_target.getPtr();
return (ptr->*m_handler)(p1, p2, p3, p4, p5, p6);
}
private:
KRYWeakPtr<C> m_target;
R(C::*m_handler)(P1, P2, P3, P4, P5, P6);
};
private:
FunctionBase *m_fun;
public:
KRYFunction() { m_fun = 0; }
~KRYFunction() { if (0 != m_fun){ delete m_fun; m_fun = 0; } }
operator bool(){ return (0 != m_fun && m_fun->able()); }
R operator ()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
{
return (*m_fun)(p1, p2, p3, p4, p5, p6);
}
template<typename C>
void set(C* target, R(C::*handler)(P1, P2, P3, P4, P5, P6))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new MemberFunction<C>(target, handler);
}
void set(R(*handler)(P1, P2, P3, P4, P5, P6))
{
if (0 != m_fun){ delete m_fun; m_fun = 0; }
m_fun = new GlobalFunction(handler);
}
};