std.sort.partitionPoint: faster implementation (#30005)

Migrated from https://github.com/ziglang/zig/pull/21419

Co-authored-by: Jonathan Hallstrom <lmj.hallstrom@gmail.com>
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/30005
This commit is contained in:
Andrew Kelley 2025-11-27 20:48:54 +01:00
parent 854774d468
commit e427ba9cd5

View file

@ -678,18 +678,23 @@ pub fn partitionPoint(
context: anytype,
comptime predicate: fn (@TypeOf(context), T) bool,
) usize {
var low: usize = 0;
var high: usize = items.len;
var it: usize = 0;
var len: usize = items.len;
while (low < high) {
const mid = low + (high - low) / 2;
if (predicate(context, items[mid])) {
low = mid + 1;
} else {
high = mid;
while (len > 1) {
const half: usize = len / 2;
len -= half;
if (predicate(context, items[it + half - 1])) {
@branchHint(.unpredictable);
it += half;
}
}
return low;
if (it < items.len) {
it += @intFromBool(predicate(context, items[it]));
}
return it;
}
test partitionPoint {