|
@@ -42,25 +42,22 @@ template<typename T>
|
|
class WeakPtr;
|
|
class WeakPtr;
|
|
|
|
|
|
template<typename T>
|
|
template<typename T>
|
|
-class CONSUMABLE(unconsumed) NonnullOwnPtr {
|
|
|
|
|
|
+class NonnullOwnPtr {
|
|
public:
|
|
public:
|
|
typedef T ElementType;
|
|
typedef T ElementType;
|
|
|
|
|
|
enum AdoptTag { Adopt };
|
|
enum AdoptTag { Adopt };
|
|
|
|
|
|
- RETURN_TYPESTATE(unconsumed)
|
|
|
|
NonnullOwnPtr(AdoptTag, T& ptr)
|
|
NonnullOwnPtr(AdoptTag, T& ptr)
|
|
: m_ptr(&ptr)
|
|
: m_ptr(&ptr)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
- RETURN_TYPESTATE(unconsumed)
|
|
|
|
NonnullOwnPtr(NonnullOwnPtr&& other)
|
|
NonnullOwnPtr(NonnullOwnPtr&& other)
|
|
: m_ptr(other.leak_ptr())
|
|
: m_ptr(other.leak_ptr())
|
|
{
|
|
{
|
|
ASSERT(m_ptr);
|
|
ASSERT(m_ptr);
|
|
}
|
|
}
|
|
template<typename U>
|
|
template<typename U>
|
|
- RETURN_TYPESTATE(unconsumed)
|
|
|
|
NonnullOwnPtr(NonnullOwnPtr<U>&& other)
|
|
NonnullOwnPtr(NonnullOwnPtr<U>&& other)
|
|
: m_ptr(other.leak_ptr())
|
|
: m_ptr(other.leak_ptr())
|
|
{
|
|
{
|
|
@@ -97,7 +94,6 @@ public:
|
|
template<typename U>
|
|
template<typename U>
|
|
NonnullOwnPtr& operator=(const WeakPtr<U>&) = delete;
|
|
NonnullOwnPtr& operator=(const WeakPtr<U>&) = delete;
|
|
|
|
|
|
- RETURN_TYPESTATE(unconsumed)
|
|
|
|
NonnullOwnPtr& operator=(NonnullOwnPtr&& other)
|
|
NonnullOwnPtr& operator=(NonnullOwnPtr&& other)
|
|
{
|
|
{
|
|
NonnullOwnPtr ptr(move(other));
|
|
NonnullOwnPtr ptr(move(other));
|
|
@@ -106,7 +102,6 @@ public:
|
|
}
|
|
}
|
|
|
|
|
|
template<typename U>
|
|
template<typename U>
|
|
- RETURN_TYPESTATE(unconsumed)
|
|
|
|
NonnullOwnPtr& operator=(NonnullOwnPtr<U>&& other)
|
|
NonnullOwnPtr& operator=(NonnullOwnPtr<U>&& other)
|
|
{
|
|
{
|
|
NonnullOwnPtr ptr(move(other));
|
|
NonnullOwnPtr ptr(move(other));
|
|
@@ -114,31 +109,21 @@ public:
|
|
return *this;
|
|
return *this;
|
|
}
|
|
}
|
|
|
|
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
- SET_TYPESTATE(consumed)
|
|
|
|
T* leak_ptr()
|
|
T* leak_ptr()
|
|
{
|
|
{
|
|
return exchange(m_ptr, nullptr);
|
|
return exchange(m_ptr, nullptr);
|
|
}
|
|
}
|
|
|
|
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
T* ptr() { return m_ptr; }
|
|
T* ptr() { return m_ptr; }
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
const T* ptr() const { return m_ptr; }
|
|
const T* ptr() const { return m_ptr; }
|
|
|
|
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
T* operator->() { return m_ptr; }
|
|
T* operator->() { return m_ptr; }
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
const T* operator->() const { return m_ptr; }
|
|
const T* operator->() const { return m_ptr; }
|
|
|
|
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
T& operator*() { return *m_ptr; }
|
|
T& operator*() { return *m_ptr; }
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
const T& operator*() const { return *m_ptr; }
|
|
const T& operator*() const { return *m_ptr; }
|
|
|
|
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
operator const T*() const { return m_ptr; }
|
|
operator const T*() const { return m_ptr; }
|
|
- CALLABLE_WHEN(unconsumed)
|
|
|
|
operator T*() { return m_ptr; }
|
|
operator T*() { return m_ptr; }
|
|
|
|
|
|
operator bool() const = delete;
|
|
operator bool() const = delete;
|