30 template <
class T,
typename... ConstructorArgs>
class GGSFactory {
45 bool RegisterBuilder(
const std::string &builderName, T *(*objectBuilder)(ConstructorArgs...));
55 std::unique_ptr<T>
CreateObject(
const std::string &name, ConstructorArgs... arguments);
65 std::string _factoryName;
66 typedef std::map<std::string, T *(*)(ConstructorArgs...)> BuildersMap;
67 BuildersMap _builders;
68 std::vector<std::string> _builderNames;
71 template <
class T,
typename... ConstructorArgs>
73 static GGSFactory<T, ConstructorArgs...> instance;
79 _factoryName = std::string(
"GGSFactory<");
81 char *demangled = abi::__cxa_demangle(
typeid(T).name(), NULL, NULL, &result);
83 std::string demangledStr(demangled);
84 _factoryName.append(demangledStr);
86 _factoryName.append(
"UNKNOWN_CLASS");
89 _factoryName.append(
">");
92 template <
class T,
typename... ConstructorArgs>
94 T *(*objectBuilder)(ConstructorArgs...)) {
95 const std::string &routineName(_factoryName +
"::RegisterBuilder");
97 std::pair<typename BuildersMap::iterator, bool> insertResult =
98 _builders.insert(std::pair<std::string, T *(*)(ConstructorArgs...)>(builderName, objectBuilder));
99 if (insertResult.second) {
100 _builderNames.push_back(builderName);
101 GGSCOUT(DEBUG) <<
"Registered builder " << builderName <<
GGSENDL;
104 GGSCOUT(ERROR) <<
"Impossible to register class builder " << builderName
105 <<
": a class builder with the same name is already registered." <<
GGSENDL;
110 template <
class T,
typename... ConstructorArgs>
112 return _builderNames;
115 template <
class T,
typename... ConstructorArgs>
117 ConstructorArgs... arguments) {
118 const std::string &routineName(_factoryName +
"::CreateObject");
121 typename BuildersMap::iterator builderIter = _builders.find(builderName);
122 if (builderIter == _builders.end()) {
123 GGSCOUT(ERROR) <<
"No available class builder with name " << builderName <<
"." <<
GGSENDL;
124 return std::unique_ptr<T>((T *)(NULL));
128 return std::unique_ptr<T>((*(builderIter->second))(arguments...));
std::unique_ptr< T > CreateObject(const std::string &name, ConstructorArgs...arguments)
Create an object.
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.