33#ifndef GKO_PUBLIC_CORE_BASE_TEMPORARY_CLONE_HPP_
34#define GKO_PUBLIC_CORE_BASE_TEMPORARY_CLONE_HPP_
42#include <ginkgo/core/base/exception_helpers.hpp>
43#include <ginkgo/core/base/executor.hpp>
44#include <ginkgo/core/base/utils_helper.hpp>
66class copy_back_deleter {
83 void operator()(pointer ptr)
const
85 original_->copy_from(ptr);
96class copy_back_deleter<
const T> {
98 using pointer =
const T*;
101 void operator()(pointer ptr)
const {
delete ptr; }
109struct temporary_clone_helper {
110 static std::unique_ptr<T> create(std::shared_ptr<const Executor> exec,
130class temporary_clone {
132 using value_type =
T;
143 explicit temporary_clone(std::shared_ptr<const Executor> exec,
146 if (ptr->get_executor()->memory_accessible(exec)) {
152 handle_ = handle_type(temporary_clone_helper<T>::create(
164 T* get()
const {
return handle_.get(); }
171 T* operator->()
const {
return handle_.get(); }
178 T& operator*()
const {
return *handle_; }
182 using handle_type = std::unique_ptr<
T, std::function<
void(
T*)>>;
206template <
typename Ptr>
208 std::shared_ptr<const Executor> exec,
Ptr&& ptr)
210 using T = detail::pointee<Ptr>;
211 return detail::temporary_clone<T>(std::move(exec), std::forward<Ptr>(ptr));
229template <
typename Ptr>
231 std::shared_ptr<const Executor> exec,
Ptr&& ptr)
233 using T = detail::pointee<Ptr>;
235 !std::is_const<T>::value,
236 "make_temporary_output_clone should only be used on non-const objects");
237 return detail::temporary_clone<T>(std::move(exec), std::forward<Ptr>(ptr),
The Ginkgo namespace.
Definition abstract_factory.hpp:48
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:803
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:230
detail::cloned_type< Pointer > clone(const Pointer &p)
Creates a unique clone of the object pointed to by p.
Definition utils_helper.hpp:203
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:207
Definition temporary_clone.hpp:192