@@ -100,6 +100,12 @@ struct guarded_delete {
100100 }
101101};
102102
103+ inline guarded_delete *get_guarded_delete (const std::shared_ptr<void > &ptr) {
104+ return std::get_deleter<guarded_delete>(ptr);
105+ }
106+
107+ using get_guarded_delete_fn = guarded_delete *(*) (const std::shared_ptr<void > &);
108+
103109template <typename T, typename std::enable_if<std::is_destructible<T>::value, int >::type = 0 >
104110inline void builtin_delete_if_destructible (void *raw_ptr) {
105111 std::default_delete<T>{}(static_cast <T *>(raw_ptr));
@@ -231,7 +237,8 @@ struct smart_holder {
231237 }
232238 }
233239
234- void reset_vptr_deleter_armed_flag (guarded_delete *vptr_del_ptr, bool armed_flag) const {
240+ void reset_vptr_deleter_armed_flag (const get_guarded_delete_fn ggd_fn, bool armed_flag) const {
241+ auto *vptr_del_ptr = ggd_fn (vptr);
235242 if (vptr_del_ptr == nullptr ) {
236243 throw std::runtime_error (
237244 " smart_holder::reset_vptr_deleter_armed_flag() called in an invalid context." );
@@ -241,7 +248,9 @@ struct smart_holder {
241248
242249 // Caller is responsible for precondition: ensure_compatible_rtti_uqp_del<T, D>() must succeed.
243250 template <typename T, typename D>
244- std::unique_ptr<D> extract_deleter (const char *context, const guarded_delete *gd) const {
251+ std::unique_ptr<D> extract_deleter (const char *context,
252+ const get_guarded_delete_fn ggd_fn) const {
253+ auto *gd = ggd_fn (vptr);
245254 if (gd && gd->use_del_fun ) {
246255 const auto &custom_deleter_ptr = gd->del_fun .template target <custom_deleter<T, D>>();
247256 if (custom_deleter_ptr == nullptr ) {
@@ -286,15 +295,15 @@ struct smart_holder {
286295
287296 // Caller is responsible for ensuring the complex preconditions
288297 // (see `smart_holder_type_caster_support::load_helper`).
289- void disown (guarded_delete *vptr_del_ptr ) {
290- reset_vptr_deleter_armed_flag (vptr_del_ptr , false );
298+ void disown (const get_guarded_delete_fn ggd_fn ) {
299+ reset_vptr_deleter_armed_flag (ggd_fn , false );
291300 is_disowned = true ;
292301 }
293302
294303 // Caller is responsible for ensuring the complex preconditions
295304 // (see `smart_holder_type_caster_support::load_helper`).
296- void reclaim_disowned (guarded_delete *vptr_del_ptr ) {
297- reset_vptr_deleter_armed_flag (vptr_del_ptr , true );
305+ void reclaim_disowned (const get_guarded_delete_fn ggd_fn ) {
306+ reset_vptr_deleter_armed_flag (ggd_fn , true );
298307 is_disowned = false ;
299308 }
300309
@@ -310,8 +319,8 @@ struct smart_holder {
310319
311320 // Caller is responsible for ensuring the complex preconditions
312321 // (see `smart_holder_type_caster_support::load_helper`).
313- void release_ownership (guarded_delete *vptr_del_ptr ) {
314- reset_vptr_deleter_armed_flag (vptr_del_ptr , false );
322+ void release_ownership (const get_guarded_delete_fn ggd_fn ) {
323+ reset_vptr_deleter_armed_flag (ggd_fn , false );
315324 release_disowned ();
316325 }
317326
0 commit comments