|
- package cache
-
- type Ranger interface {
- GetPosition() int64
- GetLength() int64
- }
-
- // 查找第一个包含指定位置的段索引。如果所有段都不包含指定位置,那么有以下三种情况:
- //
- // 1. pos小于第一个段的位置,返回-1
- //
- // 2. pos大于等于最后一个段的结束位置,返回BuzyCount() - 1
- //
- // 3. pos在段之间的空洞内,那么会返回小于pos的最后一个段
- //
- // 注:2、3情况返回的结果是相同的
- func FirstContains[T Ranger](arr []T, pos int64) int {
- low, high := 0, len(arr)-1
-
- for low <= high {
- mid := (low + high) / 2
-
- if arr[mid].GetPosition() > pos {
- high = mid - 1
- } else if arr[mid].GetPosition() < pos {
- if mid == len(arr)-1 {
- return mid
- }
-
- low = mid
-
- } else {
- return mid
- }
- }
-
- return high
- }
|