PeriDyno 1.2.1
Loading...
Searching...
No Matches
ModulePort.h
Go to the documentation of this file.
1
16#pragma once
17#include <string>
18#include <vector>
19#include <memory>
20
21namespace dyno {
22
23 class Module;
24 class FCallBackFunc;
25
32
38 {
39 public:
40 ModulePort(std::string name, std::string description, Module* parent = nullptr);
41 virtual ~ModulePort() { mModules.clear(); };
42
43 virtual std::string getPortName() { return m_name; };
44
46
47 void setPortType(ModulePortType portType);
48
49 virtual std::vector<Module*>& getModules() { return mModules; }
50
51
52 virtual bool isKindOf(Module* m) = 0;
53
54 virtual bool hasModule(Module* m) = 0;
55
56 inline Module* getParent() { return m_parent; }
57
58 virtual void clear();
59
60 void attach(std::shared_ptr<FCallBackFunc> func);
61
62 protected:
63 virtual bool addModule(Module* m) = 0;
64
65 virtual bool removeModule(Module* m) = 0;
66
67 //To call all callback function if connected
68 virtual void notify();
69
70 std::vector<Module*> mModules;
71
72 private:
73
74 Module* m_parent = nullptr;
75
76 std::string m_name;
77 std::string m_description;
79
80 std::vector<std::shared_ptr<FCallBackFunc>> mCallbackFunc;
81
82 friend class Module;
83 };
84
85 void disconnect(Module* m, ModulePort* port);
86
87 template<typename T>
89 {
90 public:
91 SingleModulePort(std::string name, std::string description, Module* parent = nullptr)
92 : ModulePort(name, description, parent)
93 {
95 this->getModules().resize(1);
96 };
97
98 ~SingleModulePort() override {
99 //Disconnect nodes from node ports here instead of inside the destructor of Node to avoid memory leak
100 if (mModules[0] != nullptr) {
101 disconnect(mModules[0], this);
102 //m_nodes[0]->disconnect(this);
103 }
104 mModules[0] = nullptr;
105 }
106
107 bool isKindOf(Module* m) override
108 {
109 return nullptr != dynamic_cast<T*>(m) && !hasModule(m);
110 }
111
113 {
114 return mDerivedModule == dynamic_cast<T*>(m);
115 }
116
117 std::vector<Module*>& getModules() override
118 {
119 if (mModules.size() != 1)
120 mModules.resize(1);
121
122 mModules[0] = dynamic_cast<Module*>(mDerivedModule);
123
124 return mModules;
125 }
126
128 {
129 return mDerivedModule;
130 }
131
132 bool setDerivedModule(T* derived) {
133 if (derived != nullptr)
134 {
135 if (mDerivedModule != nullptr) {
136 mDerivedModule = nullptr;
137 }
138
139 mDerivedModule = derived;
140 mModules[0] = derived;
141
142 return true;
143 }
144 else
145 {
146 if (mDerivedModule != nullptr)
147 {
148 //this->removeNodeFromParent(dynamic_cast<Node*>(m_derived_node));
149 mDerivedModule = nullptr;
150 mModules[0] = nullptr;
151 }
152 }
153
154 return false;
155 }
156
157 protected:
158 bool addModule(Module* m) override
159 {
160 auto derived = dynamic_cast<T*>(m);
161 if (derived != nullptr)
162 {
163 return setDerivedNode(derived);
164 }
165
166 return false;
167 }
168
169 bool removeModule(Module* m) override
170 {
171 mModules[0] = nullptr;
172 mDerivedModule = nullptr;
173
174 return true;
175 }
176
177 private:
178 T* mDerivedModule = nullptr;
179 };
180
181
182 template<typename T>
184 {
185 public:
186 MultipleModulePort(std::string name, std::string description, Module* parent = nullptr)
187 : ModulePort(name, description, parent)
188 {
190 };
191
193 //Disconnect nodes from node ports here instead of inside the destructor of Node to avoid memory leak
194 for(auto m : mModules)
195 {
196 disconnect(m, this);
197 //node->disconnect(this);
198 }
199
200 mDerivedModules.clear();
201 }
202
203 void clear() override
204 {
205 mDerivedModules.clear();
206
208 }
209
211 if (m != nullptr)
212 {
213 auto it = find(mDerivedModules.begin(), mDerivedModules.end(), m);
214
215 if (it == mDerivedModules.end())
216 {
217 mDerivedModules.push_back(m);
218
219 //this->addNodeToParent(dynamic_cast<Node*>(d_node));
220
221 return true;
222 }
223 }
224
225 return false;
226 }
227
229 {
230 if (m != nullptr)
231 {
232 auto it = find(mDerivedModules.begin(), mDerivedModules.end(), m);
233
234 if (it != mDerivedModules.end())
235 {
236 mDerivedModules.erase(it);
237 //this->removeNodeFromParent(dynamic_cast<Node*>(d_node));
238
239 return true;
240 }
241 }
242
243 return false;
244 }
245
246 bool isKindOf(Module* m) override
247 {
248 return nullptr != dynamic_cast<T*>(m) && !hasModule(m);
249 }
250
252 {
253 auto derived = dynamic_cast<T*>(m);
254 for (auto m : mDerivedModules)
255 {
256 if (m == derived)
257 return true;
258 }
259
260 return false;
261 }
262
263 std::vector<Module*>& getModules() override
264 {
265 mModules.clear();
266 mModules.resize(mDerivedModules.size());
267 for (int i = 0; i < mModules.size(); i++)
268 {
269 mModules[i] = dynamic_cast<Module*>(mDerivedModules[i]);
270 }
271 return mModules;
272 }
273
274 inline std::vector<T*>& getDerivedModules()
275 {
276 return mDerivedModules;
277 }
278
279 protected:
280 bool addModule(Module* m) override {
281 auto derived = dynamic_cast<T*>(m);
282 if (derived != nullptr)
283 {
284 addDerivedModule(derived);
285 }
286
287 return false;
288 }
289
290 bool removeModule(Module* m) override
291 {
292 auto derived = dynamic_cast<T*>(m);
293
294 if (derived != nullptr)
295 {
296 return removeDerivedModule(derived);
297 }
298
299 return false;
300 }
301
302 private:
303 std::vector<T*> mDerivedModules;
304 };
305}
Input ports for Module.
Definition ModulePort.h:38
virtual bool hasModule(Module *m)=0
ModulePortType getPortType()
friend class Module
Definition ModulePort.h:82
virtual bool isKindOf(Module *m)=0
void setPortType(ModulePortType portType)
std::vector< Module * > mModules
Definition ModulePort.h:70
virtual bool removeModule(Module *m)=0
virtual std::string getPortName()
Definition ModulePort.h:43
Module * m_parent
Definition ModulePort.h:74
virtual void clear()
void attach(std::shared_ptr< FCallBackFunc > func)
std::string m_name
Definition ModulePort.h:76
Module * getParent()
Definition ModulePort.h:56
std::vector< std::shared_ptr< FCallBackFunc > > mCallbackFunc
Definition ModulePort.h:80
ModulePort(std::string name, std::string description, Module *parent=nullptr)
Definition ModulePort.cpp:7
ModulePortType m_portType
Definition ModulePort.h:78
virtual bool addModule(Module *m)=0
virtual ~ModulePort()
Definition ModulePort.h:41
std::string m_description
Definition ModulePort.h:77
virtual void notify()
virtual std::vector< Module * > & getModules()
Definition ModulePort.h:49
bool addModule(Module *m) override
Definition ModulePort.h:280
std::vector< T * > & getDerivedModules()
Definition ModulePort.h:274
bool isKindOf(Module *m) override
Definition ModulePort.h:246
MultipleModulePort(std::string name, std::string description, Module *parent=nullptr)
Definition ModulePort.h:186
std::vector< T * > mDerivedModules
Definition ModulePort.h:303
bool hasModule(Module *m)
Definition ModulePort.h:251
bool removeDerivedModule(T *m)
Definition ModulePort.h:228
void clear() override
Definition ModulePort.h:203
std::vector< Module * > & getModules() override
Definition ModulePort.h:263
bool removeModule(Module *m) override
Definition ModulePort.h:290
bool setDerivedModule(T *derived)
Definition ModulePort.h:132
bool isKindOf(Module *m) override
Definition ModulePort.h:107
bool hasModule(Module *m)
Definition ModulePort.h:112
~SingleModulePort() override
Definition ModulePort.h:98
std::vector< Module * > & getModules() override
Definition ModulePort.h:117
bool addModule(Module *m) override
Definition ModulePort.h:158
SingleModulePort(std::string name, std::string description, Module *parent=nullptr)
Definition ModulePort.h:91
bool removeModule(Module *m) override
Definition ModulePort.h:169
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
void disconnect(Module *m, ModulePort *port)
ModulePortType
Definition ModulePort.h:27
@ M_Multiple
Definition ModulePort.h:29
@ M_Single
Definition ModulePort.h:28
@ M_Unknown
Definition ModulePort.h:30