Blender V5.0
BLI_binary_search.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include <algorithm>
12
14
20template<typename Iterator, typename Predicate>
21static int64_t first_if(Iterator begin, Iterator end, Predicate &&predicate)
22{
23 return std::lower_bound(begin,
24 end,
25 nullptr,
26 [&](const auto &value, void * /*dummy*/) { return !predicate(value); }) -
27 begin;
28}
29
34template<typename Iterator, typename Predicate>
35static int64_t last_if(Iterator begin, Iterator end, Predicate &&predicate)
36{
37 return std::upper_bound(begin,
38 end,
39 nullptr,
40 [&](void * /*dummy*/, const auto &value) { return !predicate(value); }) -
41 begin - 1;
42}
43
44template<typename Range, typename Predicate>
45int64_t first_if(const Range &range, Predicate &&predicate)
46{
47 return first_if(range.begin(), range.end(), predicate);
48}
49
50template<typename Range, typename Predicate>
51int64_t last_if(const Range &range, Predicate &&predicate)
52{
53 return last_if(range.begin(), range.end(), predicate);
54}
55
56} // namespace blender::binary_search
iter begin(iter)
long long int int64_t
static int64_t first_if(Iterator begin, Iterator end, Predicate &&predicate)
static int64_t last_if(Iterator begin, Iterator end, Predicate &&predicate)