ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
find_bound.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s).
12#include "detray/definitions/detail/qualifiers.hpp"
13#include "detray/utils/ranges.hpp"
14
15// System include(s).
16#include <iterator>
17
18namespace detray::detail {
19
23template <std::forward_iterator iterator_t, typename T>
24DETRAY_HOST_DEVICE constexpr iterator_t upper_bound(iterator_t first,
25 iterator_t last,
26 const T& value) {
27 using difference_t = std::iter_difference_t<iterator_t>;
28
29 difference_t len{detray::ranges::distance(first, last)};
30
31 // binary search
32 while (len > 0) {
33 difference_t half{len >> 1};
34 iterator_t middle{first};
35 detray::ranges::advance(middle, half);
36 if (value < *middle) {
37 len = half;
38 } else {
39 first = middle;
40 ++first;
41 len -= half + 1;
42 }
43 }
44 return first;
45}
46
50template <std::forward_iterator iterator_t, typename T>
51DETRAY_HOST_DEVICE constexpr iterator_t lower_bound(iterator_t first,
52 iterator_t last,
53 const T& value) {
54 using difference_t = std::iter_difference_t<iterator_t>;
55
56 difference_t len{detray::ranges::distance(first, last)};
57
58 // binary search
59 while (len > 0) {
60 difference_t half{len >> 1};
61 iterator_t middle{first};
62 detray::ranges::advance(middle, half);
63 if (*middle < value) {
64 first = middle;
65 ++first;
66 len -= half + 1;
67 } else {
68 len = half;
69 }
70 }
71 return first;
72}
73
74} // namespace detray::detail
@ first
Use the first track state to reach target surface.
Definition TrackHelpers.hpp:39