diff --git a/BeefLibs/corlib/src/Array.bf b/BeefLibs/corlib/src/Array.bf index 25ff539d..d11fa7fe 100644 --- a/BeefLibs/corlib/src/Array.bf +++ b/BeefLibs/corlib/src/Array.bf @@ -92,6 +92,25 @@ namespace System return ~lo; } + public static int BinarySearchAlt(T* arr, int length, TAlt value, delegate int(T lhs, TAlt rhs) comp) + { + int lo = 0; + int hi = length - 1; + + while (lo <= hi) + { + int i = (lo + hi) / 2; + T midVal = arr[i]; + int c = comp(midVal, value); + if (c == 0) return i; + if (c < 0) + lo = i + 1; + else + hi = i - 1; + } + return ~lo; + } + public static int BinarySearch(T[] arr, T value, delegate int(T lhs, T rhs) comp) { return BinarySearch(&arr.[Friend]GetRef(0), arr.mLength, value, comp); diff --git a/BeefLibs/corlib/src/Collections/List.bf b/BeefLibs/corlib/src/Collections/List.bf index 67749415..2645f617 100644 --- a/BeefLibs/corlib/src/Collections/List.bf +++ b/BeefLibs/corlib/src/Collections/List.bf @@ -689,6 +689,11 @@ namespace System.Collections return Array.BinarySearch(mItems, Count, item, comparer); } + public int BinarySearchAlt(TAlt item, delegate int(T lhs, TAlt rhs) comparer) + { + return Array.BinarySearchAlt(mItems, Count, item, comparer); + } + public int BinarySearch(int index, int count, T item, delegate int(T lhs, T rhs) comparer) { Debug.Assert((uint)index <= (uint)mSize);