mirror of
https://github.com/pybind/pybind11.git
synced 2025-02-08 18:01:54 +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
|
#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));
|
||||||
|
Loading…
Reference in New Issue
Block a user