File indexing completed on 2025-09-17 08:54:13
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <sycl/sycl.hpp>
0010
0011 #include <covfie/core/concepts.hpp>
0012
0013 #include "covfie/core/parameter_pack.hpp"
0014
0015 namespace covfie::utility::sycl {
0016 template <typename T, typename U>
0017 requires(concepts::field_backend<T> &&
0018 concepts::field_backend<typename std::decay_t<U>::parent_t>)
0019 typename T::owning_data_t
0020 copy_backend_with_queue(U && backend, ::sycl::queue & queue)
0021 {
0022 constexpr bool can_construct_with_queue =
0023 std::constructible_from<typename T::owning_data_t, U, ::sycl::queue &>;
0024
0025 static_assert(
0026 can_construct_with_queue ||
0027 (!std::decay_t<T>::is_initial && !std::decay_t<U>::parent_t::is_initial)
0028 );
0029
0030 if constexpr (can_construct_with_queue) {
0031 return typename T::owning_data_t(std::forward<U>(backend), queue);
0032 } else if constexpr (std::constructible_from<
0033 typename T::owning_data_t,
0034 decltype(backend.get_configuration()),
0035 typename T::backend_t::owning_data_t &&>)
0036 {
0037 return typename T::owning_data_t(
0038 backend.get_configuration(),
0039 copy_backend_with_queue<typename T::backend_t>(
0040 backend.get_backend(), queue
0041 )
0042 );
0043 } else {
0044 return typename T::owning_data_t(make_parameter_pack(
0045 backend.get_configuration(),
0046 copy_backend_with_queue<typename T::backend_t>(
0047 backend.get_backend(), queue
0048 )
0049 ));
0050 }
0051 }
0052
0053 template <typename T, typename U>
0054 requires(concepts::field_backend<typename T::backend_t> &&
0055 concepts::field_backend<typename std::decay_t<U>::backend_t>) T
0056 copy_field_with_queue(U && field, ::sycl::queue & queue)
0057 {
0058 return T(
0059 copy_backend_with_queue<typename T::backend_t>(field.backend(), queue)
0060 );
0061 }
0062 }