From 7b69f0cbb48c63c6daa0412be5fcc8a25231c094 Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 25 Apr 2002 20:31:38 +0000 Subject: [PATCH] Bernie Bright: - Major rewrite making it more member function friendly. --- src/Include/fg_callback.hxx | 197 ++++++++++++++---------------------- 1 file changed, 77 insertions(+), 120 deletions(-) diff --git a/src/Include/fg_callback.hxx b/src/Include/fg_callback.hxx index dcad810ba..cdbd8cb74 100644 --- a/src/Include/fg_callback.hxx +++ b/src/Include/fg_callback.hxx @@ -22,169 +22,126 @@ #ifndef _FG_CALLBACK_HXX #define _FG_CALLBACK_HXX -#include - -// -dw- need size_t for params() function -#ifdef __MWERKS__ -typedef unsigned long size_t; -#endif - - -//----------------------------------------------------------------------------- -// -// Abstract base class for all FlightGear callbacks. -// +/** + * Abstract base class for all FlightGear callbacks. + */ class fgCallback { public: + + /** + * + */ virtual ~fgCallback() {} + /** + * + */ virtual fgCallback* clone() const = 0; - virtual void* call( void** ) = 0; - size_t params() const { return n_params; } + /** + * Execute the callback function. + */ + virtual void operator()() = 0; protected: - fgCallback( size_t params ) - : n_params(params) {} - -protected: - // The number of parameters to pass to the callback routine. - size_t n_params; + /** + * + */ + fgCallback() {} private: + // Not implemented. + void operator=( const fgCallback& ); }; -//----------------------------------------------------------------------------- -// -// Callback for invoking a file scope function. -// +/** + * Callback for invoking a file scope function. + */ +template< typename Fun > class fgFunctionCallback : public fgCallback { public: - // Pointer to function taking no arguments and returning void. - typedef void (*Proc0v)(); + /** + * + */ + fgFunctionCallback( const Fun& fun ) + : fgCallback(), f_(fun) {} - // A callback instance to invoke the function 'p' - fgFunctionCallback( Proc0v p ); + fgCallback* clone() const + { + return new fgFunctionCallback( *this ); + } - // Create a clone on the heap. - virtual fgCallback* clone() const; - -private: - void* call( void** in ); - inline void* call0v( void** ); + void operator()() { f_(); } private: // Not defined. fgFunctionCallback(); private: - - typedef void* (fgFunctionCallback::*DoPtr)( void** ); - DoPtr doPtr; - Proc0v proc0v; + Fun f_; }; -inline -fgFunctionCallback::fgFunctionCallback( Proc0v p ) - : fgCallback(0), - doPtr(&fgFunctionCallback::call0v), - proc0v(p) -{ - // empty -} - -inline fgCallback* -fgFunctionCallback::clone() const -{ - return new fgFunctionCallback( *this ); -} - -inline void* -fgFunctionCallback::call( void** in ) -{ - return (this->*doPtr)( in ); -} - -inline void* -fgFunctionCallback::call0v( void** ) -{ - (*proc0v)(); - return (void*) NULL; -} - -//----------------------------------------------------------------------------- -// -// Callback for invoking a member function. -// -//template< typename Ret, class T > -template< class T > +/** + * Callback for invoking a member function. + */ +template< class ObjPtr, typename MemFn > class fgMethodCallback : public fgCallback { public: - // Pointer to method taking no arguments and returning void. - typedef void (T::*Method0v)(); - typedef void (T::*Method0vc)() const; - - // A callback instance to invoke method 'm' of object 'o' - fgMethodCallback( T* o, Method0v m ) - : fgCallback(0), - object(o), - method0v(m), - doPtr(&fgMethodCallback::call0v) {} - - // A callback instance to invoke a const method 'm' of object 'o' - fgMethodCallback( T* o, Method0vc m ) - : fgCallback(0), - object(o), - method0vc(m), - doPtr(&fgMethodCallback::call0v) {} - - // Create a clone on the heap. - fgCallback* clone() const; - -private: - // - void* call( void** in ); - // - void* call0v( void** ); + /** + * + */ + fgMethodCallback( const ObjPtr& pObj, MemFn pMemFn ) + : fgCallback(), + pObj_(pObj), + pMemFn_(pMemFn) + { + } + + /** + * + */ + fgCallback* clone() const + { + return new fgMethodCallback( *this ); + } + + /** + * + */ + void operator()() + { + ((*pObj_).*pMemFn_)(); + } private: // Not defined. fgMethodCallback(); private: - T* object; - union { - Method0v method0v; - Method0vc method0vc; - }; - - // typedef void * (fgMethodCallback::*DoPtr)( void ** ); - typedef void * (fgMethodCallback::*DoPtr)( void ** ); - DoPtr doPtr; + ObjPtr pObj_; + MemFn pMemFn_; }; -template< class T > inline fgCallback* -fgMethodCallback::clone() const -{ - return new fgMethodCallback( *this ); -} +/** + * Helper template functions. + */ -template< class T > inline void* -fgMethodCallback::call( void** in ) +template< typename Fun > +fgCallback* +make_callback( const Fun& fun ) { - return (this->*doPtr)( in ); + return new fgFunctionCallback(fun); } - -template< class T > inline void* -fgMethodCallback::call0v( void** ) +template< class ObjPtr, typename MemFn > +fgCallback* +make_callback( const ObjPtr& pObj, MemFn pMemFn ) { - (object->*method0v)(); - return (void*) NULL; + return new fgMethodCallback(pObj, pMemFn ); } #endif // _FG_CALLBACK_HXX -- 2.39.5