mirror of
https://github.com/pybind/pybind11.git
synced 2025-02-08 09:51:57 +00:00
Store std::function<void (void *)>
del_fun; in guarded_delete
This commit is contained in:
parent
9110b7665e
commit
f14846dab3
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user