32 template <
class T,
typename... ConstructorArgs>
class Factory {
47 bool RegisterBuilder(
const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...));
57 std::unique_ptr<T>
CreateObject(
const std::string &name, ConstructorArgs... arguments);
68 typedef std::map<std::string, T *(*)(ConstructorArgs...)>
BuildersMap;
73 template <
class T,
typename... ConstructorArgs>
75 static Factory<T, ConstructorArgs...> instance;
80 template <
class T,
typename... ConstructorArgs>
82 const std::string routineName(
_factoryName +
"::Factory");
83 COUT(DEEPDEB) << routineName <<
ENDL;
86 template <
class T,
typename... ConstructorArgs>
88 T *(*objectBuilder)(ConstructorArgs...)) {
89 const std::string &routineName(
_factoryName +
"::RegisterBuilder");
91 std::pair<typename BuildersMap::iterator, bool> insertResult =
92 _builders.insert(std::pair<std::string, T *(*)(ConstructorArgs...)>(builderName, objectBuilder));
93 if (insertResult.second) {
97 COUT(
ERROR) <<
"Impossible to register class builder " << builderName
98 <<
": a class builder with the same name is already registered." <<
ENDL;
103 template <
class T,
typename... ConstructorArgs>
108 template <
class T,
typename... ConstructorArgs>
110 ConstructorArgs... arguments) {
111 const std::string &routineName(
_factoryName +
"::CreateObject");
114 typename BuildersMap::iterator builderIter =
_builders.find(builderName);
116 COUT(
ERROR) <<
"No available class builder with name " << builderName <<
"." <<
ENDL;
117 return std::unique_ptr<T>((T *)(NULL));
121 return std::unique_ptr<T>((*(builderIter->second))(arguments...));
bool RegisterBuilder(const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...))
Register a builder for a class.
Definition: Factory.h:87
std::map< std::string, T *(*)(ConstructorArgs...)> BuildersMap
Definition: Factory.h:68
const std::vector< std::string > & GetListOfRegisteredBuilders()
Gets a vector containing the names of available registered builders.
Definition: Factory.h:104
#define COUT(level)
Definition: SmartLog.h:88
std::vector< std::string > _builderNames
Definition: Factory.h:70
IncludeFileExc.h IncludeFileExc class declaration.
Definition: Algorithm.h:21
std::unique_ptr< T > CreateObject(const std::string &name, ConstructorArgs... arguments)
Create an object.
Definition: Factory.h:109
static Factory & GetInstance()
Getter method for singleton pointer.
Definition: Factory.h:74
#define ENDL
Definition: SmartLog.h:117
Template factory class.
Definition: Factory.h:32
A simple name demangler.
Definition: Demangler.h:18
std::string _factoryName
Definition: Factory.h:67
BuildersMap _builders
Definition: Factory.h:69
Factory()
Definition: Factory.h:81
Aliased objet is an alias.