9 #include <unordered_map>
11 #include "ngraph/ngraph_visibility.hpp"
15 NGRAPH_API std::mutex& get_registry_mutex();
18 template <
typename BASE_TYPE>
22 using Factory = std::function<BASE_TYPE*()>;
23 using FactoryMap = std::unordered_map<typename BASE_TYPE::type_info_t, Factory>;
26 template <
typename DERIVED_TYPE>
27 static Factory get_default_factory()
29 return []() {
return new DERIVED_TYPE(); };
33 void register_factory(
const typename BASE_TYPE::type_info_t& type_info, Factory factory)
35 std::lock_guard<std::mutex> guard(get_registry_mutex());
36 m_factory_map[type_info] = factory;
40 template <
typename DERIVED_TYPE>
47 template <
typename DERIVED_TYPE>
50 register_factory<DERIVED_TYPE>(get_default_factory<DERIVED_TYPE>());
56 std::lock_guard<std::mutex> guard(get_registry_mutex());
57 return m_factory_map.find(info) != m_factory_map.end();
61 template <
typename DERIVED_TYPE>
68 BASE_TYPE*
create(
const typename BASE_TYPE::type_info_t& type_info)
const
70 std::lock_guard<std::mutex> guard(get_registry_mutex());
71 auto it = m_factory_map.find(type_info);
72 return it == m_factory_map.end() ? nullptr : it->second();
76 template <
typename DERIVED_TYPE>
79 return create(DERIVED_TYPE::type_info);
83 FactoryMap m_factory_map;
Registry of factories that can construct objects derived from BASE_TYPE.
Definition: factory.hpp:20
void register_factory()
Register the defualt constructor factory for DERIVED_TYPE.
Definition: factory.hpp:48
void register_factory(Factory factory)
Register a custom factory for DERIVED_TYPE.
Definition: factory.hpp:41
bool has_factory(const typename BASE_TYPE::type_info_t &info)
Check to see if a factory is registered.
Definition: factory.hpp:54
BASE_TYPE * create() const
Create an instance using factory for DERIVED_TYPE.
Definition: factory.hpp:77
BASE_TYPE * create(const typename BASE_TYPE::type_info_t &type_info) const
Create an instance for type_info.
Definition: factory.hpp:68
bool has_factory()
Check to see if DERIVED_TYPE has a registered factory.
Definition: factory.hpp:62
void register_factory(const typename BASE_TYPE::type_info_t &type_info, Factory factory)
Register a custom factory for type_info.
Definition: factory.hpp:33
The Intel nGraph C++ API.
Definition: attribute_adapter.hpp:16