From b7f91e567463e05de78e960ba91bf798cf09c8bd Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 31 Mar 2016 12:15:05 -0400 Subject: [PATCH] Define movable_ptr_with_deleter --- src/MemoryX.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/MemoryX.h b/src/MemoryX.h index c06e59407..aa623dd78 100644 --- a/src/MemoryX.h +++ b/src/MemoryX.h @@ -552,8 +552,10 @@ static char*THIS_FILE = __FILE__; // not move them). #ifdef __AUDACITY_OLD_STD__ template using movable_ptr = std::shared_ptr; +template using movable_ptr_with_deleter_base = std::shared_ptr; #else template using movable_ptr = std::unique_ptr; +template using movable_ptr_with_deleter_base = std::unique_ptr; #endif template @@ -568,4 +570,30 @@ inline movable_ptr make_movable(Args&&... args) (std::forward(args)...); } +template class movable_ptr_with_deleter + : public movable_ptr_with_deleter_base < T, Deleter > +{ +public: + // Do not expose a constructor that takes only a pointer without deleter + // That is important when implemented with shared_ptr + movable_ptr_with_deleter() {}; + movable_ptr_with_deleter(T* p, const Deleter &d) + : movable_ptr_with_deleter_base( p, d ) {} + movable_ptr_with_deleter &operator= (movable_ptr_with_deleter&& that) + { + if (this != &that) { + ((movable_ptr_with_deleter_base&)(*this)) = + std::move(that); + } + return *this; + } +}; + +template +inline movable_ptr_with_deleter +make_movable_with_deleter(const Deleter &d, Args&&... args) +{ + return movable_ptr_with_deleter(safenew T(std::forward(args...)), d); +} + #endif // __AUDACITY_MEMORY_X_H__