1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-22 07:10:06 +02:00

Define movable_ptr_with_deleter

This commit is contained in:
Paul Licameli 2016-03-31 12:15:05 -04:00
parent d9588dda9b
commit b7f91e5674

View File

@ -552,8 +552,10 @@ static char*THIS_FILE = __FILE__;
// not move them).
#ifdef __AUDACITY_OLD_STD__
template<typename T> using movable_ptr = std::shared_ptr<T>;
template<typename T, typename Deleter> using movable_ptr_with_deleter_base = std::shared_ptr<T>;
#else
template<typename T> using movable_ptr = std::unique_ptr<T>;
template<typename T, typename Deleter> using movable_ptr_with_deleter_base = std::unique_ptr<T, Deleter>;
#endif
template<typename T, typename... Args>
@ -568,4 +570,30 @@ inline movable_ptr<T> make_movable(Args&&... args)
<T>(std::forward<Args>(args)...);
}
template<typename T, typename Deleter> 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<T, Deleter>( p, d ) {}
movable_ptr_with_deleter &operator= (movable_ptr_with_deleter&& that)
{
if (this != &that) {
((movable_ptr_with_deleter_base<T, Deleter>&)(*this)) =
std::move(that);
}
return *this;
}
};
template<typename T, typename Deleter, typename... Args>
inline movable_ptr_with_deleter<T, Deleter>
make_movable_with_deleter(const Deleter &d, Args&&... args)
{
return movable_ptr_with_deleter(safenew T(std::forward<Args>(args...)), d);
}
#endif // __AUDACITY_MEMORY_X_H__