ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
subrange.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/definitions/indexing.hpp"
14#include "detray/utils/concepts.hpp"
15#include "detray/utils/ranges/empty.hpp"
16#include "detray/utils/ranges/ranges.hpp"
17
18// System include(s)
19#include <type_traits>
20
21namespace detray::ranges {
22
23namespace detail {
30template <detray::ranges::range range_t>
32 : public detray::ranges::view_interface<subrange_view<range_t>> {
33 public:
35 using iterator_t = typename detray::ranges::iterator_t<range_t>;
37 using const_iterator_t = typename detray::ranges::const_iterator_t<range_t>;
39 using difference_t = typename detray::ranges::range_difference_t<range_t>;
40
42 constexpr subrange_view() = default;
43
47 DETRAY_HOST_DEVICE constexpr subrange_view(iterator_t start, iterator_t end)
48 : m_begin{start}, m_end{end} {}
49
52 DETRAY_HOST_DEVICE
53 constexpr auto begin() -> iterator_t { return m_begin; }
54
57 DETRAY_HOST_DEVICE
58 constexpr auto end() -> iterator_t { return m_end; }
59
62 DETRAY_HOST_DEVICE
63 constexpr auto begin() const -> const_iterator_t { return m_begin; }
64
67 DETRAY_HOST_DEVICE
68 constexpr auto end() const -> const_iterator_t { return m_end; }
69
75 DETRAY_HOST_DEVICE
76 constexpr auto operator==(const subrange_view &rhs) const -> bool {
77 return m_begin == rhs.m_begin && m_end == rhs.m_end;
78 }
79
80 private:
82 iterator_t m_begin;
83 iterator_t m_end;
84};
85
86} // namespace detail
87
89template <detray::ranges::range range_t, typename index_range_t = dindex_range>
90struct subrange : public detail::subrange_view<range_t> {
93
95 using iterator_t = typename detray::ranges::iterator_t<range_t>;
97 using difference_t = typename detray::ranges::range_difference_t<range_t>;
98
100 constexpr subrange() = default;
101
105 template <concepts::index index_t>
106 DETRAY_HOST_DEVICE constexpr subrange(index_t start, index_t end)
107 : m_pos{start, end} {}
108
112 DETRAY_HOST_DEVICE constexpr subrange(iterator_t start, iterator_t end)
113 : base_type{start, end} {}
114
117 template <detray::ranges::range deduced_range_t>
118 requires(!std::same_as<subrange, deduced_range_t>)
119 DETRAY_HOST_DEVICE constexpr explicit subrange(deduced_range_t &&range)
120 : base_type{detray::ranges::begin(range), detray::ranges::end(range)} {}
121
126 template <detray::ranges::range deduced_range_t, concepts::index index_t>
127 requires std::is_convertible_v<
128 index_t, detray::ranges::range_difference_t<deduced_range_t>>
129 DETRAY_HOST_DEVICE constexpr subrange(deduced_range_t &&range, index_t pos)
130 : base_type{detray::ranges::next(detray::ranges::begin(range),
131 static_cast<difference_t>(pos)),
132 detray::ranges::next(
133 detray::ranges::begin(range),
134 static_cast<difference_t>(pos) + difference_t{1})} {}
135
139 template <detray::ranges::range deduced_range_t,
140 concepts::interval deduced_index_range_t>
141 DETRAY_HOST_DEVICE constexpr subrange(deduced_range_t &&range,
142 const deduced_index_range_t &pos)
143 : base_type{get_itr<0>(range, pos), get_itr<1>(range, pos)} {}
144
148 template <detray::ranges::range deduced_range_t>
149 DETRAY_HOST_DEVICE constexpr auto operator()(deduced_range_t &&range) {
150 return detail::subrange_view<deduced_range_t>{get_itr<0>(range, m_pos),
151 get_itr<1>(range, m_pos)};
152 }
153
154 private:
160 template <std::size_t I, detray::ranges::range deduced_range_t,
161 concepts::interval deduced_index_range_t>
162 DETRAY_HOST_DEVICE constexpr auto get_itr(deduced_range_t &&range,
163 const deduced_index_range_t &pos) {
164 return detray::ranges::next(
165 detray::ranges::begin(std::forward<deduced_range_t>(range)),
166 static_cast<difference_t>(detray::detail::get<I>(pos)));
167 }
168
170 index_range_t m_pos{};
171};
172
173// deduction guides
174DETRAY_HOST_DEVICE_DEDUCTION_GUIDE subrange()
176
177template <concepts::index index_t>
178DETRAY_HOST_DEVICE_DEDUCTION_GUIDE subrange(index_t start, index_t end)
180
181template <detray::ranges::range deduced_range_t>
182DETRAY_HOST_DEVICE_DEDUCTION_GUIDE subrange(deduced_range_t &&range)
184
185template <detray::ranges::range deduced_range_t, concepts::index index_t>
186 requires std::convertible_to<
187 index_t, detray::ranges::range_difference_t<deduced_range_t>>
188DETRAY_HOST_DEVICE_DEDUCTION_GUIDE subrange(deduced_range_t &&range,
189 index_t pos)
191
192template <detray::ranges::range deduced_range_t,
193 concepts::interval index_range_t>
194DETRAY_HOST_DEVICE_DEDUCTION_GUIDE subrange(deduced_range_t &&range,
195 index_range_t &&pos)
197 std::remove_cvref_t<index_range_t>>;
198
200template <detray::ranges::range R, concepts::interval I>
201using borrowed_subrange_t =
202 std::conditional_t<borrowed_range<R>, detray::ranges::subrange<R, I>,
203 dangling>;
204
205} // namespace detray::ranges
Implements a subrange by providing start and end iterators on another range.
Definition subrange.hpp:32
typename detray::ranges::iterator_t< range_t > iterator_t
Iterator type used to delimit the range.
Definition subrange.hpp:35
constexpr auto operator==(const subrange_view &rhs) const -> bool
Equality operator.
Definition subrange.hpp:76
typename detray::ranges::range_difference_t< range_t > difference_t
Difference type used for range positions.
Definition subrange.hpp:39
constexpr auto begin() -> iterator_t
Return the first iterator.
Definition subrange.hpp:53
typename detray::ranges::const_iterator_t< range_t > const_iterator_t
Iterator type used when accessing a const view.
Definition subrange.hpp:37
constexpr auto end() const -> const_iterator_t
Return the end iterator of a const view.
Definition subrange.hpp:68
constexpr auto end() -> iterator_t
Return the end iterator.
Definition subrange.hpp:58
constexpr subrange_view(iterator_t start, iterator_t end)
Construct from an start and end iterator pair.
Definition subrange.hpp:47
constexpr auto begin() const -> const_iterator_t
Return the first iterator of a const view.
Definition subrange.hpp:63
constexpr subrange_view()=default
Default constructor.
Defines a detray 'view'.
Definition ranges.hpp:190
Concept that checks if a type models an interval of some value that can be obtained with 'get'.
Definition concepts.hpp:41
Range concept.
Definition ranges.hpp:97
Detray include(s).
Definition array_operators.hpp:18
detail::index_range< dindex > dindex_range
Index ranges and sequences.
Definition indexing.hpp:24
std::array< value_t, kDIM > darray
Fixed-size array container.
Definition containers.hpp:30
models a dangling iterator
Definition ranges.hpp:158
interface type to construct a subrange_view with CTAD
Definition subrange.hpp:90
constexpr subrange(deduced_range_t &&range, const deduced_index_range_t &pos)
Construct from a range and an index range pos.
Definition subrange.hpp:141
typename detray::ranges::iterator_t< range_t > iterator_t
Definition subrange.hpp:95
constexpr subrange(iterator_t start, iterator_t end)
Construct from an start and end iterator pair.
Definition subrange.hpp:112
typename detray::ranges::range_difference_t< range_t > difference_t
Definition subrange.hpp:97
constexpr subrange()=default
Default constructor.
constexpr auto operator()(deduced_range_t &&range)
Call operator for range composition.
Definition subrange.hpp:149
detray::ranges::detail::subrange_view< range_t > base_type
Definition subrange.hpp:92
constexpr subrange(index_t start, index_t end)
Construct from two indices, storing them for later range composition.
Definition subrange.hpp:106
constexpr subrange(deduced_range_t &&range)
Construct from a range.
Definition subrange.hpp:119
constexpr subrange(deduced_range_t &&range, index_t pos)
Construct from a range and starting position pos.
Definition subrange.hpp:129