remove ptr::Remove, make ptr::Peek share the same signature as ptr::Get
parent
bd73c92bb5
commit
80854a2c39
|
@ -67,7 +67,8 @@ int main (int argc, char *argv[])
|
||||||
// remove the raw pointer from its smart pointer.
|
// remove the raw pointer from its smart pointer.
|
||||||
// we can do this because the refcount is exactly one
|
// we can do this because the refcount is exactly one
|
||||||
// here
|
// here
|
||||||
A *raw = prev.Remove ();
|
A *raw = prev.Get ();
|
||||||
|
prev = 0;
|
||||||
raw->Method ();
|
raw->Method ();
|
||||||
delete raw;
|
delete raw;
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,7 +241,8 @@ PtrTest::RunTests (void)
|
||||||
{
|
{
|
||||||
Ptr<NoCount const> p1 = p;
|
Ptr<NoCount const> p1 = p;
|
||||||
}
|
}
|
||||||
raw = p.Remove ();
|
raw = p.Get ();
|
||||||
|
p = 0;
|
||||||
}
|
}
|
||||||
if (m_nDestroyed != 0)
|
if (m_nDestroyed != 0)
|
||||||
{
|
{
|
||||||
|
@ -254,12 +255,12 @@ PtrTest::RunTests (void)
|
||||||
m_nDestroyed = 0;
|
m_nDestroyed = 0;
|
||||||
{
|
{
|
||||||
Ptr<NoCount> p = new NoCount (cb);
|
Ptr<NoCount> p = new NoCount (cb);
|
||||||
NoCount const&v1 = p.Peek();
|
const NoCount *v1 = p.Peek();
|
||||||
NoCount v2 = p.Peek();
|
NoCount *v2 = p.Peek();
|
||||||
v1.Nothing ();
|
v1->Nothing ();
|
||||||
v2.Nothing ();
|
v2->Nothing ();
|
||||||
}
|
}
|
||||||
if (m_nDestroyed != 2)
|
if (m_nDestroyed != 1)
|
||||||
{
|
{
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,23 @@ public:
|
||||||
Ptr (Ptr<U> const &o);
|
Ptr (Ptr<U> const &o);
|
||||||
~Ptr () ;
|
~Ptr () ;
|
||||||
Ptr<T> &operator = (Ptr const& o);
|
Ptr<T> &operator = (Ptr const& o);
|
||||||
T const& Peek () const;
|
|
||||||
|
/**
|
||||||
|
* \return the pointer managed by this smart pointer.
|
||||||
|
*
|
||||||
|
* The underlying refcount is not incremented prior
|
||||||
|
* to returning to the caller so the caller is not
|
||||||
|
* responsible for calling Unref himself.
|
||||||
|
*/
|
||||||
|
T * Peek () const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \return the pointer managed by this smart pointer.
|
||||||
|
*
|
||||||
|
* The underlying refcount is incremented prior
|
||||||
|
* to returning to the caller so the caller is
|
||||||
|
* responsible for calling Unref himself.
|
||||||
|
*/
|
||||||
T * Get () const;
|
T * Get () const;
|
||||||
T *operator -> () const;
|
T *operator -> () const;
|
||||||
T *operator -> ();
|
T *operator -> ();
|
||||||
|
@ -97,20 +113,6 @@ public:
|
||||||
inline friend Ptr<T1> const_pointer_cast (Ptr<T2> const&p);
|
inline friend Ptr<T1> const_pointer_cast (Ptr<T2> const&p);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \returns raw pointer
|
|
||||||
*
|
|
||||||
* It is a programming error to invoke this method when
|
|
||||||
* the reference count of the smart pointer is not one.
|
|
||||||
* If you try to do it anyway, an assert will be triggered.
|
|
||||||
* If asserts are disabled, bad things will happen.
|
|
||||||
* Once you have successfully called Ptr<T>::Remove on
|
|
||||||
* a smart pointer, the smart pointer will forget
|
|
||||||
* about the raw pointer and will stop managing it. As such,
|
|
||||||
* you, as the caller, become responsible for invoking
|
|
||||||
* operator delete on the returned raw pointer.
|
|
||||||
*/
|
|
||||||
T *Remove (void);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -172,10 +174,10 @@ Ptr<T>::operator = (Ptr const& o)
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T const&
|
T *
|
||||||
Ptr<T>::Peek () const
|
Ptr<T>::Peek () const
|
||||||
{
|
{
|
||||||
return *m_ptr;
|
return m_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -218,23 +220,6 @@ Ptr<T>::operator Tester * () const
|
||||||
return &test;
|
return &test;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T *
|
|
||||||
Ptr<T>::Remove (void)
|
|
||||||
{
|
|
||||||
if (m_ptr == 0)
|
|
||||||
{
|
|
||||||
return (T *) 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//NS_ASSERT (m_ptr->IsSingle());
|
|
||||||
T *retval = m_ptr;
|
|
||||||
m_ptr = 0;
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// non-member friend functions.
|
// non-member friend functions.
|
||||||
template <typename T1, typename T2>
|
template <typename T1, typename T2>
|
||||||
bool
|
bool
|
||||||
|
|
Loading…
Reference in New Issue