mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-07-30 12:47:28 +02:00
Consistent 'bool' conversions; scoped_ptr(auto_ptr); get_pointer(scoped_ptr) added.
[SVN r14496]
This commit is contained in:
@ -33,6 +33,8 @@ private:
|
|||||||
scoped_array(scoped_array const &);
|
scoped_array(scoped_array const &);
|
||||||
scoped_array & operator=(scoped_array const &);
|
scoped_array & operator=(scoped_array const &);
|
||||||
|
|
||||||
|
typedef scoped_array<T> this_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef T element_type;
|
typedef T element_type;
|
||||||
@ -67,6 +69,20 @@ public:
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implicit conversion to "bool"
|
||||||
|
|
||||||
|
typedef T * (this_type::*unspecified_bool_type)() const;
|
||||||
|
|
||||||
|
operator unspecified_bool_type() const // never throws
|
||||||
|
{
|
||||||
|
return px == 0? 0: &this_type::get;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator! () const // never throws
|
||||||
|
{
|
||||||
|
return px == 0;
|
||||||
|
}
|
||||||
|
|
||||||
void swap(scoped_array & b) // never throws
|
void swap(scoped_array & b) // never throws
|
||||||
{
|
{
|
||||||
T * tmp = b.ptr;
|
T * tmp = b.ptr;
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/checked_delete.hpp>
|
#include <boost/checked_delete.hpp>
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_AUTO_PTR
|
||||||
|
# include <memory> // for std::auto_ptr
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -27,11 +31,13 @@ template<typename T> class scoped_ptr // noncopyable
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
T* ptr;
|
T * ptr;
|
||||||
|
|
||||||
scoped_ptr(scoped_ptr const &);
|
scoped_ptr(scoped_ptr const &);
|
||||||
scoped_ptr & operator=(scoped_ptr const &);
|
scoped_ptr & operator=(scoped_ptr const &);
|
||||||
|
|
||||||
|
typedef scoped_ptr<T> this_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef T element_type;
|
typedef T element_type;
|
||||||
@ -40,6 +46,14 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_AUTO_PTR
|
||||||
|
|
||||||
|
explicit scoped_ptr(std::auto_ptr<T> p): ptr(p.release()) // never throws
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
~scoped_ptr() // never throws
|
~scoped_ptr() // never throws
|
||||||
{
|
{
|
||||||
checked_delete(ptr);
|
checked_delete(ptr);
|
||||||
@ -71,6 +85,20 @@ public:
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implicit conversion to "bool"
|
||||||
|
|
||||||
|
typedef T * (this_type::*unspecified_bool_type)() const;
|
||||||
|
|
||||||
|
operator unspecified_bool_type() const // never throws
|
||||||
|
{
|
||||||
|
return px == 0? 0: &this_type::get;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator! () const // never throws
|
||||||
|
{
|
||||||
|
return px == 0;
|
||||||
|
}
|
||||||
|
|
||||||
void swap(scoped_ptr & b) // never throws
|
void swap(scoped_ptr & b) // never throws
|
||||||
{
|
{
|
||||||
T * tmp = b.ptr;
|
T * tmp = b.ptr;
|
||||||
@ -84,6 +112,13 @@ template<typename T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b) // n
|
|||||||
a.swap(b);
|
a.swap(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get_pointer(p) is a generic way to say p.get()
|
||||||
|
|
||||||
|
template<typename T> inline T * get_pointer(scoped_ptr<T> const & p)
|
||||||
|
{
|
||||||
|
return p.get();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
|
#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
|
||||||
|
@ -92,6 +92,20 @@ public:
|
|||||||
return px;
|
return px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implicit conversion to "bool"
|
||||||
|
|
||||||
|
typedef T * (this_type::*unspecified_bool_type)() const;
|
||||||
|
|
||||||
|
operator unspecified_bool_type() const // never throws
|
||||||
|
{
|
||||||
|
return px == 0? 0: &this_type::get;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator! () const // never throws
|
||||||
|
{
|
||||||
|
return px == 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool unique() const // never throws
|
bool unique() const // never throws
|
||||||
{
|
{
|
||||||
return pn.unique();
|
return pn.unique();
|
||||||
|
@ -206,6 +206,20 @@ public:
|
|||||||
return px;
|
return px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implicit conversion to "bool"
|
||||||
|
|
||||||
|
typedef T * (this_type::*unspecified_bool_type)() const;
|
||||||
|
|
||||||
|
operator unspecified_bool_type() const // never throws
|
||||||
|
{
|
||||||
|
return px == 0? 0: &this_type::get;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator! () const // never throws
|
||||||
|
{
|
||||||
|
return px == 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool unique() const // never throws
|
bool unique() const // never throws
|
||||||
{
|
{
|
||||||
return pn.unique();
|
return pn.unique();
|
||||||
@ -216,20 +230,6 @@ public:
|
|||||||
return pn.use_count();
|
return pn.use_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
// implicit conversion to "bool"
|
|
||||||
|
|
||||||
typedef long (this_type::*bool_type)() const;
|
|
||||||
|
|
||||||
operator bool_type() const // never throws
|
|
||||||
{
|
|
||||||
return px == 0? 0: &this_type::use_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator! () const // never throws
|
|
||||||
{
|
|
||||||
return px == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void swap(shared_ptr<T> & other) // never throws
|
void swap(shared_ptr<T> & other) // never throws
|
||||||
{
|
{
|
||||||
std::swap(px, other.px);
|
std::swap(px, other.px);
|
||||||
|
Reference in New Issue
Block a user