From 1900ede13bb109e8ed784b295104de26f6cd8abf Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Thu, 6 Jan 2005 03:27:24 +0000 Subject: [PATCH] much better factory implementation - thanks art yerkes svn path=/branches/xmlbuildsystem/; revision=12846 --- reactos/tools/rbuild/backend/backend.cpp | 22 ++++++++++-------- reactos/tools/rbuild/backend/backend.h | 24 ++++++++++---------- reactos/tools/rbuild/backend/mingw/mingw.cpp | 12 ++++++---- reactos/tools/rbuild/backend/mingw/mingw.h | 3 --- reactos/tools/rbuild/rbuild.cpp | 3 +-- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/reactos/tools/rbuild/backend/backend.cpp b/reactos/tools/rbuild/backend/backend.cpp index 4375d21e1fa..03c764bafb6 100644 --- a/reactos/tools/rbuild/backend/backend.cpp +++ b/reactos/tools/rbuild/backend/backend.cpp @@ -9,25 +9,29 @@ using std::string; using std::vector; -vector Backend::factories; +vector* 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; + 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++ ) + vector& 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; diff --git a/reactos/tools/rbuild/backend/backend.h b/reactos/tools/rbuild/backend/backend.h index 5ed778fb0df..3219e79117d 100644 --- a/reactos/tools/rbuild/backend/backend.h +++ b/reactos/tools/rbuild/backend/backend.h @@ -9,24 +9,24 @@ typedef Backend* BackendFactory ( Project& project ); class Backend { +public: class Factory { - public: + static std::vector* factories; std::string name; - BackendFactory* factory; - Factory ( const std::string& name_, BackendFactory* factory_ ) - : name(name_), factory(factory_) - { - } + protected: + + Factory ( const std::string& name_ ); + + virtual Backend* operator() ( Project& ) = 0; + + public: + static Backend* Create ( const std::string& name, Project& project ); + + private: }; - static std::vector factories; - -public: - static void InitFactories(); - static Backend* Create ( const std::string& name, Project& project ); - protected: Backend ( Project& project ); diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index 0b1a935a4f0..b54813468c7 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -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" diff --git a/reactos/tools/rbuild/backend/mingw/mingw.h b/reactos/tools/rbuild/backend/mingw/mingw.h index 94cf4aa7b3d..ebdf7fbe086 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.h +++ b/reactos/tools/rbuild/backend/mingw/mingw.h @@ -20,10 +20,7 @@ public: class MingwBackend : public Backend { public: - static Backend* Factory ( Project& project ); -protected: MingwBackend ( Project& project ); -public: virtual void Process (); private: void ProcessModule ( Module& module ); diff --git a/reactos/tools/rbuild/rbuild.cpp b/reactos/tools/rbuild/rbuild.cpp index fcc1de5bffb..58d6ac11868 100644 --- a/reactos/tools/rbuild/rbuild.cpp +++ b/reactos/tools/rbuild/rbuild.cpp @@ -17,7 +17,6 @@ using std::vector; int main ( int argc, char** argv ) { - Backend::InitFactories(); if ( argc != 2 ) { printf ( "syntax: rbuild {buildtarget}\n" ); @@ -29,7 +28,7 @@ main ( int argc, char** argv ) { string projectFilename ( "ReactOS.xml" ); Project project ( projectFilename ); - Backend* backend = Backend::Create ( buildtarget, project ); + Backend* backend = Backend::Factory::Create ( buildtarget, project ); backend->Process (); delete backend;