diff --git a/src/base/base_core.c b/src/base/base_core.c index b392e4a0..e5faadde 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -602,3 +602,37 @@ ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_s } return read_size; } + +//////////////////////////////// + +internal U64 +u64_array_bsearch(U64 *arr, U64 count, U64 value) +{ + if(count > 1 && arr[0] <= value && value < arr[count-1]) + { + U64 l = 0; + U64 r = count - 1; + for(; l <= r; ) + { + U64 m = l + (r - l) / 2; + if(arr[m] == value) + { + return m; + } + else if(arr[m] < value) + { + l = m + 1; + } + else + { + r = m - 1; + } + } + } + else if (count == 1 && arr[0] == value) + { + return 0; + } + return max_U64; +} + diff --git a/src/base/base_core.h b/src/base/base_core.h index 191e1e7f..9e2d686a 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -885,4 +885,8 @@ internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_dat #define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function)) +//////////////////////////////// + +internal U64 u64_array_bsearch(U64 *arr, U64 count, U64 value); + #endif // BASE_CORE_H diff --git a/src/base/base_math.c b/src/base/base_math.c index 2c6201f3..b0a85bfe 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -634,6 +634,37 @@ rng1u64_array_from_list(Arena *arena, Rng1U64List *list) return arr; } +internal U64 +rng_1u64_array_bsearch(Rng1U64Array arr, U64 value) +{ + if(arr.count > 0 && arr.v[0].min <= value && value < arr.v[arr.count-1].max) + { + U64 l = 0; + U64 r = arr.count - 1; + for(; l <= r; ) + { + U64 m = l + (r - l) / 2; + if(contains_1u64(arr.v[m], value)) + { + return m; + } + else if(arr.v[m].min < value) + { + l = m + 1; + } + else + { + r = m - 1; + } + } + } + else if(arr.count == 1 && contains_1u64(arr.v[0], value)) + { + return 0; + } + return max_U64; +} + internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng) { @@ -657,3 +688,4 @@ rng1s64_array_from_list(Arena *arena, Rng1S64List *list) } return arr; } + diff --git a/src/base/base_math.h b/src/base/base_math.h index b6063ad5..d13adbf4 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -668,6 +668,7 @@ internal U32 u32_from_rgba(Vec4F32 rgba); internal void rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng); internal void rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat); internal Rng1U64Array rng1u64_array_from_list(Arena *arena, Rng1U64List *list); +internal U64 rng_1u64_array_bsearch(Rng1U64Array arr, U64 value); internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list);