33#ifndef GKO_PUBLIC_CORE_BASE_TEMPORARY_CONVERSION_HPP_
34#define GKO_PUBLIC_CORE_BASE_TEMPORARY_CONVERSION_HPP_
42#include <ginkgo/core/base/lin_op.hpp>
43#include <ginkgo/core/base/utils.hpp>
68template <
typename CopyType,
typename OrigType>
69class convert_back_deleter {
87 void operator()(pointer ptr)
const
89 ptr->convert_to(original_);
94 original_pointer original_;
99template <
typename CopyType,
typename OrigType>
103 using original_pointer =
const OrigType*;
104 convert_back_deleter(original_pointer) {}
106 void operator()(pointer ptr)
const {
delete ptr; }
119template <
typename TargetType>
120struct conversion_target_helper {
129 typename = std::enable_if_t<std::is_base_of<
133 return TargetType::create(
source->get_executor());
149struct conversion_helper {
151 template <
typename TargetType,
typename MaybeConstLinOp>
171 std::conditional_t<std::is_const<MaybeConstLinOp>::value,
177 auto converted = conversion_target_helper<
178 std::remove_cv_t<TargetType>>::create_empty(
cast_obj);
182 std::is_base_of<ConvertibleTo<std::remove_cv_t<TargetType>>,
184 "ConvertibleTo not implemented");
185 static_assert(std::is_base_of<ConvertibleTo<FirstCandidate>,
187 "ConvertibleTo not symmetric");
199struct conversion_helper<> {
200 template <
typename T,
typename MaybeConstLinOp>
201 static std::unique_ptr<
T, std::function<
void(
T*)>> convert(
223class temporary_conversion {
225 using value_type =
T;
228 std::conditional_t<std::is_const<T>::value,
const LinOp, LinOp>;
240 if ((
cast_ptr =
dynamic_cast<T*
>(ptr.get()))) {
253 T* get()
const {
return handle_.get(); }
260 T* operator->()
const {
return handle_.get(); }
265 explicit operator bool() {
return static_cast<bool>(handle_); }
270 using handle_type = std::unique_ptr<
T, std::function<
void(
T*)>>;
272 temporary_conversion(handle_type handle) : handle_{std::
move(handle)} {}
The Ginkgo namespace.
Definition abstract_factory.hpp:48
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:803