12#include "detray/definitions/containers.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
14#include "detray/utils/ranges/ranges.hpp"
15#include "detray/utils/type_traits.hpp"
20namespace detray::ranges {
24template <detray::ranges::range T>
25 requires std::input_iterator<detray::detail::get_value_t<T>>
44template <std::
size_t I, std::input_iterator range_itr_t>
53 using value_t = std::iter_value_t<iterator_t>;
62 requires((
sizeof...(ranges_t) > 1) ||
63 ((!std::same_as<static_join_view, ranges_t>) && ...))
65 :
m_begins{detray::ranges::begin(std::forward<ranges_t>(ranges))...},
66 m_ends{detray::ranges::end(std::forward<ranges_t>(ranges))...} {}
73 const ranges_t &...ranges)
92 return &(*(detray::detail::get<0>(
m_begins())));
99 return &(*(detray::detail::get<0>(
m_begins())));
104 constexpr auto size() const noexcept -> std::
size_t {
106 for (std::size_t i{0}; i < I; ++i) {
109 size +=
static_cast<std::size_t
>(detray::ranges::distance(
begin,
end));
122template <std::
size_t I, std::input_iterator range_itr_t>
127 constexpr static_join() =
default;
133 requires((
sizeof...(ranges_t) > 1) ||
134 ((!std::same_as<static_join, ranges_t>) && ...))
135 DETRAY_HOST_DEVICE constexpr explicit static_join(ranges_t &&...ranges)
136 :
base_type(std::forward<ranges_t>(ranges)...) {}
141DETRAY_HOST_DEVICE_DEDUCTION_GUIDE static_join(ranges_t &&...ranges)
142 -> static_join<
sizeof...(ranges_t),
143 typename detray::ranges::iterator_t<detray::detail::first_t<
144 std::remove_reference_t<ranges_t>...>>>;
160template <detray::ranges::range iterator_coll_t>
161 requires std::input_iterator<detray::detail::get_value_t<iterator_coll_t>>
164 using iterator_t = detray::detail::get_value_t<iterator_coll_t>;
171 using pointer =
typename std::iterator_traits<iterator_t>::pointer;
176 typename std::iterator_traits<iterator_t>::iterator_category;
186 const iterator_coll_t &ends)
187 : m_begins(&begins), m_ends(&ends), m_iter{(*m_begins)[0]} {}
196 const iterator_coll_t &ends,
198 : m_begins(&begins), m_ends(&ends), m_iter{current}, m_idx{i} {}
206 if (
constexpr std::size_t max_idx{
207 sizeof(iterator_coll_t) /
sizeof(
iterator_t) - 1u};
208 (m_iter == (*m_ends)[m_idx]) && (m_idx < max_idx)) {
210 m_iter = (*m_begins)[m_idx];
228 requires std::bidirectional_iterator<iterator_t>
230 if (m_iter != (*m_begins)[m_idx]) {
233 }
else if (m_idx > 0u) {
237 m_iter = detray::ranges::prev((*m_ends)[m_idx]);
246 requires std::bidirectional_iterator<iterator_t>
255 constexpr auto operator*() const -> decltype(auto) {
return *m_iter; }
262 requires std::random_access_iterator<iterator_t>
282 requires std::random_access_iterator<iterator_t>
291 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator[](
293 requires std::random_access_iterator<iterator_t>
296 return *(*
this + offset);
303 return (lhs.m_iter == rhs.m_iter);
309 requires std::random_access_iterator<iterator_t>
311#if defined(__apple_build_version__)
312 const auto l{lhs.m_iter};
313 const auto r{rhs.m_iter};
314 if (l < r || (l == r && l < r)) {
315 return std::strong_ordering::less;
317 if (l > r || (l == r && l > r)) {
318 return std::strong_ordering::greater;
320 return std::strong_ordering::equivalent;
322 return (lhs.m_iter <=> rhs.m_iter);
330 requires std::random_access_iterator<iterator_t>
350 requires std::random_access_iterator<iterator_t>
359 requires std::random_access_iterator<iterator_t>
368 requires std::random_access_iterator<iterator_t>
373 if (l.m_idx == r.m_idx) {
374 return l.m_iter - r.m_iter;
376 if (l.m_idx < r.m_idx) {
379 for (std::size_t i{l.m_idx + 1u}; i < r.m_idx; ++i) {
380 diff += (*l.m_begins)[i] - (*l.m_ends)[i];
382 diff += (*r.m_begins)[l.m_idx] - r.m_iter;
387 for (std::size_t i{l.m_idx - 1u}; i > r.m_idx; --i) {
388 diff += (*l.m_ends)[i] - (*l.m_begins)[i];
390 diff += (*r.m_ends)[r.m_idx] - r.m_iter;
396 const iterator_coll_t *m_begins{
nullptr};
397 const iterator_coll_t *m_ends{
nullptr};
401 std::size_t m_idx{0};
Defines a detray 'view'.
Definition ranges.hpp:190
Range concept.
Definition ranges.hpp:97
Detray include(s).
Definition array_operators.hpp:18
std::array< value_t, kDIM > darray
Fixed-size array container.
Definition containers.hpp:30
Sequentially iterate through multiple ranges of the same type.
Definition static_join.hpp:162
constexpr static_join_iterator(const iterator_coll_t &begins, const iterator_coll_t &ends, iterator_t current, const std::size_t i)
Fully parametrized construction.
Definition static_join.hpp:195
constexpr auto operator-=(const difference_type j) -> static_join_iterator &
Retreat the joined iterator by j elements.
Definition static_join.hpp:280
constexpr auto operator+=(const difference_type j) -> static_join_iterator &
Advance the joined iterator by j elements.
Definition static_join.hpp:260
friend constexpr bool operator==(const static_join_iterator &lhs, const static_join_iterator &rhs)
Definition static_join.hpp:301
friend constexpr auto operator<=>(const static_join_iterator &lhs, const static_join_iterator &rhs)
Definition static_join.hpp:307
constexpr auto operator++() -> static_join_iterator &
Increment current iterator and check for switch between ranges.
Definition static_join.hpp:203
constexpr auto operator--(int) -> static_join_iterator
Retreat and return the iterator's previous position.
Definition static_join.hpp:245
typename std::iterator_traits< iterator_t >::pointer pointer
Pointer type associated with the underlying iterator.
Definition static_join.hpp:171
typename std::iterator_traits< iterator_t >::iterator_category iterator_category
Iterator category supported by the underlying iterators.
Definition static_join.hpp:175
constexpr auto operator--() -> static_join_iterator &
Decrement current iterator and check for switch between ranges.
Definition static_join.hpp:227
friend constexpr auto operator+(const difference_type j, const static_join_iterator &itr) -> static_join_iterator
Definition static_join.hpp:347
constexpr auto operator*() const -> decltype(auto)
Definition static_join.hpp:255
friend constexpr auto operator+(const static_join_iterator &itr, const difference_type j) -> static_join_iterator
Definition static_join.hpp:327
detray::detail::get_value_t< iterator_coll_t > iterator_t
Iterator type used within each input range.
Definition static_join.hpp:164
friend constexpr auto operator-(const static_join_iterator &lhs, const static_join_iterator &rhs) -> difference_type
Definition static_join.hpp:365
std::iter_difference_t< iterator_t > difference_type
Distance type of the underlying iterators.
Definition static_join.hpp:167
friend constexpr auto operator-(const static_join_iterator &itr, const difference_type j) -> static_join_iterator
Definition static_join.hpp:356
constexpr static_join_iterator()=default
Default constructor required by LegacyIterator trait.
constexpr auto operator++(int) -> static_join_iterator
Advance and return the iterator's previous position.
Definition static_join.hpp:217
std::iter_reference_t< iterator_t > reference
Reference type associated with the underlying iterator.
Definition static_join.hpp:173
std::iter_value_t< iterator_t > value_type
Element type yielded by dereferencing this iterator.
Definition static_join.hpp:169
constexpr static_join_iterator(const iterator_coll_t &begins, const iterator_coll_t &ends)
Construct from a collection of begins and ends positions.
Definition static_join.hpp:185
Range adaptor that joins different ranges of the same type (static).
Definition static_join.hpp:46
std::iter_value_t< iterator_t > value_t
Element type yielded by the joined view.
Definition static_join.hpp:53
constexpr auto begin() const -> iterator_t
Definition static_join.hpp:79
detray::ranges::detail::static_join_iterator< iterator_coll_t > iterator_t
Iterator that advances across the input ranges in order.
Definition static_join.hpp:50
constexpr auto data() -> value_t *
Definition static_join.hpp:98
constexpr static_join_view()=default
Default constructor.
darray< range_itr_t, I > iterator_coll_t
Begin/end iterator array for the fixed set of input ranges.
Definition static_join.hpp:48
constexpr static_join_view(const ranges_t &...ranges)
Construct from a pack of ranges - const.
Definition static_join.hpp:72
constexpr auto size() const noexcept -> std::size_t
Definition static_join.hpp:104
constexpr auto end() const -> iterator_t
Definition static_join.hpp:83
constexpr auto data() const -> const value_t *
Definition static_join.hpp:91
iterator_coll_t m_begins
Start and end position of the subranges.
Definition static_join.hpp:115
iterator_coll_t m_ends
End iterators of the input ranges.
Definition static_join.hpp:116
ranges::static_join_view< I, range_itr_t > base_type
Base implementation joining the fixed set of ranges.
Definition static_join.hpp:125