Store std::function<void (void *)> del_fun; in guarded_delete

This commit is contained in:
Ralf W. Grosse-Kunstleve 2023-09-18 19:29:16 -07:00
parent 9110b7665e
commit f14846dab3

View File

@ -48,6 +48,7 @@ Details:
#pragma once #pragma once
#include <functional>
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
@ -67,15 +68,17 @@ static constexpr bool type_has_shared_from_this(const std::enable_shared_from_th
return true; return true;
} }
struct smart_holder;
struct guarded_delete { struct guarded_delete {
std::weak_ptr<void> released_ptr; // Trick to keep the smart_holder memory footprint small. std::weak_ptr<void> released_ptr; // Trick to keep the smart_holder memory footprint small.
void (*del_ptr)(void *); std::function<void(void *)> del_fun;
bool armed_flag; bool armed_flag;
guarded_delete(void (*del_ptr)(void *), bool armed_flag) guarded_delete(std::function<void(void *)> &&del_fun, bool armed_flag)
: del_ptr{del_ptr}, armed_flag{armed_flag} {} : del_fun{std::move(del_fun)}, armed_flag{armed_flag} {}
void operator()(void *raw_ptr) const { void operator()(void *raw_ptr) const {
if (armed_flag) { 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 <typename T, typename D> template <typename T, typename D>
inline void custom_delete(void *raw_ptr) { guarded_delete make_guarded_custom_deleter(D &&uqp_del, bool armed_flag) {
D()(static_cast<T *>(raw_ptr)); return guarded_delete(std::function<void(void *)>(
} [&uqp_del](void *raw_ptr) { uqp_del(static_cast<T *>(raw_ptr)); }),
armed_flag);
template <typename T, typename D>
guarded_delete make_guarded_custom_deleter(bool armed_flag) {
return guarded_delete(custom_delete<T, D>, armed_flag);
} }
template <typename T> template <typename T>
@ -309,7 +309,7 @@ struct smart_holder {
if (hld.vptr_is_using_builtin_delete) { if (hld.vptr_is_using_builtin_delete) {
gd = make_guarded_builtin_delete<T>(true); gd = make_guarded_builtin_delete<T>(true);
} else { } else {
gd = make_guarded_custom_deleter<T, D>(true); gd = make_guarded_custom_deleter<T, D>(std::move(unq_ptr.get_deleter()), true);
} }
if (void_ptr != nullptr) { if (void_ptr != nullptr) {
hld.vptr.reset(void_ptr, std::move(gd)); hld.vptr.reset(void_ptr, std::move(gd));