@@ -204,6 +204,7 @@ static auto loop_iterator(
204
204
) -> void {
205
205
std::vector<system_like_id_variant> parallel_system_list;
206
206
auto unsafe_comps = std::set<ecsact_component_like_id>{};
207
+ auto safe_ro_comps = std::set<ecsact_component_like_id>{};
207
208
208
209
using ecsact::meta::decl_full_name;
209
210
@@ -227,7 +228,9 @@ static auto loop_iterator(
227
228
}
228
229
229
230
auto capabilities = ecsact::meta::system_capabilities (sys_like_id);
231
+
230
232
auto child_unsafe_comps = std::set<ecsact_component_like_id>{};
233
+ auto child_safe_ro_comps = std::set<ecsact_component_like_id>{};
231
234
auto child_systems = ecsact::meta::get_child_system_ids (sys_like_id);
232
235
233
236
for (auto child_sys_id : child_systems) {
@@ -251,22 +254,18 @@ static auto loop_iterator(
251
254
} else {
252
255
child_unsafe_comps.insert (child_comp_id);
253
256
}
257
+ } else {
258
+ if (child_capability == ECSACT_SYS_CAP_READONLY ||
259
+ child_capability == ECSACT_SYS_CAP_OPTIONAL_READONLY) {
260
+ child_safe_ro_comps.insert (child_comp_id);
261
+ }
254
262
}
255
263
}
256
264
}
257
265
258
266
for (const auto [comp_id, capability] : capabilities) {
259
267
auto cpp_name = decl_full_name (comp_id);
260
268
261
- if (unsafe_comps.contains (comp_id)) {
262
- if (capability == ECSACT_SYS_CAP_READONLY ||
263
- capability == ECSACT_SYS_CAP_OPTIONAL_READONLY) {
264
- parallel_system_cluster.push_back (parallel_system_list);
265
- loop_iterator (system_list, iterator, parallel_system_cluster);
266
- return ;
267
- }
268
- }
269
-
270
269
if (!is_capability_safe (capability)) {
271
270
if (!unsafe_comps.contains (comp_id)) {
272
271
unsafe_comps.insert (comp_id);
@@ -275,12 +274,29 @@ static auto loop_iterator(
275
274
loop_iterator (system_list, iterator, parallel_system_cluster);
276
275
return ;
277
276
}
277
+ } else {
278
+ if (capability == ECSACT_SYS_CAP_READONLY ||
279
+ capability == ECSACT_SYS_CAP_OPTIONAL_READONLY) {
280
+ safe_ro_comps.insert (comp_id);
281
+ }
282
+ }
283
+
284
+ if (unsafe_comps.contains (comp_id) && safe_ro_comps.contains (comp_id)) {
285
+ parallel_system_cluster.push_back (parallel_system_list);
286
+ loop_iterator (system_list, iterator, parallel_system_cluster);
287
+ return ;
288
+ }
289
+ }
290
+
291
+ for (auto child_safe_ro_comp : child_safe_ro_comps) {
292
+ if (!safe_ro_comps.contains (child_safe_ro_comp)) {
293
+ safe_ro_comps.insert (child_safe_ro_comp);
278
294
}
279
295
}
280
296
281
- for (auto unsafe_comp : child_unsafe_comps) {
282
- if (!unsafe_comps.contains (unsafe_comp )) {
283
- unsafe_comps.insert (unsafe_comp );
297
+ for (auto child_unsafe_comp : child_unsafe_comps) {
298
+ if (!unsafe_comps.contains (child_unsafe_comp )) {
299
+ unsafe_comps.insert (child_unsafe_comp );
284
300
}
285
301
}
286
302
0 commit comments