PeriDyno 1.2.1
Loading...
Searching...
No Matches
WtDataModelRegistry.h
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <set>
6#include <type_traits>
7#include <unordered_map>
8#include <utility>
9#include <vector>
10
11#include "WtNodeDataModel.h"
12
13using SharedNodeData = std::shared_ptr<WtNodeData>;
15using TypeConverterId = std::pair<NodeDataType, NodeDataType>;
16
17inline bool operator<(NodeDataType const& d1, NodeDataType const& d2)
18{
19 return d1.id < d2.id;
20}
21
23{
24public:
25 using RegistryItemPtr = std::unique_ptr<WtNodeDataModel>;
26 using RegistryItemCreator = std::function<RegistryItemPtr()>;
27 using RegisteredModelCreatorsMap = std::unordered_map<std::string, RegistryItemCreator>;
28 using RegisteredModelsCategoryMap = std::unordered_map<std::string, std::string>;
29 using CategoriesSet = std::set<std::string>;
30 using RegisteredTypeConvertersMap = std::map<TypeConverterId, TypeConverter>;
31
34
37
40
41public:
42 template<typename ModelType>
43 void registerModel(RegistryItemCreator creator, std::string const& category = "Nodes")
44 {
45 const std::string name = computeName<ModelType>(HasStaticMethodName<ModelType>{}, creator);
46 if (!_registeredItemCreators.count(name))
47 {
48 _registeredItemCreators[name] = std::move(creator);
49 _categories.insert(category);
50 _registeredModelsCategory[name] = category;
51 }
52 }
53
54 template<typename ModelType>
55 void registerModel(std::string const& category = "Nodes")
56 {
57 RegistryItemCreator creator = []() { return std::make_unique<ModelType>(); };
58 registerModel<ModelType>(std::move(creator), category);
59 }
60
61 template<typename ModelType>
62 void registerModel(std::string const& category,
63 RegistryItemCreator creator)
64 {
65 registerModel<ModelType>(std::move(creator), category);
66 }
67
68 template <typename ModelCreator>
69 void registerModel(ModelCreator&& creator, std::string const& category = "Nodes")
70 {
71 using ModelType = compute_model_type_t<decltype(creator())>;
72 registerModel<ModelType>(std::forward<ModelCreator>(creator), category);
73 }
74
75 template <typename ModelCreator>
76 void registerModel(std::string const& category, ModelCreator&& creator)
77 {
78 registerModel(std::forward<ModelCreator>(creator), category);
79 }
80
82 TypeConverter typeConverter)
83 {
84 _registeredTypeConverters[id] = std::move(typeConverter);
85 }
86
87 std::unique_ptr<WtNodeDataModel>create(std::string const& modelName);
88
90
92
93 CategoriesSet const& categories() const;
94
95 TypeConverter getTypeConverter(NodeDataType const& d1, NodeDataType const& d2) const;
96
97private:
99
101
103
105
106private:
107 template <typename T, typename = void>
108 struct HasStaticMethodName : std::false_type {};
109
110 template <typename T>
111 struct HasStaticMethodName<T, typename std::enable_if<std::is_same<decltype(T::Name()), std::string>::value>::type>
112 : std::true_type {};
113
114 template <typename ModelType>
115 static std::string computeName(std::true_type, RegistryItemCreator const&)
116 {
117 return ModelType::Name();
118 }
119
120 template<typename ModelType>
121 static std::string computeName(std::false_type, RegistryItemCreator const& creator)
122 {
123 return creator()->name();
124 }
125
126 template <typename T>
128 {
129 // Assert always fires, but the compiler doesn't know this:
130 static_assert(!std::is_same<T, T>::value,
131 "The ModelCreator must return a std::unique_ptr<T>, where T "
132 "inherits from WtNodeDataModel");
133 };
134
135 template <typename T>
136 struct UnwrapUniquePtr<std::unique_ptr<T>>
137 {
138 static_assert(std::is_base_of<WtNodeDataModel, T>::value,
139 "The ModelCreator must return a std::unique_ptr<T>, where T "
140 "inherits from WtNodeDataModel");
141 using type = T;
142 };
143
144 template <typename CreatorResult>
146};
std::shared_ptr< WtNodeData > SharedNodeData
std::pair< NodeDataType, NodeDataType > TypeConverterId
std::function< SharedNodeData(SharedNodeData)> TypeConverter
bool operator<(NodeDataType const &d1, NodeDataType const &d2)
WtDataModelRegistry(WtDataModelRegistry &&)=default
void registerModel(ModelCreator &&creator, std::string const &category="Nodes")
void registerModel(std::string const &category, ModelCreator &&creator)
std::set< std::string > CategoriesSet
std::unordered_map< std::string, RegistryItemCreator > RegisteredModelCreatorsMap
static std::string computeName(std::true_type, RegistryItemCreator const &)
CategoriesSet const & categories() const
WtDataModelRegistry & operator=(WtDataModelRegistry const &)=delete
void registerModel(std::string const &category, RegistryItemCreator creator)
void registerTypeConverter(TypeConverterId const &id, TypeConverter typeConverter)
WtDataModelRegistry & operator=(WtDataModelRegistry &&)=default
std::unordered_map< std::string, std::string > RegisteredModelsCategoryMap
std::unique_ptr< WtNodeDataModel > RegistryItemPtr
RegisteredModelsCategoryMap const & registeredModelsCategoryAssociation() const
WtDataModelRegistry()=default
typename UnwrapUniquePtr< CreatorResult >::type compute_model_type_t
std::map< TypeConverterId, TypeConverter > RegisteredTypeConvertersMap
WtDataModelRegistry(WtDataModelRegistry const &)=delete
void registerModel(std::string const &category="Nodes")
RegisteredModelsCategoryMap _registeredModelsCategory
TypeConverter getTypeConverter(NodeDataType const &d1, NodeDataType const &d2) const
RegisteredModelCreatorsMap _registeredItemCreators
std::unique_ptr< WtNodeDataModel > create(std::string const &modelName)
~WtDataModelRegistry()=default
std::function< RegistryItemPtr()> RegistryItemCreator
RegisteredModelCreatorsMap const & registeredModelCreators() const
RegisteredTypeConvertersMap _registeredTypeConverters
void registerModel(RegistryItemCreator creator, std::string const &category="Nodes")
static std::string computeName(std::false_type, RegistryItemCreator const &creator)
#define T(t)
Definition guid.cpp:136
std::string id