d4d7b75015
- aggiornamento prototipi - modifiche a UserObjFactory per passaggio a C++ 20.
79 lines
2.9 KiB
C++
79 lines
2.9 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2015-2025
|
|
//----------------------------------------------------------------------------
|
|
// File : EGkUserObjFactory.h Data : 31.10.25 Versione : 2.7k1
|
|
// Contenuto : Factory della classe IUserObj.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 22.05.15 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "/EgtDev/Include/EGkUserObj.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 USEROBJ_REGISTER( sName, T) static const bool bReg_##T = \
|
|
UserObjRegister<class T>::DoRegister( sName)
|
|
#define USEROBJ_GETNAME( T) UserObjRegister<class T>::GetName()
|
|
#define USEROBJ_CREATE( sName) UserObjFactory::Create( sName)
|
|
#define USEROBJ_GETLIST( vsList) UserObjFactory::GetList( vsList)
|
|
|
|
//----------------------------------------------------------------------------
|
|
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<std::string, UserObjCreator> CreatorMap ;
|
|
// metodo di accesso alla mappa statica
|
|
static CreatorMap& GetCreatorMap( void) ;
|
|
} ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
template <class T>
|
|
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( std::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 ; }
|
|
} ;
|