FAST  3.2.0
Framework for Heterogeneous Medical Image Computing and Visualization
ProcessObjectRegistry.hpp
Go to the documentation of this file.
1 #ifndef FAST_PROCESS_OBJECT_REGISTRY_HPP_
2 #define FAST_PROCESS_OBJECT_REGISTRY_HPP_
3 
4 #include <string>
5 #include <unordered_map>
6 #include <functional>
7 #include "FAST/ProcessObject.hpp"
8 #include "FAST/Exception.hpp"
9 
10 
11 namespace fast {
12 
18 class FAST_EXPORT ProcessObjectRegistry {
19  public:
20  using ctor_t = std::function<std::shared_ptr<ProcessObject>()>;
21  using map_t = std::unordered_map<std::string, ctor_t>;
22 
23  static std::shared_ptr<ProcessObject> create(const std::string& class_name) {
24  if (ctors().count(class_name) == 1) {
25  return ctors()[class_name]();
26  }
27  throw Exception("Process object " + class_name + " not registered in ProcessObjectRegistry.");
28  }
29 
30  static bool registerPO(const std::string& class_name, const ctor_t& ctor) {
31  ctors()[class_name] = ctor;
32  return true;
33  }
34 
35  static bool isPORegistered(const std::string& class_name) {
36  return ctors().count(class_name) == 1;
37  }
38 
39  static void unregisterPO(const std::string& class_name) {
40  ctors().erase(class_name);
41  }
42 
43  private:
44  static map_t& ctors() {
45  static map_t ctor_map;
46  return ctor_map;
47  }
48 
49  ProcessObjectRegistry();
50  ProcessObjectRegistry(const ProcessObjectRegistry& other);
51  ProcessObjectRegistry& operator=(const ProcessObjectRegistry& other);
52 };
53 
54 #define FAST_REGISTER_DERIVED(Derived) \
55 []() -> std::shared_ptr<ProcessObject> { return Derived::New(); }
56 
57 #define FAST_REGISTER_PO(Derived) \
58 static bool _registered_##Derived = ProcessObjectRegistry::registerPO(#Derived, FAST_REGISTER_DERIVED(Derived));
59 
60 
61 }
62 
63 #endif
fast::ProcessObjectRegistry::unregisterPO
static void unregisterPO(const std::string &class_name)
Definition: ProcessObjectRegistry.hpp:39
fast::ProcessObjectRegistry::create
static std::shared_ptr< ProcessObject > create(const std::string &class_name)
Definition: ProcessObjectRegistry.hpp:23
fast::Exception
Definition: Exception.hpp:15
fast
Definition: AffineTransformation.hpp:7
fast::ProcessObjectRegistry::isPORegistered
static bool isPORegistered(const std::string &class_name)
Definition: ProcessObjectRegistry.hpp:35
fast::ProcessObjectRegistry::ctor_t
std::function< std::shared_ptr< ProcessObject >()> ctor_t
Definition: ProcessObjectRegistry.hpp:20
fast::ProcessObjectRegistry
Definition: ProcessObjectRegistry.hpp:18
fast::ProcessObjectRegistry::registerPO
static bool registerPO(const std::string &class_name, const ctor_t &ctor)
Definition: ProcessObjectRegistry.hpp:30
ProcessObject.hpp
Exception.hpp
fast::ProcessObjectRegistry::map_t
std::unordered_map< std::string, ctor_t > map_t
Definition: ProcessObjectRegistry.hpp:21