21 #ifndef RAJA_util_zip_ref_HPP
22 #define RAJA_util_zip_ref_HPP
24 #include "RAJA/config.hpp"
27 #include <type_traits>
36 template<
bool is_val,
typename... Ts>
39 template<camp::
idx_t I,
typename ZT>
42 template<camp::idx_t I,
bool is_val,
typename... Ts>
44 : camp::tuple_element<I, typename zip_tuple<is_val, Ts...>::value_type>
47 template<camp::
idx_t I,
typename ZT>
53 template<camp::idx_t I,
bool is_val,
typename... Ts>
55 zip_tuple_element_t<I,
zip_tuple<is_val, Ts...>>&
58 return z.template get<I>();
61 template<camp::idx_t I,
bool is_val,
typename... Ts>
63 zip_tuple_element_t<I, zip_tuple<is_val, Ts...>>
const&
66 return z.template get<I>();
69 template<camp::idx_t I,
bool is_val,
typename... Ts>
74 return std::move(
z).template get<I>();
77 template<camp::idx_t I,
bool is_val,
typename... Ts>
82 return std::move(
z).template get<I>();
92 -> decltype(std::forward<T>(t))
94 return std::forward<T>(t);
102 -> decltype(std::move(t))
110 template<
typename Iter>
112 -> decltype(++std::forward<Iter>(
iter))
114 return ++std::forward<Iter>(
iter);
120 template<
typename Iter>
122 -> decltype(--std::forward<Iter>(
iter))
124 return --std::forward<Iter>(
iter);
128 template<
typename difference_type>
131 const difference_type&
rhs;
133 template<
typename Iter>
135 -> decltype(std::forward<Iter>(
iter) +=
rhs)
137 return std::forward<Iter>(
iter) +=
rhs;
141 template<
typename difference_type>
144 const difference_type&
rhs;
146 template<
typename Iter>
148 -> decltype(std::forward<Iter>(
iter) -=
rhs)
150 return std::forward<Iter>(
iter) -=
rhs;
156 template<
typename Iter>
158 -> decltype(*std::forward<Iter>(
iter))
160 return *std::forward<Iter>(
iter);
166 template<
typename T0,
typename T1>
169 using camp::safe_swap;
170 safe_swap(std::forward<T0>(t0), std::forward<T1>(t1));
177 template<
typename T0,
typename T1>
189 template<
typename Tuple,
typename F, camp::idx_t... Is>
193 camp::idx_seq<Is...>)
195 camp::sink(std::forward<F>(f)(RAJA::get<Is>(std::forward<Tuple>(t)))...);
201 template<
typename Tuple0,
typename Tuple1,
typename F, camp::idx_t... Is>
206 camp::idx_seq<Is...>)
208 camp::sink(std::forward<F>(f)(RAJA::get<Is>(std::forward<Tuple0>(t0)),
209 RAJA::get<Is>(std::forward<Tuple1>(t1)))...);
215 template<
typename Tuple,
typename F>
219 typename camp::decay<Tuple>::IdxSeq {});
225 template<
typename Tuple0,
typename Tuple1,
typename F>
230 static_assert(std::is_same<
typename camp::decay<Tuple0>::IdxSeq,
231 typename camp::decay<Tuple1>::IdxSeq>::value,
232 "Tuple0 and Tuple1 must have the same size");
235 typename camp::decay<Tuple0>::IdxSeq {});
245 template<
bool is_val,
typename... Ts>
252 typename std::conditional<is_val,
253 typename std::add_lvalue_reference<T>::type,
254 typename std::remove_reference<T>::type>::type;
260 using IdxSeq = camp::make_idx_seq_t<
sizeof...(Ts)>;
265 typename = concepts::enable_if<type_traits::convertible_to<Os&&, Ts>...>>
267 : m_tuple(
std::forward<Os>(os)...)
271 template<
typename... Os,
272 typename = concepts::enable_if<type_traits::convertible_to<
274 typename std::remove_reference<Ts>::type>...>>
277 return assign_helper(
IdxSeq {}, std::forward<Os>(os)...);
296 return assign_helper(o,
IdxSeq {});
302 return assign_helper(o,
IdxSeq {});
307 return assign_helper(std::move(o),
IdxSeq {});
326 return assign_helper(o,
IdxSeq {});
332 return assign_helper(o,
IdxSeq {});
337 return assign_helper(std::move(o),
IdxSeq {});
343 template<camp::
idx_t I>
344 RAJA_HOST_DEVICE RAJA_INLINE constexpr RAJA::tuple_element_t<I, value_type>&
347 return RAJA::get<I>(m_tuple);
350 template<camp::
idx_t I>
352 tuple_element_t<I, value_type>
const&
355 return RAJA::get<I>(m_tuple);
358 template<camp::
idx_t I>
360 RAJA::tuple_element_t<I, value_type>>&&
363 return std::move(RAJA::get<I>(m_tuple));
366 template<camp::
idx_t I>
368 RAJA::tuple_element_t<I, value_type>>
const&&
371 return std::move(RAJA::get<I>(m_tuple));
392 return o << v.m_tuple;
398 using IsValMover =
typename std::
399 conditional<is_val, detail::Move, detail::PassThrough>::type;
404 template<
typename... Os, camp::idx_t... Is>
406 camp::idx_seq<Is...>,
409 camp::sink(get<Is>() = std::forward<Os>(os)...);
414 template<camp::idx_t... Is>
416 camp::idx_seq<Is...>)
420 template<camp::idx_t... Is>
422 camp::idx_seq<Is...>)
426 template<camp::idx_t... Is>
428 camp::idx_seq<Is...>)
433 template<camp::idx_t... Is>
436 camp::idx_seq<Is...>)
440 camp::sink(get<Is>() = RAJA::get<Is>(o)...);
445 template<camp::idx_t... Is>
448 camp::idx_seq<Is...>)
452 camp::sink(get<Is>() = RAJA::get<Is>(o)...);
457 template<camp::idx_t... Is>
460 camp::idx_seq<Is...>)
464 camp::sink(get<Is>() = RAJA::get<Is>(std::move(o))...);
470 template<camp::idx_t... Is>
472 camp::idx_seq<Is...>)
476 template<camp::idx_t... Is>
478 camp::idx_seq<Is...>)
482 template<camp::idx_t... Is>
484 camp::idx_seq<Is...>)
489 template<camp::idx_t... Is>
492 camp::idx_seq<Is...>)
494 camp::sink(get<Is>() = RAJA::get<Is>(o)...);
498 template<camp::idx_t... Is>
501 camp::idx_seq<Is...>)
503 camp::sink(get<Is>() = RAJA::get<Is>(o)...);
507 template<camp::idx_t... Is>
510 camp::idx_seq<Is...>)
512 camp::sink(get<Is>() = RAJA::get<Is>(std::move(o))...);
518 template<
typename... Ts>
522 template<
typename... Ts>
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
RAJA_HOST_DEVICE constexpr RAJA_INLINE void zip_for_each_impl(Tuple &&t, F &&f, camp::idx_seq< Is... >)
Call f on each member of t (f(t)...).
Definition: zip_tuple.hpp:190
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
value_type::device_call &[i_loop] iter
Definition: WorkRunner.hpp:216
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_HOST_DEVICE constexpr RAJA_INLINE RAJA::zip_tuple_element_t< I, zip_tuple< is_val, Ts... > > & get(zip_tuple< is_val, Ts... > &z) noexcept
Definition: zip_tuple.hpp:56
RAJA_HOST_DEVICE RAJA_INLINE void safe_iter_swap(Iter lhs, Iter rhs)
swap values at iterators lhs and rhs
Definition: algorithm.hpp:75
typename zip_tuple_element< I, ZT >::type zip_tuple_element_t
Definition: zip_tuple.hpp:48
Definition: ListSegment.hpp:416
Definition: zip_tuple.hpp:155
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(Iter &&iter) const -> decltype(*std::forward< Iter >(iter))
Definition: zip_tuple.hpp:157
Definition: zip_tuple.hpp:176
RAJA_HOST_DEVICE constexpr RAJA_INLINE int operator()(T0 &&t0, T1 &&t1) const
Definition: zip_tuple.hpp:178
Definition: zip_tuple.hpp:143
const difference_type & rhs
Definition: zip_tuple.hpp:144
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(Iter &&iter) const -> decltype(std::forward< Iter >(iter) -=rhs)
Definition: zip_tuple.hpp:147
Definition: zip_tuple.hpp:99
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(T &&t) const -> decltype(std::move(t))
Definition: zip_tuple.hpp:101
Definition: zip_tuple.hpp:89
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(T &&t) const -> decltype(std::forward< T >(t))
Definition: zip_tuple.hpp:91
Definition: zip_tuple.hpp:130
const difference_type & rhs
Definition: zip_tuple.hpp:131
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(Iter &&iter) const -> decltype(std::forward< Iter >(iter)+=rhs)
Definition: zip_tuple.hpp:134
Definition: zip_tuple.hpp:119
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(Iter &&iter) const -> decltype(--std::forward< Iter >(iter))
Definition: zip_tuple.hpp:121
Definition: zip_tuple.hpp:109
RAJA_HOST_DEVICE constexpr RAJA_INLINE auto operator()(Iter &&iter) const -> decltype(++std::forward< Iter >(iter))
Definition: zip_tuple.hpp:111
Definition: zip_tuple.hpp:165
RAJA_HOST_DEVICE constexpr RAJA_INLINE int operator()(T0 &&t0, T1 &&t1) const
Definition: zip_tuple.hpp:167
Definition: zip_tuple.hpp:40
Tuple used by ZipIterator for storing multiple references and values. Acts like a reference to its me...
Definition: zip_tuple.hpp:247
RAJA_HOST_DEVICE constexpr RAJA_INLINE std::remove_reference_t< RAJA::tuple_element_t< I, value_type > > const && get() const &&noexcept
Definition: zip_tuple.hpp:369
RAJA_HOST_DEVICE constexpr RAJA_INLINE RAJA::tuple_element_t< I, value_type > & get() &noexcept
Definition: zip_tuple.hpp:345
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & operator=(zip_tuple &o)
Definition: zip_tuple.hpp:294
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & operator=(opp_tuple &o)
Definition: zip_tuple.hpp:324
RAJA_HOST_DEVICE constexpr RAJA_INLINE std::remove_reference_t< RAJA::tuple_element_t< I, value_type > > && get() &&noexcept
Definition: zip_tuple.hpp:361
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & operator=(zip_tuple &&o)
Definition: zip_tuple.hpp:305
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(zip_tuple &&o)
Definition: zip_tuple.hpp:289
RAJA_HOST_DEVICE constexpr RAJA_INLINE friend void safe_swap(zip_tuple &lhs, opp_tuple &rhs)
Definition: zip_tuple.hpp:383
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & assign(Os &&... os)
Definition: zip_tuple.hpp:275
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & operator=(zip_tuple const &o)
Definition: zip_tuple.hpp:299
RAJA_HOST_DEVICE constexpr RAJA_INLINE RAJA::tuple_element_t< I, value_type > const & get() const &noexcept
Definition: zip_tuple.hpp:353
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(opp_tuple &o)
Definition: zip_tuple.hpp:311
zip_tuple<!is_val, opp_type< Ts >... > opp_tuple
Definition: zip_tuple.hpp:257
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(zip_tuple const &o)
Definition: zip_tuple.hpp:285
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(Os &&... os)
Definition: zip_tuple.hpp:266
camp::make_idx_seq_t< sizeof...(Ts)> IdxSeq
Definition: zip_tuple.hpp:260
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & operator=(opp_tuple &&o)
Definition: zip_tuple.hpp:335
typename std::conditional< is_val, typename std::add_lvalue_reference< T >::type, typename std::remove_reference< T >::type >::type opp_type
Definition: zip_tuple.hpp:254
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple & operator=(opp_tuple const &o)
Definition: zip_tuple.hpp:329
friend std::ostream & operator<<(std::ostream &o, zip_tuple const &v)
Definition: zip_tuple.hpp:390
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(zip_tuple &o)
Definition: zip_tuple.hpp:281
RAJA_HOST_DEVICE constexpr RAJA_INLINE friend void safe_swap(zip_tuple &lhs, zip_tuple &rhs)
Definition: zip_tuple.hpp:375
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(opp_tuple &&o)
Definition: zip_tuple.hpp:319
RAJA_HOST_DEVICE constexpr RAJA_INLINE zip_tuple(opp_tuple const &o)
Definition: zip_tuple.hpp:315
RAJA::tuple< Ts... > value_type
Definition: zip_tuple.hpp:248