11namespace zrythm::utils::algorithms
14template <
typename Range,
typename T>
16find_closest (
const Range &range,
const T &target)
18 return std::ranges::min_element (range, [&] (
const auto &a,
const auto &b) {
19 return std::abs (a - target) < std::abs (b - target);
32template <std::totally_ordered T>
33std::optional<std::reference_wrapper<const T>>
36 std::span<const T> elements,
37 bool return_prev =
false,
38 bool include_equal =
true)
41 if (elements.empty ())
46 size_t last = elements.size () - 1;
51 size_t middle = first + (last - first) / 2;
52 const T &pivot = elements[middle];
58 return std::make_optional (std::ref (pivot));
62 ? std::make_optional (std::ref (elements[middle - 1]))
64 return middle < elements.size () - 1
65 ? std::make_optional (std::ref (elements[middle + 1]))
73 if (middle == elements.size () - 1)
74 return return_prev ? std::make_optional (std::ref (pivot)) : std::nullopt;
76 if (elements[middle + 1] > key)
78 ? std::make_optional (std::ref (pivot))
79 : std::make_optional (std::ref (elements[middle + 1]));
88 : std::make_optional (std::ref (pivot));
94 return return_prev && last < elements.size ()
95 ? std::make_optional (std::ref (elements[last]))