@@ -204,6 +204,7 @@ static auto loop_iterator(
204204) -> void {
205205 std::vector<system_like_id_variant> parallel_system_list;
206206 auto unsafe_comps = std::set<ecsact_component_like_id>{};
207+ auto safe_ro_comps = std::set<ecsact_component_like_id>{};
207208
208209 using ecsact::meta::decl_full_name;
209210
@@ -227,7 +228,9 @@ static auto loop_iterator(
227228 }
228229
229230 auto capabilities = ecsact::meta::system_capabilities (sys_like_id);
231+
230232 auto child_unsafe_comps = std::set<ecsact_component_like_id>{};
233+ auto child_safe_ro_comps = std::set<ecsact_component_like_id>{};
231234 auto child_systems = ecsact::meta::get_child_system_ids (sys_like_id);
232235
233236 for (auto child_sys_id : child_systems) {
@@ -251,22 +254,18 @@ static auto loop_iterator(
251254 } else {
252255 child_unsafe_comps.insert (child_comp_id);
253256 }
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+ }
254262 }
255263 }
256264 }
257265
258266 for (const auto [comp_id, capability] : capabilities) {
259267 auto cpp_name = decl_full_name (comp_id);
260268
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-
270269 if (!is_capability_safe (capability)) {
271270 if (!unsafe_comps.contains (comp_id)) {
272271 unsafe_comps.insert (comp_id);
@@ -275,12 +274,29 @@ static auto loop_iterator(
275274 loop_iterator (system_list, iterator, parallel_system_cluster);
276275 return ;
277276 }
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);
278294 }
279295 }
280296
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 );
284300 }
285301 }
286302
0 commit comments