# UNDF: UNDF-2026-000001009 --- a/src/simutrans/simhalt.cc +++ b/src/simutrans/simhalt.cc @@ -1222,6 +1222,10 @@ sint32 haltestelle_t::rebuild_connections() { // halts which either immediately precede or succeed self halt in serving schedules static vector_tpl consecutive_halts[256]; + // hash sets for O(1) dedup of consecutive halts (replaces append_unique + // linear scan which was O(S^2) per category where S = schedule entries) + static inthashtable_tpl consecutive_halts_seen[256]; // halts which either immediately precede or succeed self halt in currently processed schedule static vector_tpl consecutive_halts_schedule[256]; + static inthashtable_tpl consecutive_halts_schedule_seen[256]; // remember max number of consecutive halts for one schedule uint8 max_consecutive_halts_schedule[256]; @@ -1234,6 +1238,8 @@ for( uint8 i=0; iis_enabled(catg_index) ) { // check for consecutive halts which succeed self halt if( previous_halt[catg_index] == self ) { - consecutive_halts[catg_index].append_unique(current_halt); - consecutive_halts_schedule[catg_index].append_unique(current_halt); + uint16 halt_id = current_halt.get_id(); + if( !consecutive_halts_seen[catg_index].get(halt_id) ) { + consecutive_halts_seen[catg_index].put(halt_id, true); + consecutive_halts[catg_index].append(current_halt); + } + if( !consecutive_halts_schedule_seen[catg_index].get(halt_id) ) { + consecutive_halts_schedule_seen[catg_index].put(halt_id, true); + consecutive_halts_schedule[catg_index].append(current_halt); + } } previous_halt[catg_index] = current_halt;