29 template <
class T,
typename... ConstructorArgs>
class GGSFactory {
44 bool RegisterBuilder(
const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...));
54 std::unique_ptr<T>
CreateObject(
const std::string &name, ConstructorArgs... arguments);
64 std::string _factoryName;
65 typedef std::map<std::string, T *(*)(ConstructorArgs...)> BuildersMap;
66 BuildersMap _builders;
67 std::vector<std::string> _builderNames;
70 template <
class T,
typename... ConstructorArgs>
72 static GGSFactory<T, ConstructorArgs...> instance;
78 _factoryName = std::string(
"GGSFactory<");
80 char *demangled = abi::__cxa_demangle(
typeid(T).name(), NULL, NULL, &result);
82 std::string demangledStr(demangled);
83 _factoryName.append(demangledStr);
85 _factoryName.append(
"UNKNOWN_CLASS");
88 _factoryName.append(
">");
91 template <
class T,
typename... ConstructorArgs>
93 T *(*objectBuilder)(ConstructorArgs...)) {
94 const std::string &routineName(_factoryName +
"::RegisterBuilder");
96 std::pair<typename BuildersMap::iterator, bool> insertResult =
97 _builders.insert(std::pair<std::string, T *(*)(ConstructorArgs...)>(builderName, objectBuilder));
98 if (insertResult.second) {
99 _builderNames.push_back(builderName);
100 COUT(DEBUG) <<
"Registered builder " << builderName <<
ENDL;
103 COUT(ERROR) <<
"Impossible to register class builder " << builderName
104 <<
": a class builder with the same name is already registered." <<
ENDL;
109 template <
class T,
typename... ConstructorArgs>
111 return _builderNames;
114 template <
class T,
typename... ConstructorArgs>
116 ConstructorArgs... arguments) {
117 const std::string &routineName(_factoryName +
"::CreateObject");
120 typename BuildersMap::iterator builderIter = _builders.find(builderName);
121 if (builderIter == _builders.end()) {
122 COUT(ERROR) <<
"No available class builder with name " << builderName <<
"." <<
ENDL;
123 return std::unique_ptr<T>((T *)(NULL));
127 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.