33 template <
class T,
typename... ConstructorArgs>
class Factory {
48 bool RegisterBuilder(
const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...));
58 std::unique_ptr<T>
CreateObject(
const std::string &name, ConstructorArgs... arguments);
69 typedef std::map<std::string, T *(*)(ConstructorArgs...)>
BuildersMap;
74 template <
class T,
typename... ConstructorArgs>
76 static Factory<T, ConstructorArgs...> instance;
81 template <
class T,
typename... ConstructorArgs>
83 const std::string routineName(
_factoryName +
"::Factory");
84 COUT(DEEPDEB) << routineName <<
ENDL;
87 template <
class T,
typename... ConstructorArgs>
89 T *(*objectBuilder)(ConstructorArgs...)) {
90 const std::string &routineName(
_factoryName +
"::RegisterBuilder");
92 std::pair<typename BuildersMap::iterator, bool> insertResult =
93 _builders.insert(std::pair<std::string, T *(*)(ConstructorArgs...)>(builderName, objectBuilder));
94 if (insertResult.second) {
98 COUT(
ERROR) <<
"Impossible to register class builder " << builderName
99 <<
": a class builder with the same name is already registered." <<
ENDL;
104 template <
class T,
typename... ConstructorArgs>
109 template <
class T,
typename... ConstructorArgs>
111 ConstructorArgs... arguments) {
112 const std::string &routineName(
_factoryName +
"::CreateObject");
115 typename BuildersMap::iterator builderIter =
_builders.find(builderName);
117 COUT(
ERROR) <<
"No available class builder with name " << builderName <<
"." <<
ENDL;
118 return std::unique_ptr<T>((T *)(NULL));
122 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:88
std::map< std::string, T *(*)(ConstructorArgs...)> BuildersMap
Definition: Factory.h:69
const std::vector< std::string > & GetListOfRegisteredBuilders()
Gets a vector containing the names of available registered builders.
Definition: Factory.h:105
#define COUT(level)
Definition: SmartLog.h:88
std::vector< std::string > _builderNames
Definition: Factory.h:71
std::string ClassName(const T &obj)
Function which returns the name of the class.
Definition: Demangler.h:30
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:110
static Factory & GetInstance()
Getter method for singleton pointer.
Definition: Factory.h:75
#define ENDL
Definition: SmartLog.h:117
Template factory class.
Definition: Factory.h:33
std::string _factoryName
Definition: Factory.h:68
BuildersMap _builders
Definition: Factory.h:70
Factory()
Definition: Factory.h:82
Aliased object is an alias.