Files
Include/EGkObjUserFactory.h
T
Dario Sassi 34831c66e4 Include :
- aggiornamenti.
2015-05-26 15:51:08 +00:00

79 lines
2.9 KiB
C++

//----------------------------------------------------------------------------
// 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 <string>
#include <unordered_map>
//----------------------- 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<class T>::DoRegister( sName)
#define OBJUSER_GETNAME( T) ObjUserRegister<class T>::GetName()
#define OBJUSER_CREATE( sName) ObjUserFactory::Create( sName)
#define OBJUSER_GETLIST( vsList) ObjUserFactory::GetList( vsList)
//----------------------------------------------------------------------------
template <class T>
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<std::string, ObjUserCreator> CreatorMap ;
// metodo di accesso alla mappa statica
static CreatorMap& GetCreatorMap( void) ;
} ;