1
Fork 0

[rustc_data_structures] Use partition_point to find binary_search_slice end.

This commit is contained in:
Taras Tsugrii 2023-07-29 19:42:22 -07:00
parent fb53384c94
commit 9ced089569

View file

@ -14,31 +14,18 @@ where
let start = data.partition_point(|x| key_fn(x) < *key); let start = data.partition_point(|x| key_fn(x) < *key);
// At this point `start` either points at the first entry with equal or // At this point `start` either points at the first entry with equal or
// greater key or is equal to `size` in case all elements have smaller keys // greater key or is equal to `size` in case all elements have smaller keys
// Invariant: start == size || key_fn(&data[start]) >= *key
if start == size || key_fn(&data[start]) != *key { if start == size || key_fn(&data[start]) != *key {
return &[]; return &[];
}; };
// Invariant: start < size && key_fn(&data[start]) == *key
// Now search forward to find the *last* one. // Find the first entry with key > `key`. Skip `start` entries since
let mut end = start; // key_fn(&data[start]) == *key
let mut previous = start; // Invariant: offset == size || key_fn(&data[offset]) >= *key
let mut step = 1; let offset = start + 1;
loop { let end = data[offset..].partition_point(|x| key_fn(x) <= *key) + offset;
end = end.saturating_add(step).min(size); // Invariant: end == size || key_fn(&data[end]) > *key
if end == size || key_fn(&data[end]) != *key {
break;
}
previous = end;
step *= 2;
}
step = end - previous;
while step > 1 {
let half = step / 2;
let mid = end - half;
if key_fn(&data[mid]) != *key {
end = mid;
}
step -= half;
}
&data[start..end] &data[start..end]
} }