Syntax
class OwnedPtr : public Ptr<Type>
{
using Ptr<Type>::mPointer;
public:
OwnedPtr(void) = default;
explicit OwnedPtr(Type *aPointer)
: Ptr<Type>(aPointer)
{
}
OwnedPtr(OwnedPtr &&aOther)
{
mPointer = aOther.mPointer;
aOther.mPointer = nullptr;
}
~OwnedPtr(void) { Delete(); }
void Free(void)
{
Delete();
mPointer = nullptr;
}
void Reset(Type *aPointer = nullptr)
{
if (mPointer != aPointer)
{
Delete();
mPointer = aPointer;
}
}
Type *Release(void)
{
Type *pointer = mPointer;
mPointer = nullptr;
return pointer;
}
OwnedPtr &&PassOwnership(void) { return static_cast<OwnedPtr &&>(*this); }
OwnedPtr &operator=(OwnedPtr &&aOther)
{
Reset(aOther.Release());
return *this;
}
OwnedPtr(const OwnedPtr &) = delete;
OwnedPtr(OwnedPtr &) = delete;
OwnedPtr &operator=(const OwnedPtr &) = delete;
private:
void Delete(void)
{
if (mPointer != nullptr)
{
mPointer->Free();
}
}
};