12#include "detray/definitions/detail/qualifiers.hpp"
13#include "detray/definitions/indexing.hpp"
14#include "detray/utils/concepts.hpp"
15#include "detray/utils/ranges/detail/iterator_functions.hpp"
16#include "detray/utils/ranges/ranges.hpp"
23namespace detray::ranges {
34template <std::incrementable incr_t>
39 using difference_type = std::ptrdiff_t;
40 using value_type = incr_t;
41 using pointer = incr_t *;
42 using reference = incr_t;
43 using iterator_category =
44 std::conditional_t<concepts::random_access_incrementable<incr_t> &&
45 std::totally_ordered<incr_t>,
46 detray::ranges::random_access_iterator_tag,
47 detray::ranges::bidirectional_iterator_tag>;
50 requires std::default_initializable<incr_t>
54 DETRAY_HOST_DEVICE
constexpr explicit iterator(incr_t i) : m_i{i} {}
59 constexpr auto operator++() -> iterator & {
64 DETRAY_HOST_DEVICE
constexpr auto operator++(
int) -> iterator {
70 constexpr auto operator--() -> iterator & {
75 DETRAY_HOST_DEVICE
constexpr auto operator--(
int) -> iterator {
81 DETRAY_HOST_DEVICE
constexpr iterator &operator+=(
const difference_type n)
84 difference_type nv =
static_cast<difference_type
>(m_i) + n;
87 assert(
static_cast<difference_type
>(
static_cast<incr_t
>(nv)) == nv);
88 m_i =
static_cast<incr_t
>(nv);
92 DETRAY_HOST_DEVICE
friend constexpr iterator
operator+(
93 const iterator &i,
const difference_type n)
96 return iterator(i.m_i + n);
99 DETRAY_HOST_DEVICE
friend constexpr iterator
operator+(
100 const difference_type n,
const iterator &i)
103 return iterator(i.m_i + n);
106 DETRAY_HOST_DEVICE
constexpr iterator &operator-=(
const difference_type n)
113 DETRAY_HOST_DEVICE
friend constexpr iterator
operator-(
114 const iterator &i,
const difference_type n)
117 return iterator(i.m_i - n);
120 DETRAY_HOST_DEVICE
friend constexpr difference_type
operator-(
121 const iterator &i,
const iterator &j)
124 return i.m_i - j.m_i;
131 noexcept(std::is_nothrow_copy_constructible_v<incr_t>) -> incr_t {
136 constexpr incr_t
operator[](
const difference_type n)
const
139 return static_cast<incr_t
>(m_i + n);
144 friend constexpr auto operator<=>(
const iterator &lhs,
const iterator &rhs)
145 requires std::totally_ordered<incr_t>
163 requires std::default_initializable<incr_t>
168 template <
concepts::interval interval_t>
169 requires(!std::same_as<interval_t,
iota_view>)
170 DETRAY_HOST_DEVICE constexpr explicit
iota_view(interval_t &&interval)
171 : m_start{detray::detail::get<0>(interval)},
172 m_end{detray::detail::get<1>(interval)} {
173 assert(m_start <= m_end);
180 : m_start{start}, m_end{
end} {
181 assert(m_start <= m_end);
188 : m_start{start}, m_end{start + 1} {
189 assert(m_start <= m_end);
202 constexpr auto size() const -> incr_t {
return m_end - m_start; }
210template <std::incrementable incr_t>
216 requires std::default_initializable<incr_t>
221 template <
concepts::interval interval_t>
222 requires(!std::same_as<interval_t, iota>)
223 DETRAY_HOST_DEVICE constexpr explicit iota(interval_t &&interval)
224 :
base_type(std::forward<interval_t>(interval)) {}
229 DETRAY_HOST_DEVICE
constexpr iota(incr_t start, incr_t
end)
234 DETRAY_HOST_DEVICE
constexpr explicit iota(incr_t start) :
base_type(start) {}
238template <concepts::
interval
interval_t>
239DETRAY_HOST_DEVICE_DEDUCTION_GUIDE iota(interval_t &&interval)
240 -> iota<std::remove_cvref_t<decltype(detray::detail::get<0>(interval))>>;
242template <concepts::index I>
243DETRAY_HOST_DEVICE_DEDUCTION_GUIDE iota(I start, I end) -> iota<I>;
245template <concepts::index I>
246DETRAY_HOST_DEVICE_DEDUCTION_GUIDE iota(I start) -> iota<I>;
Range factory that produces a sequence of values.
Definition iota.hpp:35
constexpr iota_view()=default
Default constructor (only works if imrementable_t is default constructible).
constexpr auto end() const -> iterator_t
Definition iota.hpp:198
constexpr auto begin() const -> iterator_t
Definition iota.hpp:194
constexpr iota_view(incr_t start)
Construct from just a start value to represent a single value seq.
Definition iota.hpp:187
constexpr iota_view(incr_t start, incr_t end)
Construct from a start start and end value.
Definition iota.hpp:179
constexpr auto size() const -> incr_t
Definition iota.hpp:202
iterator iterator_t
Iterator over generated values in the requested sequence.
Definition iota.hpp:158
Defines a detray 'view'.
Definition ranges.hpp:190
constexpr decltype(auto) operator[](const dindex i) const
Definition ranges.hpp:292
Concept that checks whether a type can be incremented with arbitrary integer values.
Definition concepts.hpp:52
Type list concepts.
Definition concepts.hpp:17
constexpr array_t< scalar1_t, 2 > operator*(const array_t< scalar1_t, 2 > &a, scalar2_t s)
Multiply an array-backed vector by a scalar.
Definition array_operators.hpp:26
constexpr array_t< scalar_t, 2 > operator+(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Add array-backed vectors component-wise.
Definition array_operators.hpp:47
constexpr array_t< scalar_t, 2 > operator-(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Subtract array-backed vectors component-wise.
Definition array_operators.hpp:40
constexpr iota(incr_t start)
Construct the adaptor for a one-value sequence.
Definition iota.hpp:234
constexpr iota(incr_t start, incr_t end)
Construct the adaptor from a start and one-past-the-end value.
Definition iota.hpp:229
detray::ranges::iota_view< incr_t > base_type
Base sequence view implementation.
Definition iota.hpp:213