1 #ifndef FAST_PROCESS_OBJECT_REGISTRY_HPP_
2 #define FAST_PROCESS_OBJECT_REGISTRY_HPP_
5 #include <unordered_map>
20 using ctor_t = std::function<std::shared_ptr<ProcessObject>()>;
21 using map_t = std::unordered_map<std::string, ctor_t>;
23 static std::shared_ptr<ProcessObject>
create(
const std::string& class_name) {
24 if (ctors().count(class_name) == 1) {
25 return ctors()[class_name]();
27 throw Exception(
"Process object " + class_name +
" not registered in ProcessObjectRegistry.");
31 ctors()[class_name] = ctor;
36 return ctors().count(class_name) == 1;
40 ctors().erase(class_name);
44 static map_t& ctors() {
45 static map_t ctor_map;
49 ProcessObjectRegistry();
50 ProcessObjectRegistry(
const ProcessObjectRegistry& other);
51 ProcessObjectRegistry& operator=(
const ProcessObjectRegistry& other);
54 #define FAST_REGISTER_DERIVED(Derived) \
55 []() -> std::shared_ptr<ProcessObject> { return Derived::New(); }
57 #define FAST_REGISTER_PO(Derived) \
58 static bool _registered_##Derived = ProcessObjectRegistry::registerPO(#Derived, FAST_REGISTER_DERIVED(Derived));