5#ifndef GKO_PUBLIC_CORE_BASE_TEMPORARY_CONVERSION_HPP_
6#define GKO_PUBLIC_CORE_BASE_TEMPORARY_CONVERSION_HPP_
14#include <ginkgo/core/base/lin_op.hpp>
15#include <ginkgo/core/base/utils.hpp>
40template <
typename CopyType,
typename OrigType>
41class convert_back_deleter {
59 void operator()(pointer ptr)
const
61 ptr->convert_to(original_);
66 original_pointer original_;
71template <
typename CopyType,
typename OrigType>
75 using original_pointer =
const OrigType*;
76 convert_back_deleter(original_pointer) {}
78 void operator()(pointer ptr)
const {
delete ptr; }
91template <
typename TargetType>
92struct conversion_target_helper {
101 typename = std::enable_if_t<std::is_base_of<
105 return TargetType::create(
source->get_executor());
121struct conversion_helper {
123 template <
typename TargetType,
typename MaybeConstLinOp>
143 std::conditional_t<std::is_const<MaybeConstLinOp>::value,
149 auto converted = conversion_target_helper<
150 std::remove_cv_t<TargetType>>::create_empty(
cast_obj);
154 std::is_base_of<ConvertibleTo<std::remove_cv_t<TargetType>>,
156 "ConvertibleTo not implemented");
157 static_assert(std::is_base_of<ConvertibleTo<FirstCandidate>,
159 "ConvertibleTo not symmetric");
171struct conversion_helper<> {
172 template <
typename T,
typename MaybeConstLinOp>
173 static std::unique_ptr<
T, std::function<
void(
T*)>> convert(
195class temporary_conversion {
197 using value_type =
T;
200 std::conditional_t<std::is_const<T>::value,
const LinOp, LinOp>;
212 if ((
cast_ptr =
dynamic_cast<T*
>(ptr.get()))) {
225 T* get()
const {
return handle_.get(); }
232 T* operator->()
const {
return handle_.get(); }
237 explicit operator bool() {
return static_cast<bool>(handle_); }
242 using handle_type = std::unique_ptr<
T, std::function<
void(
T*)>>;
244 temporary_conversion(handle_type handle) : handle_{std::
move(handle)} {}
The Ginkgo namespace.
Definition abstract_factory.hpp:20
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:775