21 #include <unordered_map>
23 #include "ngraph/ngraph_visibility.hpp"
27 NGRAPH_API std::mutex& get_registry_mutex();
30 template <
typename BASE_TYPE>
34 using Factory = std::function<BASE_TYPE*()>;
35 using FactoryMap = std::unordered_map<typename BASE_TYPE::type_info_t, Factory>;
38 template <
typename DERIVED_TYPE>
39 static Factory get_default_factory()
41 return []() {
return new DERIVED_TYPE(); };
45 void register_factory(
const typename BASE_TYPE::type_info_t& type_info, Factory factory)
47 std::lock_guard<std::mutex> guard(get_registry_mutex());
48 m_factory_map[type_info] = factory;
52 template <
typename DERIVED_TYPE>
59 template <
typename DERIVED_TYPE>
62 register_factory<DERIVED_TYPE>(get_default_factory<DERIVED_TYPE>());
68 std::lock_guard<std::mutex> guard(get_registry_mutex());
69 return m_factory_map.find(info) != m_factory_map.end();
73 template <
typename DERIVED_TYPE>
80 BASE_TYPE*
create(
const typename BASE_TYPE::type_info_t& type_info)
const
82 std::lock_guard<std::mutex> guard(get_registry_mutex());
83 auto it = m_factory_map.find(type_info);
84 return it == m_factory_map.end() ? nullptr : it->second();
88 template <
typename DERIVED_TYPE>
91 return create(DERIVED_TYPE::type_info);
98 FactoryMap m_factory_map;