ladybird/AK/BinarySearch.h
William McPherson d7177212fd AK: Add a BinarySearch template implementation
binary_search takes a haystack, a size, a needle and a compare function.
The compare function should return negative if a < b, positive if a > b
and 0 if a == b. The "sane default" compare function is integral_compare
which implements this with subtraction a - b.
binary_search returns a pointer to a matching element, NOT necessarily
the FIRST matching element. It returns a nullptr if the element was not
found.

This patch includes tests for binary_search.
2019-12-02 15:30:45 +01:00

32 lines
672 B
C++

#pragma once
namespace AK {
template<typename T>
int integral_compare(const T& a, const T& b)
{
return a - b;
}
template<typename T, typename Compare>
T* binary_search(T* haystack, size_t haystack_size, const T& needle, Compare compare = integral_compare)
{
int low = 0;
int high = haystack_size - 1;
while (low <= high) {
int middle = (low + high) / 2;
int comparison = compare(needle, haystack[middle]);
if (comparison < 0)
high = middle - 1;
else if (comparison > 0)
low = middle + 1;
else
return &haystack[middle];
}
return nullptr;
}
}
using AK::binary_search;