| ... | ... | @@ -868,39 +868,35 @@ fn findLastBackward(comptime T: type, items: []T, value: T, range: Range, lessTh |
| 868 | 868 | } |
| 869 | 869 | |
| 870 | 870 | fn binaryFirst(comptime T: type, items: []T, value: T, range: Range, lessThan: fn (T, T) bool) usize { |
| 871 | | var start = range.start; |
| 872 | | var end = range.end - 1; |
| 871 | var curr = range.start; |
| 872 | var size = range.length(); |
| 873 | 873 | if (range.start >= range.end) return range.end; |
| 874 | | while (start < end) { |
| 875 | | const mid = start + (end - start) / 2; |
| 876 | | if (lessThan(items[mid], value)) { |
| 877 | | start = mid + 1; |
| 878 | | } else { |
| 879 | | end = mid; |
| 874 | while (size > 0) { |
| 875 | const offset = size % 2; |
| 876 | |
| 877 | size /= 2; |
| 878 | const mid = items[curr + size]; |
| 879 | if (lessThan(mid, value)) { |
| 880 | curr += size + offset; |
| 880 | 881 | } |
| 881 | 882 | } |
| 882 | | if (start == range.end - 1 and lessThan(items[start], value)) { |
| 883 | | start += 1; |
| 884 | | } |
| 885 | | return start; |
| 883 | return curr; |
| 886 | 884 | } |
| 887 | 885 | |
| 888 | 886 | fn binaryLast(comptime T: type, items: []T, value: T, range: Range, lessThan: fn (T, T) bool) usize { |
| 889 | | var start = range.start; |
| 890 | | var end = range.end - 1; |
| 887 | var curr = range.start; |
| 888 | var size = range.length(); |
| 891 | 889 | if (range.start >= range.end) return range.end; |
| 892 | | while (start < end) { |
| 893 | | const mid = start + (end - start) / 2; |
| 894 | | if (!lessThan(value, items[mid])) { |
| 895 | | start = mid + 1; |
| 896 | | } else { |
| 897 | | end = mid; |
| 890 | while (size > 0) { |
| 891 | const offset = size % 2; |
| 892 | |
| 893 | size /= 2; |
| 894 | const mid = items[curr + size]; |
| 895 | if (!lessThan(value, mid)) { |
| 896 | curr += size + offset; |
| 898 | 897 | } |
| 899 | 898 | } |
| 900 | | if (start == range.end - 1 and !lessThan(value, items[start])) { |
| 901 | | start += 1; |
| 902 | | } |
| 903 | | return start; |
| 899 | return curr; |
| 904 | 900 | } |
| 905 | 901 | |
| 906 | 902 | fn mergeInto(comptime T: type, from: []T, A: Range, B: Range, lessThan: fn (T, T) bool, into: []T) void { |