fix: dont sort unstably for catch
This commit is contained in:
+2
-14
@@ -6,7 +6,7 @@ use crate::{
|
|||||||
hit_object::{HitObject, HitObjectKind, HoldNote, Spinner},
|
hit_object::{HitObject, HitObjectKind, HoldNote, Spinner},
|
||||||
mode::ConvertStatus,
|
mode::ConvertStatus,
|
||||||
},
|
},
|
||||||
util::{float_ext::FloatExt, random::Random, sort::TandemSorter},
|
util::{float_ext::FloatExt, random::Random},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
@@ -82,20 +82,8 @@ pub fn convert_objects(
|
|||||||
palpable_objects.extend(new_objects);
|
palpable_objects.extend(new_objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initializing hyper dashes requires objects to be sorted by C#'s unstable
|
|
||||||
// sort. After that, we unsort the objects again and then apply a stable
|
|
||||||
// sort to have the correct order for generating difficulty objects.
|
|
||||||
// Required e.g. due to map /b/102923.
|
|
||||||
let mut sorter = TandemSorter::new_unstable(&palpable_objects, |a, b| {
|
|
||||||
a.start_time.total_cmp(&b.start_time)
|
|
||||||
});
|
|
||||||
|
|
||||||
sorter.sort(&mut palpable_objects);
|
|
||||||
|
|
||||||
initialize_hyper_dash(cs, &mut palpable_objects);
|
|
||||||
|
|
||||||
sorter.unsort(&mut palpable_objects);
|
|
||||||
palpable_objects.sort_by(|a, b| a.start_time.total_cmp(&b.start_time));
|
palpable_objects.sort_by(|a, b| a.start_time.total_cmp(&b.start_time));
|
||||||
|
initialize_hyper_dash(cs, &mut palpable_objects);
|
||||||
|
|
||||||
palpable_objects
|
palpable_objects
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ macro_rules! new_fn {
|
|||||||
|
|
||||||
impl TandemSorter {
|
impl TandemSorter {
|
||||||
new_fn!(new_stable: <[_]>::sort_by);
|
new_fn!(new_stable: <[_]>::sort_by);
|
||||||
new_fn!(new_unstable: super::csharp);
|
|
||||||
|
|
||||||
/// Sort the given slice based on the internal ordering.
|
/// Sort the given slice based on the internal ordering.
|
||||||
pub fn sort<T>(&mut self, slice: &mut [T]) {
|
pub fn sort<T>(&mut self, slice: &mut [T]) {
|
||||||
@@ -59,35 +58,6 @@ impl TandemSorter {
|
|||||||
self.should_reset = true;
|
self.should_reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unsort the given slice based on the internal ordering.
|
|
||||||
pub fn unsort<T>(mut self, slice: &mut [T]) {
|
|
||||||
if self.should_reset {
|
|
||||||
self.toggle_marks();
|
|
||||||
self.should_reset = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in 0..self.indices.len() {
|
|
||||||
let i_idx = self.indices[i];
|
|
||||||
|
|
||||||
if Self::idx_is_marked(i_idx) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut j = i;
|
|
||||||
let mut j_idx = i_idx;
|
|
||||||
|
|
||||||
while j != j_idx {
|
|
||||||
self.indices[j] = Self::toggle_mark_idx(j_idx);
|
|
||||||
self.indices.swap(j, j_idx);
|
|
||||||
slice.swap(j, j_idx);
|
|
||||||
j = self.indices[j];
|
|
||||||
j_idx = self.indices[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
self.indices[j] = Self::toggle_mark_idx(j_idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn toggle_marks(&mut self) {
|
fn toggle_marks(&mut self) {
|
||||||
for idx in self.indices.iter_mut() {
|
for idx in self.indices.iter_mut() {
|
||||||
*idx = Self::toggle_mark_idx(*idx);
|
*idx = Self::toggle_mark_idx(*idx);
|
||||||
|
|||||||
Reference in New Issue
Block a user