Browse Source

Improve slice.binary_search_by

Jeroen van Rijn 1 year ago
parent
commit
1242b6e82f
1 changed files with 19 additions and 3 deletions
  1. 19 3
      core/slice/slice.odin

+ 19 - 3
core/slice/slice.odin

@@ -160,8 +160,26 @@ binary_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool)
 	return binary_search_by(array, key, cmp_proc(T))
 	return binary_search_by(array, key, cmp_proc(T))
 }
 }
 
 
+/*
+	Binary search searches the given slice for the given element.
+	If the slice is not sorted, the returned index is unspecified and meaningless.
+
+	If the value is found then the returned int is the index of the matching element.
+	If there are multiple matches, then any one of the matches could be returned.
+
+	If the value is not found then the returned int is the index where a matching
+	element could be inserted while maintaining sorted order.
+
+	The array elements and key may be different types. This allows the filter procedure
+	to compare keys against a slice of structs, one struct value at a time.
+
+	Returns:
+	index: int
+	found: bool
+
+*/
 @(require_results)
 @(require_results)
-binary_search_by :: proc(array: $A/[]$T, key: T, f: proc(T, T) -> Ordering) -> (index: int, found: bool) #no_bounds_check {
+binary_search_by :: proc(array: $A/[]$T, key: $K, f: proc(T, K) -> Ordering) -> (index: int, found: bool) #no_bounds_check {
 	n := len(array)
 	n := len(array)
 	left, right := 0, n
 	left, right := 0, n
 	for left < right {
 	for left < right {
@@ -173,8 +191,6 @@ binary_search_by :: proc(array: $A/[]$T, key: T, f: proc(T, T) -> Ordering) -> (
 			right = mid
 			right = mid
 		}
 		}
 	}
 	}
-	// left == right
-	// f(array[left-1], key) == .Less (if left > 0)
 	return left, left < n && f(array[left], key) == .Equal
 	return left, left < n && f(array[left], key) == .Equal
 }
 }