much better factory implementation - thanks art yerkes Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp 2005-01-06 02:55:11 UTC (rev 12845) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp 2005-01-06 03:27:24 UTC (rev 12846) @@ -9,25 +9,29 @@
using std::string; using std::vector;
-vectorBackend::Factory* Backend::factories; +vectorBackend::Factory** Backend::Factory::factories = NULL;
-/*static*/ void -Backend::InitFactories() +Backend::Factory::Factory ( const std::string& name_ ) + : name(name_) { - factories.push_back ( new Factory ( "mingw", MingwBackend::Factory ) ); + if ( !factories ) + factories = new vector<Factory*>; + factories->push_back ( this ); }
/*static*/ Backend* -Backend::Create ( const std::string& name, Project& project ) +Backend::Factory::Create ( const std::string& name, Project& project ) { string sname ( name ); strlwr ( &sname[0] ); - if ( !factories.size() ) + if ( !factories || !factories->size() ) throw Exception ( "internal tool error: no registered factories" ); - for ( size_t i = 0; i < factories.size(); i++ ) + vectorBackend::Factory*& fact = *factories; + for ( size_t i = 0; i < fact.size(); i++ ) { - if ( sname == factories[i]->name ) - return (factories[i]->factory) ( project ); + //char* p = *fact[i]; + if ( sname == fact[i]->name ) + return (*fact[i]) ( project ); } throw UnknownBackendException ( sname ); return NULL; _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h 2005-01-06 02:55:11 UTC (rev 12845) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h 2005-01-06 03:27:24 UTC (rev 12846) @@ -9,24 +9,24 @@
class Backend { +public: class Factory { - public: + static std::vector<Factory*>* factories; std::string name; - BackendFactory* factory;
- Factory ( const std::string& name_, BackendFactory* factory_ ) - : name(name_), factory(factory_) - { - } - }; + protected:
- static std::vector<Factory*> factories; + Factory ( const std::string& name_ );
-public: - static void InitFactories(); - static Backend* Create ( const std::string& name, Project& project ); + virtual Backend* operator() ( Project& ) = 0;
+ public: + static Backend* Create ( const std::string& name, Project& project ); + + private: + }; + protected: Backend ( Project& project );
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-01-06 02:55:11 UTC (rev 12845) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-01-06 03:27:24 UTC (rev 12846) @@ -6,11 +6,15 @@
using std::string; using std::vector;
-Backend* -MingwBackend::Factory ( Project& project ) +static class MingwFactory : public Backend::Factory { - return new MingwBackend ( project ); -} +public: + MingwFactory() : Factory ( "mingw" ) {} + Backend* operator() ( Project& project ) + { + return new MingwBackend ( project ); + } +} factory;
#ifdef WIN32 #define EXEPOSTFIX ".exe" _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h 2005-01-06 02:55:11 UTC (rev 12845) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h 2005-01-06 03:27:24 UTC (rev 12846) @@ -20,10 +20,7 @@
class MingwBackend : public Backend { public: - static Backend* Factory ( Project& project ); -protected: MingwBackend ( Project& project ); -public: virtual void Process (); private: void ProcessModule ( Module& module ); _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp 2005-01-06 02:55:11 UTC (rev 12845) +++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp 2005-01-06 03:27:24 UTC (rev 12846) @@ -17,7 +17,6 @@
int main ( int argc, char** argv ) { - Backend::InitFactories(); if ( argc != 2 ) { printf ( "syntax: rbuild {buildtarget}\n" ); @@ -29,7 +28,7 @@ { string projectFilename ( "ReactOS.xml" ); Project project ( projectFilename ); - Backend* backend = Backend::Create ( buildtarget, project ); + Backend* backend = Backend::Factory::Create ( buildtarget, project ); backend->Process (); delete backend;