Here are the Boost-less FGEventMgr updates I promised.
Removed Boost dependencies from FGEventMgr.
Removed Boost configure check.
fgMethodCallback now handles const member functions.
I've successfully tested these changes with gcc and msvc.
#include <Navaids/mkrbeacons.hxx>
#include <Navaids/navlist.hxx>
#include <Time/FGEventMgr.hxx>
-#include <boost/bind.hpp>
#include "radiostack.hxx"
// Search radio database once per second
global_events.Register( "fgRadioSearch()",
- boost::bind( &FGRadioStack::search,
- current_radiostack),
+ current_radiostack, &FGRadioStack::search,
1000 );
}
#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;
//-----------------------------------------------------------------------------
//
-// 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 )
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;
private:
T* object;
- Method0v method0v;
+ union {
+ Method0v method0v;
+ Method0vc method0vc;
+ };
// typedef void * (fgMethodCallback::*DoPtr)( void ** );
typedef void * (fgMethodCallback<T>::*DoPtr)( void ** );
#endif // _FG_CALLBACK_HXX
-
#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>
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 );
// 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 );
fgSetBool("/sim/freeze/master", false);
}
}
-
-
#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),
{
}
-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),
FGEventMgr::FGEvent::~FGEvent()
{
+ //delete callback_;
}
void
start_time.stamp();
// run the event
- this->callback();
+ callback_->call(0);
finish_time.stamp();
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
}
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
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, "" );
}
#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>
FG_EVENT_QUEUED = 2
};
- typedef boost::function<void> callback_type;
typedef int interval_type;
private:
*/
FGEvent();
- FGEvent( const string& desc,
- callback_type cb,
- EventState status_,
+ FGEvent( const char* desc,
+ fgCallback* cb,
+ EventState status,
interval_type ms );
/**
*/
void reset()
{
- status = FG_EVENT_READY;
- ms_to_go = interval_ms;
+ status_ = FG_EVENT_READY;
+ ms_to_go_ = ms_;
}
/**
*/
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.
*/
*/
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
* @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 char* name,
+ void (*cb)(),
+ interval_type interval_ms,
+ EventState state = FG_EVENT_READY )
+ {
+ this->Register( FGEvent( name, new fgFunctionCallback(cb), state, interval_ms ) );
+ }
- /**
- *
- */
- void Register( const string& desc,
- callback_type cb,
- interval_type 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( desc, cb, FG_EVENT_READY, interval_ms );
+ 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 ) );
}
/**
*/
void print_stats() const;
+private:
+ void Register( const FGEvent& event );
+
private:
typedef vector< FGEvent > event_container_type;