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
#include <functional>
#include <memory>
#include <stdexcept>
#include <string>
@ -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<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;
guarded_delete(void (*del_ptr)(void *), bool armed_flag)
: del_ptr{del_ptr}, armed_flag{armed_flag} {}
guarded_delete(std::function<void(void *)> &&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 <typename T, typename D>
inline void custom_delete(void *raw_ptr) {
D()(static_cast<T *>(raw_ptr));
}
template <typename T, typename D>
guarded_delete make_guarded_custom_deleter(bool armed_flag) {
return guarded_delete(custom_delete<T, D>, armed_flag);
guarded_delete make_guarded_custom_deleter(D &&uqp_del, bool armed_flag) {
return guarded_delete(std::function<void(void *)>(
[&uqp_del](void *raw_ptr) { uqp_del(static_cast<T *>(raw_ptr)); }),
armed_flag);
}
template <typename T>
@ -309,7 +309,7 @@ struct smart_holder {
if (hld.vptr_is_using_builtin_delete) {
gd = make_guarded_builtin_delete<T>(true);
} 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) {
hld.vptr.reset(void_ptr, std::move(gd));