18
18
#include < list>
19
19
#include < mutex>
20
20
#include < set>
21
- #include < unordered_set>
22
21
23
22
#include < gz/common/StringUtils.hh>
24
23
@@ -110,31 +109,23 @@ size_t SystemManager::ActivatePendingSystems()
110
109
this ->systems .push_back (system );
111
110
112
111
if (system .configure )
113
- this ->systemsConfigure .emplace_back (
114
- system .parentEntity ,
115
- system .configure );
112
+ this ->systemsConfigure .push_back (system .configure );
116
113
117
114
if (system .configureParameters )
118
- this ->systemsConfigureParameters .emplace_back (
119
- system .parentEntity ,
120
- system .configureParameters );
115
+ this ->systemsConfigureParameters .push_back (system .configureParameters );
121
116
122
117
if (system .reset )
123
- this ->systemsReset .emplace_back (system .parentEntity ,
124
- system .reset );
118
+ this ->systemsReset .push_back (system .reset );
125
119
126
120
if (system .preupdate )
127
- this ->systemsPreupdate .emplace_back (system .parentEntity ,
128
- system .preupdate );
121
+ this ->systemsPreupdate .push_back (system .preupdate );
129
122
130
123
if (system .update )
131
- this ->systemsUpdate .emplace_back (system .parentEntity ,
132
- system .update );
124
+ this ->systemsUpdate .push_back (system .update );
133
125
134
126
if (system .postupdate )
135
127
{
136
128
this ->systemsPostupdate .push_back (system .postupdate );
137
- this ->postUpdateParents .push_back (system .parentEntity );
138
129
}
139
130
}
140
131
@@ -169,7 +160,6 @@ void SystemManager::Reset(const UpdateInfo &_info, EntityComponentManager &_ecm)
169
160
this ->systemsPreupdate .clear ();
170
161
this ->systemsUpdate .clear ();
171
162
this ->systemsPostupdate .clear ();
172
- this ->postUpdateParents .clear ();
173
163
174
164
std::vector<PluginInfo> pluginsToBeLoaded;
175
165
@@ -291,42 +281,37 @@ void SystemManager::AddSystemImpl(
291
281
}
292
282
293
283
// ////////////////////////////////////////////////
294
- const std::vector<SystemIfaceWithParent<ISystemConfigure>>&
295
- SystemManager::SystemsConfigure ()
284
+ const std::vector<ISystemConfigure *>& SystemManager::SystemsConfigure ()
296
285
{
297
286
return this ->systemsConfigure ;
298
287
}
299
288
300
- const std::vector<SystemIfaceWithParent< ISystemConfigureParameters> >&
289
+ const std::vector<ISystemConfigureParameters * >&
301
290
SystemManager::SystemsConfigureParameters ()
302
291
{
303
292
return this ->systemsConfigureParameters ;
304
293
}
305
294
306
295
// ////////////////////////////////////////////////
307
- const std::vector<SystemIfaceWithParent<ISystemReset>>&
308
- SystemManager::SystemsReset ()
296
+ const std::vector<ISystemReset *> &SystemManager::SystemsReset ()
309
297
{
310
298
return this ->systemsReset ;
311
299
}
312
300
313
301
// ////////////////////////////////////////////////
314
- const std::vector<SystemIfaceWithParent<ISystemPreUpdate>>&
315
- SystemManager::SystemsPreUpdate ()
302
+ const std::vector<ISystemPreUpdate *>& SystemManager::SystemsPreUpdate ()
316
303
{
317
304
return this ->systemsPreupdate ;
318
305
}
319
306
320
307
// ////////////////////////////////////////////////
321
- const std::vector<SystemIfaceWithParent<ISystemUpdate>>&
322
- SystemManager::SystemsUpdate ()
308
+ const std::vector<ISystemUpdate *>& SystemManager::SystemsUpdate ()
323
309
{
324
310
return this ->systemsUpdate ;
325
311
}
326
312
327
313
// ////////////////////////////////////////////////
328
- const std::vector<ISystemPostUpdate *>&
329
- SystemManager::SystemsPostUpdate ()
314
+ const std::vector<ISystemPostUpdate *>& SystemManager::SystemsPostUpdate ()
330
315
{
331
316
return this ->systemsPostupdate ;
332
317
}
@@ -445,6 +430,13 @@ void RemoveFromVectorIf(std::vector<Tp>& vec,
445
430
{
446
431
vec.erase (std::remove_if (vec.begin (), vec.end (), pred), vec.end ());
447
432
}
433
+ template <typename Tp>
434
+ void removeFromVector (std::vector<Tp> &_vec, const Tp &_value)
435
+ {
436
+ _vec.erase (std::remove_if (_vec.begin (), _vec.end (),
437
+ [&](const auto &_arg) { return _arg == _value; }),
438
+ _vec.end ());
439
+ }
448
440
449
441
// ////////////////////////////////////////////////
450
442
void SystemManager::ProcessRemovedEntities (
@@ -460,58 +452,40 @@ void SystemManager::ProcessRemovedEntities(
460
452
return ;
461
453
}
462
454
463
- RemoveFromVectorIf (this ->systemsReset ,
464
- [&](const SystemIfaceWithParent<ISystemReset>& system ) {
465
- return _ecm.IsMarkedForRemoval (system .parent );
466
- });
467
- RemoveFromVectorIf (this ->systemsPreupdate ,
468
- [&](const SystemIfaceWithParent<ISystemPreUpdate>& system ) {
469
- return _ecm.IsMarkedForRemoval (system .parent );
470
- });
471
- RemoveFromVectorIf (this ->systemsUpdate ,
472
- [&](const SystemIfaceWithParent<ISystemUpdate>& system ) {
473
- return _ecm.IsMarkedForRemoval (system .parent );
474
- });
455
+ std::vector<SystemInternal> markedForRemoval;
456
+ for (const auto &system : this ->systems )
457
+ {
458
+ if (_ecm.IsMarkedForRemoval (system .parentEntity ))
459
+ {
460
+ markedForRemoval.push_back (system );
461
+ }
462
+ }
475
463
476
- std::unordered_set<ISystemPostUpdate *> markedForRemoval;
477
- for (std::size_t i = 0 ; i < this ->systemsPostupdate .size (); i++)
464
+ for (const auto &system : markedForRemoval)
478
465
{
479
- if (_ecm.IsMarkedForRemoval (postUpdateParents[i]))
466
+ removeFromVector (this ->systemsReset , system .reset );
467
+ removeFromVector (this ->systemsPreupdate , system .preupdate );
468
+ removeFromVector (this ->systemsUpdate , system .update );
469
+
470
+ if (system .postupdate )
480
471
{
481
472
// If system with a PostUpdate is marked for removal
482
473
// mark all worker threads for removal.
483
474
_needsCleanUp = true ;
484
- markedForRemoval.insert (this ->systemsPostupdate [i]);
485
475
}
486
- }
487
476
488
- RemoveFromVectorIf (this ->systemsPostupdate ,
489
- [&](const auto system ) {
490
- if (markedForRemoval.count (system )) {
491
- return true ;
492
- }
493
- return false ;
494
- });
477
+ removeFromVector (this ->systemsPostupdate , system .postupdate );
478
+ removeFromVector (this ->systemsConfigure , system .configure );
479
+ removeFromVector (this ->systemsConfigureParameters , system .configureParameters );
480
+ RemoveFromVectorIf (this ->systems ,
481
+ [&](const SystemInternal& _arg) {
482
+ return _arg.parentEntity == system .parentEntity ;
483
+ });
484
+ }
495
485
496
- RemoveFromVectorIf (this ->postUpdateParents ,
497
- [&](const Entity& entity){
498
- return _ecm.IsMarkedForRemoval (entity);
499
- }
500
- );
501
- RemoveFromVectorIf (this ->systemsConfigure ,
502
- [&](const SystemIfaceWithParent<ISystemConfigure>& system ) {
503
- return _ecm.IsMarkedForRemoval (system .parent );
504
- });
505
- RemoveFromVectorIf (this ->systemsConfigureParameters ,
506
- [&](const SystemIfaceWithParent<ISystemConfigureParameters>& system ) {
507
- return _ecm.IsMarkedForRemoval (system .parent );
508
- });
509
- RemoveFromVectorIf (this ->systems , [&](const SystemInternal& system ) {
510
- return _ecm.IsMarkedForRemoval (system .parentEntity );
511
- });
512
486
std::lock_guard lock (this ->pendingSystemsMutex );
513
487
RemoveFromVectorIf (this ->pendingSystems ,
514
- [&](const SystemInternal& system ) {
515
- return _ecm.IsMarkedForRemoval (system .parentEntity );
488
+ [&](const SystemInternal& _system ) {
489
+ return _ecm.IsMarkedForRemoval (_system .parentEntity );
516
490
});
517
491
}
0 commit comments