/* Copyright (C) 2005-2007 Feeling Software Inc. Portions of the code are: Copyright (C) 2005-2007 Sony Computer Entertainment America MIT License: http://www.opensource.org/licenses/mit-license.php */ /* This file was taken off the Protect project on 26-09-2005 */ #ifndef _FU_FUNCTOR_H_ #define _FU_FUNCTOR_H_ /** A functor with no arguments. @ingroup FUtils */ template class IFunctor0 { public: /** Destructor. */ virtual ~IFunctor0() {} /** Calls the functor. @return Implementation-dependant. */ virtual ReturnType operator()() const = 0; /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const = 0; /** Returns a copy of this functor */ virtual IFunctor0* Copy() const = 0; }; /** A functor with no arguments. @ingroup FUtils */ template class FUFunctor0 : public IFunctor0 { private: Class* m_pObject; ReturnType (Class::*m_pFunction) (); public: /** Constructor. @param object An object. @param function A member function of this object. */ FUFunctor0(Class* object, ReturnType (Class::*function) ()) { m_pObject = object; m_pFunction = function; } /** Destructor. */ virtual ~FUFunctor0() {} /** Calls the functor. @return Implementation-dependant. */ virtual ReturnType operator()() const { return ((*m_pObject).*m_pFunction)(); } /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const { return object == m_pObject && (size_t)function == *(size_t*)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor0* Copy() const { return new FUFunctor0(m_pObject, m_pFunction); } }; /** Shortcut for new FUFunctor0<>. @param o An object. @param function A member function. */ template inline FUFunctor0* NewFUFunctor0(ClassName* o, ReturnType (ClassName::*function) ()) { return new FUFunctor0(o, function); } /** A pseudo-functor with no arguments, specialized for static functions. @ingroup FUtils */ template class FUStaticFunctor0 : public IFunctor0 { private: ReturnType (*m_pFunction) (); public: /** Constructor. @param function A static function. */ FUStaticFunctor0(ReturnType (*function) ()) { m_pFunction = function; } /** Destructor. */ virtual ~FUStaticFunctor0() {} /** Calls the functor. @return Implementation-dependant. */ virtual ReturnType operator()() const { return (*m_pFunction)(); } /** Checks whether this pseudo-functor points towards the given function. @param UNUSED Unused. @param function The static function. @return Whether this pseudo-functor points towards the given function. */ virtual bool Compare(void* UNUSED(object), void* function) const { return (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor0* Copy() const { return new FUStaticFunctor0(m_pFunction); } }; /** A functor with one argument. @ingroup FUtils */ template class IFunctor1 { public: /** Destructor. */ virtual ~IFunctor1() {} /** Calls the functor. @param argument1 A first argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1) const = 0; /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const = 0; /** Returns a copy of this functor */ virtual IFunctor1* Copy() const = 0; }; /** A functor with one arguments. @ingroup FUtils */ template class FUFunctor1 : public IFunctor1 { private: Class* m_pObject; ReturnType (Class::*m_pFunction) (Arg1); public: /** Constructor. @param object An object. @param function A member function of this object. */ FUFunctor1(Class* object, ReturnType (Class::*function) (Arg1)) { m_pObject = object; m_pFunction = function; } /** Destructor. */ virtual ~FUFunctor1() {} /** Calls the functor. @param argument1 A first argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1) const { return ((*m_pObject).*m_pFunction)(argument1); } /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const { return object == m_pObject && (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor1* Copy() const { return new FUFunctor1(m_pObject, m_pFunction); } }; /** Shortcut for new FUFunctor1<>. @param o An object. @param function A member function. */ template inline FUFunctor1* NewFUFunctor1(ClassName* o, ReturnType (ClassName::*function) (Argument1)) { return new FUFunctor1(o, function); } /** A pseudo-functor with one arguments, specialized for static functions. @ingroup FUtils */ template class FUStaticFunctor1 : public IFunctor1 { private: ReturnType (*m_pFunction) (Arg1); public: /** Constructor. @param function A static function. */ FUStaticFunctor1(ReturnType (*function) (Arg1)) { m_pFunction = function; } /** Destructor. */ virtual ~FUStaticFunctor1() {} /** Calls the functor. @param argument1 A first argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1) const { return (*m_pFunction)(argument1); } /** Checks whether this pseudo-functor points towards the given function. @param UNUSED Unused. @param function The static function. @return Whether this pseudo-functor points towards the given function. */ virtual bool Compare(void* UNUSED(object), void* function) const { return (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor1* Copy() const { return new FUStaticFunctor1(m_pFunction); } }; /** A functor with two arguments. @ingroup FUtils */ template class IFunctor2 { public: /** Destructor. */ virtual ~IFunctor2() {} /** Calls the functor. @param argument1 A first argument. @param argument2 A second argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1, Arg2 argument2) const = 0; /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const = 0; /** Returns a copy of this functor */ virtual IFunctor2* Copy() const = 0; }; /** A functor with two arguments. @ingroup FUtils */ template class FUFunctor2 : public IFunctor2 { private: Class* m_pObject; ReturnType (Class::*m_pFunction) (Arg1, Arg2); public: /** Constructor. @param object An object. @param function A member function of this object. */ FUFunctor2(Class* object, ReturnType (Class::*function) (Arg1, Arg2)) { m_pObject = object; m_pFunction = function; } /** Destructor. */ virtual ~FUFunctor2() {} /** Calls the functor. @param argument1 A first argument. @param argument2 A second argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1, Arg2 argument2) const { return ((*m_pObject).*m_pFunction)(argument1, argument2); } /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const { return object == m_pObject && (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor2* Copy() const { return new FUFunctor2(m_pObject, m_pFunction); } }; /** Shortcut for new FUFunctor2<>. @param o An object. @param function A member function. */ template inline FUFunctor2* NewFUFunctor2(ClassName* o, ReturnType (ClassName::*function) (Argument1, Argument2)) { return new FUFunctor2(o, function); } /** A pseudo-functor with two arguments, specialized for static functions. @ingroup FUtils */ template class FUStaticFunctor2 : public IFunctor2 { private: ReturnType (*m_pFunction) (Arg1, Arg2); public: /** Constructor. @param function A static function. */ FUStaticFunctor2(ReturnType (*function) (Arg1, Arg2)) { m_pFunction = function; } /** Destructor. */ virtual ~FUStaticFunctor2() {} /** Calls the functor. @param argument1 A first argument. @param argument2 A second argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1, Arg2 argument2) const { return (*m_pFunction)(argument1, argument2); } /** Checks whether this pseudo-functor points towards the given function. @param UNUSED Unused. @param function The static function. @return Whether this pseudo-functor points towards the given function. */ virtual bool Compare(void* UNUSED(object), void* function) const { return (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor2* Copy() const { return new FUStaticFunctor2(m_pFunction); } }; /** A functor with three arguments. @ingroup FUtils */ template class IFunctor3 { public: /** Destructor. */ virtual ~IFunctor3() {} /** Calls the functor. @param argument1 A first argument. @param argument2 A second argument. @param argument3 A third argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1, Arg2 argument2, Arg3 argument3) const = 0; /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const = 0; /** Returns a copy of this functor */ virtual IFunctor3* Copy() const = 0; }; /** A functor with three arguments. @ingroup FUtils */ template class FUFunctor3 : public IFunctor3 { private: Class* m_pObject; ReturnType (Class::*m_pFunction) (Arg1, Arg2, Arg3); public: /** Constructor. @param object An object. @param function A member function of this object. */ FUFunctor3(Class* object, ReturnType (Class::*function) (Arg1, Arg2, Arg3)) { m_pObject = object; m_pFunction = function; } /** Destructor. */ virtual ~FUFunctor3() {} /** Calls the functor. @param argument1 A first argument. @param argument2 A second argument. @param argument3 A third argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1, Arg2 argument2, Arg3 argument3) const { return ((*m_pObject).*m_pFunction)(argument1, argument2, argument3); } /** Checks whether this functor points towards the given member function. @param object The object which holds the member function. @param function The member function. @return Whether this functor points towards the given member function. */ virtual bool Compare(void* object, void* function) const { return object == m_pObject && (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor3* Copy() const { return new FUFunctor3(m_pObject, m_pFunction); }; }; /** Shortcut for new FUFunctor2<>. @param o An object. @param function A member function. */ template inline FUFunctor3* NewFUFunctor3(ClassName* o, ReturnType (ClassName::*function) (Argument1, Argument2, Argument3)) { return new FUFunctor3(o, function); } /** A pseudo-functor with three arguments, specialized for static functions. @ingroup FUtils */ template class FUStaticFunctor3 : public IFunctor3 { private: ReturnType (*m_pFunction) (Arg1, Arg2, Arg3); public: /** Constructor. @param function A static function. */ FUStaticFunctor3(ReturnType (*function) (Arg1, Arg2, Arg3)) { m_pFunction = function; } /** Destructor. */ virtual ~FUStaticFunctor3() {} /** Calls the functor. @param argument1 A first argument. @param argument2 A second argument. @param argument3 A third argument. @return Implementation-dependant. */ virtual ReturnType operator()(Arg1 argument1, Arg2 argument2, Arg3 argument3) const { return (*m_pFunction)(argument1, argument2, argument3); } /** Checks whether this pseudo-functor points towards the given function. @param UNUSED Unused. @param function The static function. @return Whether this pseudo-functor points towards the given function. */ virtual bool Compare(void* UNUSED(object), void* function) const { return (size_t)function == *(size_t*)(size_t)&m_pFunction; } /** Returns a copy of this functor */ virtual IFunctor3* Copy() const { return new FUStaticFunctor3(m_pFunction); }; }; #endif //_FU_FUNCTOR_H_