5#ifndef GKO_PUBLIC_CORE_BASE_TEMPORARY_CLONE_HPP_
6#define GKO_PUBLIC_CORE_BASE_TEMPORARY_CLONE_HPP_
14#include <ginkgo/core/base/exception_helpers.hpp>
15#include <ginkgo/core/base/executor.hpp>
16#include <ginkgo/core/base/utils_helper.hpp>
38class copy_back_deleter {
55 void operator()(pointer ptr)
const
57 original_->copy_from(ptr);
68class copy_back_deleter<
const T> {
70 using pointer =
const T*;
73 void operator()(pointer ptr)
const {
delete ptr; }
81struct temporary_clone_helper {
82 static std::unique_ptr<T> create(std::shared_ptr<const Executor> exec,
102class temporary_clone {
104 using value_type =
T;
115 explicit temporary_clone(std::shared_ptr<const Executor> exec,
118 if (ptr->get_executor()->memory_accessible(exec)) {
124 handle_ = handle_type(temporary_clone_helper<T>::create(
136 T* get()
const {
return handle_.get(); }
143 T* operator->()
const {
return handle_.get(); }
150 T& operator*()
const {
return *handle_; }
154 using handle_type = std::unique_ptr<
T, std::function<
void(
T*)>>;
178template <
typename Ptr>
180 std::shared_ptr<const Executor> exec,
Ptr&& ptr)
182 using T = detail::pointee<Ptr>;
183 return detail::temporary_clone<T>(std::move(exec), std::forward<Ptr>(ptr));
201template <
typename Ptr>
203 std::shared_ptr<const Executor> exec,
Ptr&& ptr)
205 using T = detail::pointee<Ptr>;
207 !std::is_const<T>::value,
208 "make_temporary_output_clone should only be used on non-const objects");
209 return detail::temporary_clone<T>(std::move(exec), std::forward<Ptr>(ptr),
The Ginkgo namespace.
Definition abstract_factory.hpp:20
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:775
detail::temporary_clone< detail::pointee< Ptr > > make_temporary_output_clone(std::shared_ptr< const Executor > exec, Ptr &&ptr)
Creates a uninitialized temporary_clone that will be copied back to the input afterwards.
Definition temporary_clone.hpp:202
detail::cloned_type< Pointer > clone(const Pointer &p)
Creates a unique clone of the object pointed to by p.
Definition utils_helper.hpp:175
detail::temporary_clone< detail::pointee< Ptr > > make_temporary_clone(std::shared_ptr< const Executor > exec, Ptr &&ptr)
Creates a temporary_clone.
Definition temporary_clone.hpp:179
Definition temporary_clone.hpp:164