@@ -59,12 +59,8 @@ namespace memory {
59
59
struct guarded_operator_call {
60
60
bool armed_flag;
61
61
explicit guarded_operator_call (bool armed_flag) : armed_flag{armed_flag} {}
62
- virtual void operator ()(void *) = 0;
63
- virtual ~guarded_operator_call () = default ;
64
- guarded_operator_call (guarded_operator_call &&) = default ;
65
- guarded_operator_call (guarded_operator_call &) = default ;
66
- guarded_operator_call &operator =(guarded_operator_call &&) = delete ;
67
- guarded_operator_call &operator =(const guarded_operator_call &) = delete ;
62
+ virtual void operator ()(void *) = 0;
63
+ virtual ~guarded_operator_call () = default ;
68
64
};
69
65
70
66
template <typename T>
@@ -214,20 +210,25 @@ struct smart_holder {
214
210
}
215
211
}
216
212
213
+ template <typename T, typename D>
214
+ void vptr_reset (T *raw_ptr, const D &del) {
215
+ vptr.reset (raw_ptr, del); // Copies del.
216
+ // The const_cast is only for certain compilers (Ubuntu 20 GCC 6.3.0 being one).
217
+ vptr_del = const_cast <D *>(std::get_deleter<D>(vptr)); // Pointer to copy of del.
218
+ }
219
+
217
220
void reset_vptr_deleter_armed_flag (bool armed_flag) const {
218
- auto vptr_del_ptr = std::get_deleter<guarded_delete>(vptr);
219
- if (vptr_del_ptr == nullptr ) {
221
+ if (vptr_del == nullptr ) {
220
222
throw std::runtime_error (
221
223
" smart_holder::reset_vptr_deleter_armed_flag() called in an invalid context." );
222
224
}
223
- vptr_del_ptr ->armed_flag = armed_flag;
225
+ vptr_del ->armed_flag = armed_flag;
224
226
}
225
227
226
228
template <typename T>
227
229
static smart_holder from_raw_ptr_unowned (T *raw_ptr) {
228
230
smart_holder hld;
229
- hld.vptr .reset (raw_ptr, guarded_builtin_delete<T>(false ));
230
- hld.vptr_del = std::get_deleter<guarded_builtin_delete<T>>(hld.vptr );
231
+ hld.vptr_reset (raw_ptr, guarded_builtin_delete<T>(false ));
231
232
hld.vptr_is_using_noop_deleter = true ;
232
233
hld.is_populated = true ;
233
234
return hld;
@@ -258,21 +259,12 @@ struct smart_holder {
258
259
static smart_holder from_raw_ptr_take_ownership (T *raw_ptr) {
259
260
ensure_pointee_is_destructible<T>(" from_raw_ptr_take_ownership" );
260
261
smart_holder hld;
261
- hld.vptr .reset (raw_ptr, guarded_builtin_delete<T>(true ));
262
- hld.vptr_del = std::get_deleter<guarded_builtin_delete<T>>(hld.vptr );
262
+ hld.vptr_reset (raw_ptr, guarded_builtin_delete<T>(true ));
263
263
hld.vptr_is_using_builtin_delete = true ;
264
264
hld.is_populated = true ;
265
265
return hld;
266
266
}
267
267
268
- void reset_vptr_deleter_armed_flag (bool armed_flag) {
269
- if (vptr_del == nullptr ) {
270
- throw std::runtime_error (
271
- " smart_holder::reset_vptr_deleter_armed_flag() called in an invalid context." );
272
- }
273
- vptr_del->armed_flag = armed_flag;
274
- }
275
-
276
268
// Caller is responsible for ensuring preconditions (SMART_HOLDER_WIP: details).
277
269
void disown () {
278
270
reset_vptr_deleter_armed_flag (false );
@@ -318,11 +310,9 @@ struct smart_holder {
318
310
hld.rtti_uqp_del = &typeid (D);
319
311
hld.vptr_is_using_builtin_delete = is_std_default_delete<T>(*hld.rtti_uqp_del );
320
312
if (hld.vptr_is_using_builtin_delete ) {
321
- hld.vptr .reset (unq_ptr.get (), guarded_builtin_delete<T>(true ));
322
- hld.vptr_del = std::get_deleter<guarded_builtin_delete<T>>(hld.vptr );
313
+ hld.vptr_reset (unq_ptr.get (), guarded_builtin_delete<T>(true ));
323
314
} else {
324
- hld.vptr .reset (unq_ptr.get (), guarded_custom_deleter<T, D>(true ));
325
- hld.vptr_del = std::get_deleter<guarded_custom_deleter<T, D>>(hld.vptr );
315
+ hld.vptr_reset (unq_ptr.get (), guarded_custom_deleter<T, D>(true ));
326
316
}
327
317
unq_ptr.release ();
328
318
hld.is_populated = true ;
0 commit comments