diff --git a/src/Cockpit/radiostack.cxx b/src/Cockpit/radiostack.cxx index 62bbd53fa..c0b373600 100644 --- a/src/Cockpit/radiostack.cxx +++ b/src/Cockpit/radiostack.cxx @@ -35,7 +35,6 @@ #include <Navaids/mkrbeacons.hxx> #include <Navaids/navlist.hxx> #include <Time/FGEventMgr.hxx> -#include <boost/bind.hpp> #include "radiostack.hxx" @@ -143,8 +142,7 @@ FGRadioStack::init () // Search radio database once per second global_events.Register( "fgRadioSearch()", - boost::bind( &FGRadioStack::search, - current_radiostack), + current_radiostack, &FGRadioStack::search, 1000 ); } diff --git a/src/Include/fg_callback.hxx b/src/Include/fg_callback.hxx index 5b0f112a9..dcad810ba 100644 --- a/src/Include/fg_callback.hxx +++ b/src/Include/fg_callback.hxx @@ -22,6 +22,8 @@ #ifndef _FG_CALLBACK_HXX #define _FG_CALLBACK_HXX +#include <stdlib.h> + // -dw- need size_t for params() function #ifdef __MWERKS__ typedef unsigned long size_t; @@ -114,14 +116,16 @@ fgFunctionCallback::call0v( void** ) //----------------------------------------------------------------------------- // -// Callback for invoking an object method. +// Callback for invoking a member function. // +//template< typename Ret, class T > template< class T > 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 ) @@ -130,6 +134,13 @@ public: method0v(m), doPtr(&fgMethodCallback<T>::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<T>::call0v) {} + // Create a clone on the heap. fgCallback* clone() const; @@ -146,7 +157,10 @@ private: private: T* object; - Method0v method0v; + union { + Method0v method0v; + Method0vc method0vc; + }; // typedef void * (fgMethodCallback::*DoPtr)( void ** ); typedef void * (fgMethodCallback<T>::*DoPtr)( void ** ); @@ -175,4 +189,3 @@ fgMethodCallback<T>::call0v( void** ) #endif // _FG_CALLBACK_HXX - diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 4be563e8a..319de0dde 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -105,7 +105,6 @@ #include <Sound/fg_fx.hxx> #include <Sound/soundmgr.hxx> #include <Time/FGEventMgr.hxx> -#include <boost/bind.hpp> #include <Time/light.hxx> #include <Time/sunpos.hxx> #include <Time/moonpos.hxx> @@ -777,9 +776,8 @@ bool fgInitSubsystems( void ) { global_events.init(); // Output event stats every 60 seconds - global_events.Register( "fgEVENT_MGR::PrintStats()", - boost::bind( &FGEventMgr::print_stats, - &global_events ), + global_events.Register( "FGEventMgr::print_stats()", + &global_events, &FGEventMgr::print_stats, 60000 ); @@ -809,7 +807,7 @@ bool fgInitSubsystems( void ) { // update the lighting parameters (based on sun angle) global_events.Register( "fgLight::Update()", - boost::bind( &fgLIGHT::Update, &cur_light_params ), + &cur_light_params, &fgLIGHT::Update, 30000 ); @@ -1128,5 +1126,3 @@ void fgReInitSubsystems( void ) fgSetBool("/sim/freeze/master", false); } } - - diff --git a/src/Time/FGEventMgr.cxx b/src/Time/FGEventMgr.cxx index f6fdcfea7..c8aedd488 100644 --- a/src/Time/FGEventMgr.cxx +++ b/src/Time/FGEventMgr.cxx @@ -4,15 +4,17 @@ #include <simgear/compiler.h> #include <simgear/debug/logstream.hxx> -#include <functional> -#include <boost/bind.hpp> +// #include <functional> +// #include <algorithm> #include "FGEventMgr.hxx" FGEventMgr::FGEvent::FGEvent() - : status(FG_EVENT_SUSP), - interval_ms(0), - ms_to_go(0), + : name_(""), + callback_(0), + status_(FG_EVENT_SUSP), + ms_(0), + ms_to_go_(0), cum_time(0), min_time(100000), max_time(0), @@ -20,15 +22,15 @@ FGEventMgr::FGEvent::FGEvent() { } -FGEventMgr::FGEvent::FGEvent( const string& desc, - callback_type cb, - EventState status_, +FGEventMgr::FGEvent::FGEvent( const char* name, + fgCallback* cb, + EventState status, interval_type ms ) - : description(desc), - callback(cb), - status(status_), - interval_ms(ms), - ms_to_go(ms), + : name_(name), + callback_(cb), + status_(status), + ms_(ms), + ms_to_go_(ms), cum_time(0), min_time(100000), max_time(0), @@ -39,6 +41,7 @@ FGEventMgr::FGEvent::FGEvent( const string& desc, FGEventMgr::FGEvent::~FGEvent() { + //delete callback_; } void @@ -50,7 +53,7 @@ FGEventMgr::FGEvent::run() start_time.stamp(); // run the event - this->callback(); + callback_->call(0); finish_time.stamp(); @@ -75,8 +78,8 @@ void FGEventMgr::FGEvent::print_stats() const { SG_LOG( SG_EVENT, SG_INFO, - " " << description - << " int=" << interval_ms / 1000.0 + " " << name_ + << " int=" << ms_ / 1000.0 << " cum=" << cum_time << " min=" << min_time << " max=" << max_time @@ -126,18 +129,14 @@ FGEventMgr::update( int dt ) } void -FGEventMgr::Register( const string& desc, - callback_type cb, - EventState state, - interval_type ms ) +FGEventMgr::Register( const FGEvent& event ) { - FGEvent event( desc, cb, state, ms ); - if (state == FG_EVENT_READY) - event.run(); +// if (event.is_ready()) +// event.run(); event_table.push_back( event ); - SG_LOG( SG_EVENT, SG_INFO, "Registered event " << desc - << " to run every " << ms << "ms" ); + SG_LOG( SG_EVENT, SG_INFO, "Registered event " << event.name() + << " to run every " << event.interval() << "ms" ); } void @@ -147,8 +146,17 @@ FGEventMgr::print_stats() const SG_LOG( SG_EVENT, SG_INFO, "Event Stats" ); SG_LOG( SG_EVENT, SG_INFO, "-----------" ); +#if 1 + event_container_type::const_iterator first = event_table.begin(); + event_container_type::const_iterator last = event_table.end(); + for (; first != last; ++first) + { + first->print_stats(); + } +#else + // #@!$ MSVC can't handle const member functions. std::for_each( event_table.begin(), event_table.end(), - boost::bind( &FGEvent::print_stats, _1 ) ); - + std::mem_fun_ref( &FGEvent::print_stats ) ); +#endif SG_LOG( SG_EVENT, SG_INFO, "" ); } diff --git a/src/Time/FGEventMgr.hxx b/src/Time/FGEventMgr.hxx index daeaaa7bb..085135f69 100644 --- a/src/Time/FGEventMgr.hxx +++ b/src/Time/FGEventMgr.hxx @@ -24,12 +24,12 @@ #ifndef FG_EVENT_MGR_H_INCLUDED #define FG_EVENT_MGR_H_INCLUDED 1 -#include <boost/function.hpp> - #include <simgear/compiler.h> #include <simgear/timing/timestamp.hxx> #include <Main/fgfs.hxx> +#include <Include/fg_callback.hxx> + #include <vector> #include <string> @@ -52,7 +52,6 @@ public: FG_EVENT_QUEUED = 2 }; - typedef boost::function<void> callback_type; typedef int interval_type; private: @@ -68,9 +67,9 @@ private: */ FGEvent(); - FGEvent( const string& desc, - callback_type cb, - EventState status_, + FGEvent( const char* desc, + fgCallback* cb, + EventState status, interval_type ms ); /** @@ -83,8 +82,8 @@ private: */ void reset() { - status = FG_EVENT_READY; - ms_to_go = interval_ms; + status_ = FG_EVENT_READY; + ms_to_go_ = ms_; } /** @@ -92,6 +91,11 @@ private: */ void run(); + bool is_ready() const { return status_ == FG_EVENT_READY; } + + string name() const { return name_; } + interval_type interval() const { return ms_; } + /** * Display event statistics. */ @@ -104,19 +108,19 @@ private: */ bool update( int dt_ms ) { - if (status != FG_EVENT_READY) + if (status_ != FG_EVENT_READY) return false; - ms_to_go -= dt_ms; - return ms_to_go <= 0; + ms_to_go_ -= dt_ms; + return ms_to_go_ <= 0; } private: - string description; - callback_type callback; - EventState status; - interval_type interval_ms; - int ms_to_go; + string name_; + fgCallback* callback_; + EventState status_; + interval_type ms_; + int ms_to_go_; unsigned long cum_time; // cumulative processor time of this event unsigned long min_time; // time of quickest execution @@ -150,19 +154,30 @@ public: * @param state * @param interval Callback repetition rate in milliseconds. */ - void Register( const string& desc, - callback_type cb, - EventState state, - interval_type interval_ms ); - - /** - * - */ - void Register( const string& desc, - callback_type cb, - interval_type interval_ms ) + void Register( const char* name, + void (*cb)(), + interval_type interval_ms, + EventState state = FG_EVENT_READY ) { - this->Register( desc, cb, FG_EVENT_READY, interval_ms ); + this->Register( FGEvent( name, new fgFunctionCallback(cb), state, interval_ms ) ); + } + + template< class Obj > + void Register( const char* name, + Obj* obj, void (Obj::*pmf)() const, + interval_type interval_ms, + EventState state = FG_EVENT_READY ) + { + this->Register( FGEvent( name, new fgMethodCallback<Obj>(obj,pmf), state, interval_ms ) ); + } + + template< class Obj > + void Register( const char* name, + Obj* obj, void (Obj::*pmf)(), + interval_type interval_ms, + EventState state = FG_EVENT_READY ) + { + this->Register( FGEvent( name, new fgMethodCallback<Obj>(obj,pmf), state, interval_ms ) ); } /** @@ -170,6 +185,9 @@ public: */ void print_stats() const; +private: + void Register( const FGEvent& event ); + private: typedef vector< FGEvent > event_container_type;