diff options
-rw-r--r-- | tools/functor.h | 47 | ||||
-rw-r--r-- | tools/functorimpl.h | 150 |
2 files changed, 197 insertions, 0 deletions
diff --git a/tools/functor.h b/tools/functor.h new file mode 100644 index 00000000..0dadf1fc --- /dev/null +++ b/tools/functor.h @@ -0,0 +1,47 @@ +/* + * functor.h: + * + * See the main source file 'xineliboutput.c' for copyright information and + * how to reach the author. + * + * $Id: functor.h,v 1.1 2006-08-24 23:25:07 phintuka Exp $ + * + */ + +#ifndef __XINELIB_FUNCTOR_H +#define __XINELIB_FUNCTOR_H + +#include <vdr/tools.h> + + +class cFunctor : public cListObject +{ + public: + cFunctor() : cListObject() {} + virtual ~cFunctor() {} + virtual void Execute(void) = 0; +}; + +#if 1 /* gcc 3.3.x (?) does not accept class TRESULT=void */ +template<class TCLASS> +cFunctor *CreateFunctor(TCLASS *c, + void (TCLASS::*fp)(void)); + +template<class TCLASS, class TARG1> +cFunctor *CreateFunctor(TCLASS *c, + void (TCLASS::*fp)(TARG1), + TARG1 arg1); +#endif + +template<class TCLASS, class TRESULT> +cFunctor *CreateFunctor(TCLASS *c, + TRESULT (TCLASS::*fp)(void)); + +template<class TCLASS, class TRESULT, class TARG1> +cFunctor *CreateFunctor(TCLASS *c, + TRESULT (TCLASS::*fp)(TARG1), + TARG1 arg1); + +#include "functorimpl.h" + +#endif diff --git a/tools/functorimpl.h b/tools/functorimpl.h new file mode 100644 index 00000000..2d3504e6 --- /dev/null +++ b/tools/functorimpl.h @@ -0,0 +1,150 @@ +/* + * functorimpl.h: + * + * See the main source file 'xineliboutput.c' for copyright information and + * how to reach the author. + * + * $Id: functorimpl.h,v 1.1 2006-08-24 23:25:07 phintuka Exp $ + * + */ + +#ifndef __XINELIB_FUNCTORIMPL_H + +#ifndef __XINELIB_FUNCTOR_H +# error functorimpl.h should not be included, use functor.h instead +#endif + +#if 1 /* gcc 3.3.x (?) does not accept class TRESULT=void */ +template <class TCLASS> +class cFunctor0 : public cFunctor { + + public: + protected: + + typedef void (TCLASS::*TFUNC)(void); + + cFunctor0(TCLASS *obj, TFUNC f) : m_obj(obj), m_f(f) {} + virtual ~cFunctor0() {}; + + virtual void Execute(void) + { + (*m_obj.*m_f)(); + } + + private: + TCLASS *m_obj; + TFUNC m_f; + + friend cFunctor *CreateFunctor<TCLASS>(TCLASS*,TFUNC); +}; + +template <class TCLASS, class TARG1> +class cFunctor1 : public cFunctor { + + public: + + protected: + typedef void (TCLASS::*TFUNC)(TARG1); + + cFunctor1(TCLASS *obj, TFUNC f, TARG1 arg1) : + m_obj(obj), m_f(f), m_arg1(arg1) {} + virtual ~cFunctor1() {}; + + virtual void Execute(void) + { + (*m_obj.*m_f)(m_arg1); + } + + private: + TCLASS *m_obj; + TFUNC m_f; + TARG1 m_arg1; + + friend cFunctor *CreateFunctor<TCLASS,TARG1>(TCLASS*,TFUNC,TARG1); +}; +#endif + +template <class TCLASS, class TRESULT> +class cFunctorR0 : public cFunctor { + + public: + protected: + + typedef TRESULT (TCLASS::*TFUNC)(void); + + cFunctorR0(TCLASS *obj, TFUNC f) : m_obj(obj), m_f(f) {} + virtual ~cFunctorR0() {}; + + virtual void Execute(void) + { + // TODO: use future to pass back value + (void) (*m_obj.*m_f)(); + } + + private: + TCLASS *m_obj; + TFUNC m_f; + + friend cFunctor *CreateFunctor<TCLASS,TRESULT>(TCLASS*,TFUNC); +}; + +template <class TCLASS, class TRESULT, class TARG1> +class cFunctorR1 : public cFunctor { + + public: + protected: + + typedef TRESULT (TCLASS::*TFUNC)(TARG1); + + cFunctorR1(TCLASS *obj, TFUNC f, TARG1 arg1) : + m_obj(obj), m_f(f), m_arg1(arg1) {} + virtual ~cFunctorR1() {}; + + virtual void Execute(void) + { + // TODO: use future to pass back value + (void) (*m_obj.*m_f)(m_arg1); + } + + private: + TCLASS *m_obj; + TFUNC m_f; + TARG1 m_arg1; + + friend cFunctor *CreateFunctor<TCLASS,TRESULT>(TCLASS*,TFUNC,TARG1); +}; + +#if 1 /* gcc 3.3.x (?) does not accept class TRESULT=void */ +template<class TCLASS> +cFunctor *CreateFunctor(TCLASS *c, + void (TCLASS::*fp)(void)) +{ + return new cFunctor0<TCLASS>(c, fp); +} + +template<class TCLASS, class TARG1> +cFunctor *CreateFunctor(TCLASS *c, + void (TCLASS::*fp)(TARG1), + TARG1 arg1) +{ + return new cFunctor1<TCLASS,TARG1>(c, fp, arg1); +} +#endif + +template<class TCLASS, class TRESULT> +cFunctor *CreateFunctor(TCLASS *c, + TRESULT (TCLASS::*fp)(void)) +{ + return new cFunctorR0<TCLASS,TRESULT>(c, fp); +} + +template<class TCLASS, class TRESULT, class TARG1> +cFunctor *CreateFunctor(TCLASS *c, + TRESULT (TCLASS::*fp)(TARG1), + TARG1 arg1) +{ + return new cFunctorR1<TCLASS,TRESULT,TARG1>(c, fp, arg1); +} + + +#endif |