29 template<
class T,
typename ... ConstructorArgs>
46 bool RegisterBuilder(
const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...));
56 std::unique_ptr<T>
CreateObject(
const std::string &name, ConstructorArgs ... arguments);
67 std::string _factoryName;
68 typedef std::map<std::string, T *(*)(ConstructorArgs...)> BuildersMap;
69 BuildersMap _builders;
70 std::vector<std::string> _builderNames;
74 template<
class T,
typename ... ConstructorArgs>
76 static GGSFactory<T, ConstructorArgs...> instance;
81 template<
class T,
typename ... ConstructorArgs>
83 _factoryName = std::string(
"GGSFactory<");
85 char *demangled = abi::__cxa_demangle(
typeid(T).name(), NULL, NULL, &result);
87 std::string demangledStr(demangled);
88 _factoryName.append(demangledStr);
91 _factoryName.append(
"UNKNOWN_CLASS");
94 _factoryName.append(
">");
98 template<
class T,
typename ... ConstructorArgs>
100 T *(*objectBuilder)(ConstructorArgs...)) {
101 const std::string &routineName(_factoryName +
"::RegisterBuilder");
103 std::pair<typename BuildersMap::iterator, bool> insertResult = _builders.insert(
104 std::pair<std::string, T *(*)(ConstructorArgs...)>(builderName, objectBuilder));
105 if (insertResult.second) {
106 _builderNames.push_back(builderName);
107 COUT(DEBUG) <<
"Registered builder " << builderName <<
ENDL;
111 COUT(ERROR) <<
"Impossible to register class builder " << builderName
112 <<
": a class builder with the same name is already registered." <<
ENDL;
117 template<
class T,
typename ... ConstructorArgs>
119 return _builderNames;
122 template<
class T,
typename ... ConstructorArgs>
124 ConstructorArgs ... arguments) {
125 const std::string &routineName(_factoryName +
"::CreateObject");
128 typename BuildersMap::iterator builderIter = _builders.find(builderName);
129 if (builderIter == _builders.end()) {
130 COUT(ERROR) <<
"No available class builder with name " << builderName <<
"." <<
ENDL;
131 return std::unique_ptr<T>((T*)(NULL));
135 return std::unique_ptr<T>((*(builderIter->second))(arguments...));
std::unique_ptr< T > CreateObject(const std::string &name, ConstructorArgs...arguments)
Create an object.
#define COUT(level)
Smart log macro. It writes on stdout only if the specified verbosity level is lesser than the maximum...
const std::vector< std::string > & GetListOfRegisteredBuilders()
Gets a vector containing the names of available registered builders.
static GGSFactory & GetInstance()
Getter method for singleton pointer.
bool RegisterBuilder(const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...))
Register a builder for a class.