12
12
#include < limits>
13
13
#include " ifactory.h"
14
14
#include " ../kit.h"
15
+ #include " ../meta/meta.h"
15
16
16
17
// TODO: add some way to have resolvers pass data into constructor instead
17
18
// of relying on unchangable ctor parameters (hmm...)
18
19
// TODO: or how about add second callback for after the ctor (?)
19
20
// Let's use signals :D
20
21
21
- template <class Class , class T , class ClassName =std::string>
22
+ template <
23
+ class Class ,
24
+ class T ,
25
+ class ClassName =std::string,
26
+ class Mutex =kit::optional_mutex<std::recursive_mutex>
27
+ >
22
28
class Factory :
23
29
public IFactory,
24
- virtual public kit::mutexed<std::recursive_mutex >
30
+ virtual public kit::mutexed<Mutex >
25
31
{
26
32
private:
27
33
@@ -44,13 +50,27 @@ class Factory:
44
50
45
51
std::function<unsigned (const T&)> m_Resolver;
46
52
std::function<T(const T&)> m_Transformer;
53
+ std::shared_ptr<MetaBase<Mutex>> m_pConfig;
47
54
48
55
public:
49
56
57
+ Factory ():
58
+ m_pConfig (std::make_shared<MetaBase<Mutex>>())
59
+ {}
60
+ Factory (std::string fn):
61
+ m_pConfig (std::make_shared<MetaBase<Mutex>>(fn))
62
+ {}
63
+ Factory (std::shared_ptr<Meta> cfg):
64
+ m_pConfig (std::make_shared<MetaBase<Mutex>>(cfg))
65
+ {}
66
+
67
+ std::shared_ptr<MetaBase<Mutex>> config () { return m_pConfig; }
68
+ std::shared_ptr<const MetaBase<Mutex>> config () const { return m_pConfig; }
69
+
50
70
virtual ~Factory () {}
51
71
52
72
bool empty () const {
53
- auto l = lock ();
73
+ auto l = this -> lock ();
54
74
return m_Classes.empty ();
55
75
}
56
76
@@ -62,7 +82,7 @@ class Factory:
62
82
) {
63
83
// bind subclass's make_shared() to functor and store it in m_Classes list
64
84
// TODO: exceptions?
65
- auto l = lock ();
85
+ auto l = this -> lock ();
66
86
67
87
const size_t size = m_Classes.size ();
68
88
if (id == std::numeric_limits<unsigned >::max ()) // don't care about class ID
@@ -92,12 +112,12 @@ class Factory:
92
112
}
93
113
94
114
void register_resolver (std::function<unsigned (const T&)> func) {
95
- auto l = lock ();
115
+ auto l = this -> lock ();
96
116
m_Resolver = func;
97
117
}
98
118
99
119
unsigned class_id (ClassName name) const {
100
- auto l = lock ();
120
+ auto l = this -> lock ();
101
121
try {
102
122
return m_ClassNames.at (name);
103
123
} catch (const std::out_of_range&) {}
@@ -108,14 +128,14 @@ class Factory:
108
128
}
109
129
110
130
std::shared_ptr<Class> create (unsigned id, T args) const {
111
- auto l = lock ();
131
+ auto l = this -> lock ();
112
132
if (m_Transformer)
113
133
args = m_Transformer (args);
114
134
return m_Classes.at (id)(args);
115
135
}
116
136
117
137
std::shared_ptr<Class> create (T args) const {
118
- auto l = lock ();
138
+ auto l = this -> lock ();
119
139
if (m_Transformer)
120
140
args = m_Transformer (args);
121
141
unsigned id = m_Resolver (args);
@@ -132,13 +152,22 @@ class Factory:
132
152
}
133
153
134
154
void register_transformer (std::function<T(const T&)> f) {
135
- auto l = lock ();
155
+ auto l = this -> lock ();
136
156
m_Transformer=f;
137
157
}
138
158
139
159
T transform (const T& t){
140
160
return m_Transformer (t);
141
161
}
162
+
163
+ void share_config (std::shared_ptr<MetaBase<Mutex>> cfg){
164
+ auto l = this ->lock ();
165
+ m_pConfig = cfg;
166
+ }
167
+ std::shared_ptr<MetaBase<Mutex>> share_config () {
168
+ auto l = this ->lock ();
169
+ return m_pConfig;
170
+ }
142
171
143
172
// std::vector<std::shared_ptr<Class>> create_all(
144
173
// const std::vector<T>& object_list
0 commit comments