Virtual destructor check and unique move into lent protection
This commit was merged in pull request #1.
This commit is contained in:
@@ -25,10 +25,24 @@ template<typename T> class lent_ptr;
|
||||
template<typename T>
|
||||
using delete_callback = eastl::function<void(T*)>;
|
||||
|
||||
|
||||
template<typename T, bool>
|
||||
struct ptr_traits_passes_virtual_destructor_check
|
||||
{
|
||||
static constexpr inline bool value = !std::is_polymorphic<T>::value || std::is_final<T>::value || std::has_virtual_destructor<T>::value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct ptr_traits_passes_virtual_destructor_check<T, false> // check not required
|
||||
{
|
||||
static constexpr inline bool value = true;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct ptr_traits
|
||||
{
|
||||
static constexpr inline bool custom_deleter = false;
|
||||
static constexpr inline bool requires_virtual_destructor_check = true;
|
||||
};
|
||||
|
||||
namespace detail
|
||||
@@ -243,6 +257,8 @@ public:
|
||||
{
|
||||
m_del.destroy(m_ptr);
|
||||
CB_UNIQUE_DEC_REF();
|
||||
|
||||
static_assert(ptr_traits_passes_virtual_destructor_check<T, ptr_traits<T>::requires_virtual_destructor_check>::value, "Destructor is not virtual");
|
||||
}
|
||||
unique_ptr(const unique_ptr<T>&) noexcept = delete;
|
||||
template<typename U> unique_ptr(unique_ptr<U>&& other) noexcept
|
||||
@@ -396,6 +412,8 @@ public:
|
||||
}
|
||||
~unique_ref() noexcept
|
||||
{
|
||||
static_assert(ptr_traits_passes_virtual_destructor_check<T, ptr_traits<T>::requires_virtual_destructor_check>::value, "Destructor is not virtual");
|
||||
|
||||
m_del.destroy(m_ptr);
|
||||
CB_UNIQUE_DEC_REF();
|
||||
}
|
||||
@@ -556,6 +574,12 @@ public:
|
||||
{
|
||||
CB_LENT_COPY_CTOR();
|
||||
}
|
||||
|
||||
template<typename U> lent_ptr(unique_ref<U>&& other) = delete;
|
||||
template<typename U> lent_ptr(unique_ptr<U>&& other) = delete;
|
||||
template<typename U> lent_ptr& operator = (unique_ref<U>&& other) = delete;
|
||||
template<typename U> lent_ptr& operator = (unique_ptr<U>&& other) = delete;
|
||||
|
||||
template<typename U> lent_ptr(lent_ptr<U>&& other) noexcept
|
||||
: m_ptr(other.m_ptr)
|
||||
{
|
||||
@@ -722,6 +746,10 @@ public:
|
||||
CHECK_NULL;
|
||||
CB_LENT_COPY_CTOR();
|
||||
}
|
||||
|
||||
template<typename U> lent_ref(unique_ref<U>&& other) = delete;
|
||||
template<typename U> lent_ref& operator = (unique_ref<U>&& other) = delete;
|
||||
|
||||
lent_ref(lent_ref<T>&& other) noexcept
|
||||
: m_ptr(other.m_ptr)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user