21 #ifndef RAJA_util_zip_HPP
22 #define RAJA_util_zip_HPP
24 #include "RAJA/config.hpp"
27 #include <type_traits>
42 template<
typename... Iters>
46 concepts::all_of<type_traits::is_random_access_iterator<Iters>...>::value,
47 "ZipIterator can only contain random access iterators");
48 static_assert(
sizeof...(Iters) > 1,
49 "ZipIterator must contain one or more iterators");
62 template<
typename... Args,
63 typename = concepts::enable_if<
64 type_traits::convertible_to<Args&&, Iters>...>>
66 : m_iterators(
std::forward<Args>(
args)...)
70 : m_iterators(rhs.m_iterators)
74 : m_iterators(
std::move(rhs.m_iterators))
80 m_iterators = rhs.m_iterators;
87 m_iterators = std::move(rhs.m_iterators);
99 return RAJA::get<0>(m_iterators) == RAJA::get<0>(rhs.m_iterators);
105 return RAJA::get<0>(m_iterators) != RAJA::get<0>(rhs.m_iterators);
111 return RAJA::get<0>(m_iterators) > RAJA::get<0>(rhs.m_iterators);
117 return RAJA::get<0>(m_iterators) < RAJA::get<0>(rhs.m_iterators);
123 return RAJA::get<0>(m_iterators) >= RAJA::get<0>(rhs.m_iterators);
129 return RAJA::get<0>(m_iterators) <= RAJA::get<0>(rhs.m_iterators);
175 return RAJA::get<0>(m_iterators) - RAJA::get<0>(rhs.m_iterators);
205 return deref_helper(camp::make_idx_seq_t<
sizeof...(Iters)> {});
216 return *((*this) + rhs);
229 template<camp::idx_t... Is>
231 camp::idx_seq<Is...>)
const
233 return reference(*RAJA::get<Is>(m_iterators)...);
241 template<
typename... Args>
245 return {std::forward<Args>(
args)...};
252 template<
typename... Args>
262 camp::decay<Args>>...>::difference_type>(
263 zip(begin(std::forward<Args>(
args))...),
264 zip(end(std::forward<Args>(
args))...));
271 template<
typename T,
typename Compare>
281 return comp(RAJA::get<0>(lhs), RAJA::get<0>(rhs));
292 template<
typename T,
typename Compare>
Header file for RAJA span constructs.
Header file for RAJA algorithm definitions.
Header file with aliases to camp types.
Header file for RAJA concept definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
camp::iterator_from< Container > ContainerIter
Definition: algorithm.hpp:47
Args args
Definition: WorkRunner.hpp:212
RAJA_HOST_DEVICE constexpr RAJA_INLINE void zip_for_each(Tuple &&t, F &&f)
Call f on each member of t (f(t)...).
Definition: zip_tuple.hpp:216
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto compare_first(Compare comp) -> CompareFirst< T, Compare >
Make a comparator to compare first member of tuple like objects of type T.
Definition: zip.hpp:293
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto zip_span(Args &&... args) -> Span< ZipIterator< detail::ContainerIter< camp::decay< Args >>... >, typename ZipIterator< detail::ContainerIter< camp::decay< Args >>... >::difference_type >
Zip multiple containers together to iterate them simultaneously with ZipIterator objects.
Definition: zip.hpp:253
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto zip(Args &&... args) -> ZipIterator< camp::decay< Args >... >
Zip multiple iterators together to iterate them simultaneously with a single ZipIterator object.
Definition: zip.hpp:242
Definition: ListSegment.hpp:416
Comparator object that compares the first member of tuple like objects.
Definition: zip.hpp:273
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator()(T const &lhs, T const &rhs) const
Definition: zip.hpp:278
RAJA_HOST_DEVICE constexpr RAJA_INLINE CompareFirst(Compare comp_)
Definition: zip.hpp:274
A view to a sequence of objects.
Definition: Span.hpp:62
ZipIterator class for simultaneously iterating over multiple iterators. This is not a standards compl...
Definition: zip.hpp:44
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator & operator=(ZipIterator &&rhs)
Definition: zip.hpp:84
std::random_access_iterator_tag iterator_category
Definition: zip.hpp:58
RAJA_HOST_DEVICE constexpr RAJA_INLINE reference operator*() const
Definition: zip.hpp:203
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator & operator+=(const difference_type &rhs)
Definition: zip.hpp:158
std::ptrdiff_t difference_type
Definition: zip.hpp:53
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator operator-(const difference_type &rhs) const
Definition: zip.hpp:186
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator>=(const ZipIterator &rhs) const
Definition: zip.hpp:120
RAJA_HOST_DEVICE constexpr RAJA_INLINE friend void safe_iter_swap(ZipIterator lhs, ZipIterator rhs)
Definition: zip.hpp:219
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator(ZipIterator &&rhs)
Definition: zip.hpp:73
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator()
Definition: zip.hpp:60
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator operator++(int)
Definition: zip.hpp:144
zip_ref< typename std::iterator_traits< Iters >::reference... > reference
Definition: zip.hpp:55
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator!=(const ZipIterator &rhs) const
Definition: zip.hpp:102
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator<(const ZipIterator &rhs) const
Definition: zip.hpp:114
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator & operator++()
Definition: zip.hpp:132
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator<=(const ZipIterator &rhs) const
Definition: zip.hpp:126
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator & operator-=(const difference_type &rhs)
Definition: zip.hpp:165
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator & operator=(const ZipIterator &rhs)
Definition: zip.hpp:77
RAJA_HOST_DEVICE constexpr RAJA_INLINE friend ZipIterator operator+(difference_type lhs, const ZipIterator &rhs)
Definition: zip.hpp:194
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator(Args &&... args)
Definition: zip.hpp:65
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator(const ZipIterator &rhs)
Definition: zip.hpp:69
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator operator--(int)
Definition: zip.hpp:151
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator & operator--()
Definition: zip.hpp:138
RAJA_HOST_DEVICE constexpr RAJA_INLINE difference_type get_stride() const
Definition: zip.hpp:91
RAJA_HOST_DEVICE constexpr RAJA_INLINE reference operator[](difference_type rhs) const
Definition: zip.hpp:213
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator==(const ZipIterator &rhs) const
Definition: zip.hpp:96
RAJA_HOST_DEVICE constexpr RAJA_INLINE difference_type operator-(const ZipIterator &rhs) const
Definition: zip.hpp:172
void pointer
Definition: zip.hpp:54
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool operator>(const ZipIterator &rhs) const
Definition: zip.hpp:108
RAJA_HOST_DEVICE constexpr RAJA_INLINE ZipIterator operator+(const difference_type &rhs) const
Definition: zip.hpp:178
Definition: zip_tuple.hpp:176
Definition: zip_tuple.hpp:143
Definition: zip_tuple.hpp:130
Definition: zip_tuple.hpp:119
Definition: zip_tuple.hpp:109
Tuple used by ZipIterator for storing multiple references and values. Acts like a reference to its me...
Definition: zip_tuple.hpp:247
Header file for multi-iterator Zip Views.