28 enum class BinarySearchResult {
50 template<
typename Predicate,
typename Iterator>
51 struct BinarySearchNearestToZero {
55 BinarySearchResult operator()(Iterator c) {
56 auto next = std::next(c);
57 if (next == mRange.end()) {
58 return BinarySearchResult::MATCH;
61 auto v1 = mPredicate(c);
62 auto v2 = mPredicate(next);
64 if (v1 <= 0 && v2 > 0) {
66 return BinarySearchResult::RIGHT;
68 return BinarySearchResult::MATCH;
71 if (mRange.begin() == c) {
72 return BinarySearchResult::MATCH;
74 if (
auto v0 = mPredicate(std::prev(c)); v1 + v0 < 0) {
75 return BinarySearchResult::MATCH;
77 return BinarySearchResult::LEFT;
80 return BinarySearchResult::RIGHT;
130 template<
typename Iterator,
typename Predicate>
131 Iterator binary_search(Iterator begin, Iterator end, Predicate
predicate) {
132 static_assert(std::is_same_v<BinarySearchResult, decltype(predicate(std::declval<Iterator>()))>,
"predicate should return BinarySearchResult");
134 size_t rangeEnd = end - begin;
135 size_t rangeBegin = 0;
138 for (
size_t i; rangeBegin < rangeEnd; ) {
139 i = (rangeEnd - rangeBegin - 1) / 2 + rangeBegin;
142 case BinarySearchResult::MATCH:
145 case BinarySearchResult::RIGHT:
148 case BinarySearchResult::LEFT:
Definition concepts.h:125
Definition iterators.h:50