//---------------------------------------------------------------------------- // EgalTech 2015-2015 //---------------------------------------------------------------------------- // File : EGkObjUserFactory.h Data : 22.05.15 Versione : 1.6e3 // Contenuto : Factory della classe IObjUser. // // // // Modifiche : 22.05.15 DS Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkObjUser.h" #include #include //----------------------- Macro per import/export ---------------------------- #undef EGK_EXPORT #if defined( I_AM_EGK) // da definirsi solo nella DLL #define EGK_EXPORT __declspec( dllexport) #else #define EGK_EXPORT __declspec( dllimport) #endif //---------------------------------------------------------------------------- #define OBJUSER_REGISTER( sName, T) static const bool bReg_##T = \ ObjUserRegister::DoRegister( sName) #define OBJUSER_GETNAME( T) ObjUserRegister::GetName() #define OBJUSER_CREATE( sName) ObjUserFactory::Create( sName) #define OBJUSER_GETLIST( vsList) ObjUserFactory::GetList( vsList) //---------------------------------------------------------------------------- template class ObjUserRegister { public : static bool DoRegister( const std::string& sName) { if ( ! ObjUserFactory::Register( sName, Create)) return false ; GetNamePrivate() = sName ; return true ; } static IObjUser* Create( void) { return new(nothrow) T ; } static const std::string& GetName( void) { return GetNamePrivate() ; } private : ObjUserRegister( void) {} ~ObjUserRegister( void) {} static std::string& GetNamePrivate( void) { static std::string s_sName ; return s_sName ; } } ; //---------------------------------------------------------------------------- class ObjUserFactory { public : // definizione del tipo funzione di creazione typedef IObjUser* ( *ObjUserCreator) ( void) ; // per registrare le funzioni di creazione EGK_EXPORT static bool Register( const std::string& sName, ObjUserCreator Creator) ; // per creare l'oggetto richiesto EGK_EXPORT static IObjUser* Create( const std::string& sName) ; // per restituire la lista degli oggetti registrati EGK_EXPORT static bool GetList( STRVECTOR& vsList) ; private : ObjUserFactory( void) {} ~ObjUserFactory( void) {} // definizione del tipo mappa con coppie nome, funzione di creazione typedef std::unordered_map CreatorMap ; // metodo di accesso alla mappa statica static CreatorMap& GetCreatorMap( void) ; } ;