Added lower/upperBound, templatizes comparison functions.

This commit is contained in:
Бранимир Караџић
2022-08-21 16:21:51 -07:00
parent 2a81637f99
commit a8545d7b5b
4 changed files with 429 additions and 48 deletions

View File

@@ -68,6 +68,54 @@ namespace bx
return true;
}
uint32_t lowerBound(const void* _key, const void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn)
{
uint32_t offset = 0;
const uint8_t* data = (uint8_t*)_data;
for (uint32_t ll = _num; offset < ll;)
{
const uint32_t idx = (offset + ll) / 2;
int32_t result = _fn(_key, &data[idx * _stride]);
if (result <= 0)
{
ll = idx;
}
else
{
offset = idx + 1;
}
}
return offset;
}
uint32_t upperBound(const void* _key, const void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn)
{
uint32_t offset = 0;
const uint8_t* data = (uint8_t*)_data;
for (uint32_t ll = _num; offset < ll;)
{
const uint32_t idx = (offset + ll) / 2;
int32_t result = _fn(_key, &data[idx * _stride]);
if (result < 0)
{
ll = idx;
}
else
{
offset = idx + 1;
}
}
return offset;
}
int32_t binarySearch(const void* _key, const void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn)
{
uint32_t offset = 0;