52#ifndef AMESOS2_KOKKOS_VIEW_COPY_ASSIGN_HPP
53#define AMESOS2_KOKKOS_VIEW_COPY_ASSIGN_HPP
58template<
class dst_t,
class src_t>
59typename std::enable_if<static_cast<int>(dst_t::Rank) == 1>::type
60update_dst_size(dst_t & dst,
const src_t & src) {
61 if(dst.extent(0) != src.extent(0)) {
62 dst = dst_t(Kokkos::ViewAllocateWithoutInitializing(
"dst"),
67template<
class dst_t,
class src_t>
68typename std::enable_if<static_cast<int>(dst_t::Rank) == 2>::type
69update_dst_size(dst_t & dst,
const src_t & src) {
70 if(dst.extent(0) != src.extent(0) || dst.extent(1) != src.extent(1)) {
71 dst = dst_t(Kokkos::ViewAllocateWithoutInitializing(
"dst"),
72 src.extent(0), src.extent(1));
83template<
class dst_t,
class src_t>
84typename std::enable_if<std::is_same<
typename dst_t::value_type,
85 typename src_t::value_type>::value>::type
86implement_copy_or_assign_same_mem_check_types(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
100template<
class dst_t,
class src_t>
101void deep_copy_only(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
102 update_dst_size(dst, src);
104 Kokkos::deep_copy(dst, src);
109template<
class dst_t,
class src_t>
110void deep_copy_only(dst_t & dst,
const src_t & src) {
112 deep_copy_only(
true, dst, src, bAssigned);
123template<
class dst_t,
class src_t>
124typename std::enable_if<!std::is_same<
typename dst_t::value_type,
125 typename src_t::value_type>::value>::type
126implement_copy_or_assign_same_mem_check_types(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
127 update_dst_size(dst, src);
129 Kokkos::deep_copy(dst, src);
138template<
class dst_t,
class src_t>
139typename std::enable_if<std::is_same<
typename dst_t::memory_space,
140 typename src_t::memory_space>::value>::type
141deep_copy_or_assign_view(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
142 implement_copy_or_assign_same_mem_check_types(bInitialize, dst, src, bAssigned);
147template<
class dst_t,
class src_t>
148typename std::enable_if<std::is_same<
typename dst_t::memory_space,
149 typename src_t::memory_space>::value>::type
150deep_copy_or_assign_view(dst_t & dst,
const src_t & src) {
152 implement_copy_or_assign_same_mem_check_types(
true, dst, src, bAssigned);
155template<
class dst_t,
class src_t>
156typename std::enable_if<std::is_same<
typename dst_t::value_type,
157 typename src_t::value_type>::value>::type
158implement_copy_or_assign_diff_mem_check_types(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
159 update_dst_size(dst, src);
161 Kokkos::deep_copy(dst, src);
166template<
class dst_t,
class src_t>
167typename std::enable_if<static_cast<int>(dst_t::Rank) == 1>::type
168implement_copy_or_assign_diff_mem_diff_types_check_dim(dst_t & dst,
const src_t & src) {
169 Kokkos::View<typename dst_t::value_type*, typename src_t::execution_space>
170 intermediate(Kokkos::ViewAllocateWithoutInitializing(
"intermediate"), src.extent(0));
171 Kokkos::deep_copy(intermediate, src);
172 Kokkos::deep_copy(dst, intermediate);
175template<
class dst_t,
class src_t>
176typename std::enable_if<static_cast<int>(dst_t::Rank) == 2>::type
177implement_copy_or_assign_diff_mem_diff_types_check_dim(dst_t & dst,
const src_t & src) {
178 Kokkos::View<typename dst_t::value_type**, Kokkos::LayoutLeft, typename src_t::execution_space>
179 intermediate(Kokkos::ViewAllocateWithoutInitializing(
"intermediate"), src.extent(0), src.extent(1));
180 Kokkos::deep_copy(intermediate, src);
181 Kokkos::deep_copy(dst, intermediate);
184template<
class dst_t,
class src_t>
185typename std::enable_if<!std::is_same<
typename dst_t::value_type,
186 typename src_t::value_type>::value>::type
187implement_copy_or_assign_diff_mem_check_types(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
188 update_dst_size(dst, src);
193 implement_copy_or_assign_diff_mem_diff_types_check_dim(dst, src);
197template<
class dst_t,
class src_t>
198typename std::enable_if<!std::is_same<
typename dst_t::memory_space,
199 typename src_t::memory_space>::value>::type
200deep_copy_or_assign_view(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
201 implement_copy_or_assign_diff_mem_check_types(bInitialize, dst, src, bAssigned);
206template<
class dst_t,
class src_t>
207typename std::enable_if<!std::is_same<
typename dst_t::memory_space,
208 typename src_t::memory_space>::value>::type
209deep_copy_or_assign_view(dst_t & dst,
const src_t & src) {
211 implement_copy_or_assign_diff_mem_check_types(
true, dst, src, bAssigned);