diff --git a/include/pybind11/detail/smart_holder_poc.h b/include/pybind11/detail/smart_holder_poc.h index e169f2f26..d0140d6dc 100644 --- a/include/pybind11/detail/smart_holder_poc.h +++ b/include/pybind11/detail/smart_holder_poc.h @@ -48,6 +48,7 @@ Details: #pragma once +#include #include #include #include @@ -67,15 +68,17 @@ static constexpr bool type_has_shared_from_this(const std::enable_shared_from_th return true; } +struct smart_holder; + struct guarded_delete { std::weak_ptr released_ptr; // Trick to keep the smart_holder memory footprint small. - void (*del_ptr)(void *); + std::function del_fun; bool armed_flag; - guarded_delete(void (*del_ptr)(void *), bool armed_flag) - : del_ptr{del_ptr}, armed_flag{armed_flag} {} + guarded_delete(std::function &&del_fun, bool armed_flag) + : del_fun{std::move(del_fun)}, armed_flag{armed_flag} {} void operator()(void *raw_ptr) const { if (armed_flag) { - (*del_ptr)(raw_ptr); + del_fun(raw_ptr); } } }; @@ -99,13 +102,10 @@ guarded_delete make_guarded_builtin_delete(bool armed_flag) { } template -inline void custom_delete(void *raw_ptr) { - D()(static_cast(raw_ptr)); -} - -template -guarded_delete make_guarded_custom_deleter(bool armed_flag) { - return guarded_delete(custom_delete, armed_flag); +guarded_delete make_guarded_custom_deleter(D &&uqp_del, bool armed_flag) { + return guarded_delete(std::function( + [&uqp_del](void *raw_ptr) { uqp_del(static_cast(raw_ptr)); }), + armed_flag); } template @@ -309,7 +309,7 @@ struct smart_holder { if (hld.vptr_is_using_builtin_delete) { gd = make_guarded_builtin_delete(true); } else { - gd = make_guarded_custom_deleter(true); + gd = make_guarded_custom_deleter(std::move(unq_ptr.get_deleter()), true); } if (void_ptr != nullptr) { hld.vptr.reset(void_ptr, std::move(gd));