//---------------------------------------------------------------------------- // EgalTech 2015-2015 //---------------------------------------------------------------------------- // File : EGkUserObjFactory.h Data : 22.05.15 Versione : 1.6e3 // Contenuto : Factory della classe IUserObj. // // // // Modifiche : 22.05.15 DS Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkUserObj.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 USEROBJ_REGISTER( sName, T) static const bool bReg_##T = \ UserObjRegister::DoRegister( sName) #define USEROBJ_GETNAME( T) UserObjRegister::GetName() #define USEROBJ_CREATE( sName) UserObjFactory::Create( sName) #define USEROBJ_GETLIST( vsList) UserObjFactory::GetList( vsList) //---------------------------------------------------------------------------- template class UserObjRegister { public : static bool DoRegister( const std::string& sName) { if ( ! UserObjFactory::Register( sName, Create)) return false ; GetNamePrivate() = sName ; return true ; } static IUserObj* Create( void) { return new(nothrow) T ; } static const std::string& GetName( void) { return GetNamePrivate() ; } private : UserObjRegister( void) {} ~UserObjRegister( void) {} static std::string& GetNamePrivate( void) { static std::string s_sName ; return s_sName ; } } ; //---------------------------------------------------------------------------- class UserObjFactory { public : // definizione del tipo funzione di creazione typedef IUserObj* ( *UserObjCreator) ( void) ; // per registrare le funzioni di creazione EGK_EXPORT static bool Register( const std::string& sName, UserObjCreator Creator) ; // per creare l'oggetto richiesto EGK_EXPORT static IUserObj* Create( const std::string& sName) ; // per restituire la lista degli oggetti registrati EGK_EXPORT static bool GetList( STRVECTOR& vsList) ; private : UserObjFactory( void) {} ~UserObjFactory( 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) ; } ;