18#ifndef AMESOS2_KOKKOS_VIEW_COPY_ASSIGN_HPP
19#define AMESOS2_KOKKOS_VIEW_COPY_ASSIGN_HPP
24template<
class dst_t,
class src_t>
25typename std::enable_if<static_cast<int>(dst_t::rank) == 1>::type
26update_dst_size(dst_t & dst,
const src_t & src) {
27 if(dst.extent(0) != src.extent(0)) {
28 dst = dst_t(Kokkos::ViewAllocateWithoutInitializing(
"dst"),
33template<
class dst_t,
class src_t>
34typename std::enable_if<static_cast<int>(dst_t::rank) == 2>::type
35update_dst_size(dst_t & dst,
const src_t & src) {
36 if(dst.extent(0) != src.extent(0) || dst.extent(1) != src.extent(1)) {
37 dst = dst_t(Kokkos::ViewAllocateWithoutInitializing(
"dst"),
38 src.extent(0), src.extent(1));
49template<
class dst_t,
class src_t>
50typename std::enable_if<std::is_same<
typename dst_t::value_type,
51 typename src_t::value_type>::value>::type
52implement_copy_or_assign_same_mem_check_types(
53 [[maybe_unused]]
bool bInitialize,
71template<
class dst_t,
class src_t>
72void deep_copy_only(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
73 update_dst_size(dst, src);
75 Kokkos::deep_copy(dst, src);
80template<
class dst_t,
class src_t>
81void deep_copy_only(dst_t & dst,
const src_t & src) {
83 deep_copy_only(
true, dst, src, bAssigned);
94template<
class dst_t,
class src_t>
95typename std::enable_if<!std::is_same<
typename dst_t::value_type,
96 typename src_t::value_type>::value>::type
97implement_copy_or_assign_same_mem_check_types(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
98 update_dst_size(dst, src);
100 Kokkos::deep_copy(dst, src);
109template<
class dst_t,
class src_t>
110typename std::enable_if<std::is_same<
typename dst_t::memory_space,
111 typename src_t::memory_space>::value>::type
112deep_copy_or_assign_view(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
113 implement_copy_or_assign_same_mem_check_types(bInitialize, dst, src, bAssigned);
118template<
class dst_t,
class src_t>
119typename std::enable_if<std::is_same<
typename dst_t::memory_space,
120 typename src_t::memory_space>::value>::type
121deep_copy_or_assign_view(dst_t & dst,
const src_t & src) {
123 implement_copy_or_assign_same_mem_check_types(
true, dst, src, bAssigned);
126template<
class dst_t,
class src_t>
127typename std::enable_if<std::is_same<
typename dst_t::value_type,
128 typename src_t::value_type>::value>::type
129implement_copy_or_assign_diff_mem_check_types(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
130 update_dst_size(dst, src);
132 Kokkos::deep_copy(dst, src);
137template<
class dst_t,
class src_t>
138typename std::enable_if<static_cast<int>(dst_t::rank) == 1>::type
139implement_copy_or_assign_diff_mem_diff_types_check_dim(dst_t & dst,
const src_t & src) {
140 Kokkos::View<typename dst_t::value_type*, typename src_t::execution_space>
141 intermediate(Kokkos::ViewAllocateWithoutInitializing(
"intermediate"), src.extent(0));
142 Kokkos::deep_copy(intermediate, src);
143 Kokkos::deep_copy(dst, intermediate);
146template<
class dst_t,
class src_t>
147typename std::enable_if<static_cast<int>(dst_t::rank) == 2>::type
148implement_copy_or_assign_diff_mem_diff_types_check_dim(dst_t & dst,
const src_t & src) {
149 Kokkos::View<typename dst_t::value_type**, Kokkos::LayoutLeft, typename src_t::execution_space>
150 intermediate(Kokkos::ViewAllocateWithoutInitializing(
"intermediate"), src.extent(0), src.extent(1));
151 Kokkos::deep_copy(intermediate, src);
152 Kokkos::deep_copy(dst, intermediate);
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);
164 implement_copy_or_assign_diff_mem_diff_types_check_dim(dst, src);
168template<
class dst_t,
class src_t>
169typename std::enable_if<!std::is_same<
typename dst_t::memory_space,
170 typename src_t::memory_space>::value>::type
171deep_copy_or_assign_view(
bool bInitialize, dst_t & dst,
const src_t & src,
bool & bAssigned) {
172 implement_copy_or_assign_diff_mem_check_types(bInitialize, dst, src, bAssigned);
177template<
class dst_t,
class src_t>
178typename std::enable_if<!std::is_same<
typename dst_t::memory_space,
179 typename src_t::memory_space>::value>::type
180deep_copy_or_assign_view(dst_t & dst,
const src_t & src) {
182 implement_copy_or_assign_diff_mem_check_types(
true, dst, src, bAssigned);