Consistent 'bool' conversions; scoped_ptr(auto_ptr); get_pointer(scoped_ptr) added.

[SVN r14496]
This commit is contained in:
Peter Dimov committed 2002-07-17 15:15:39 +00:00
1 parent af6fe18c9d
commit 547888d507
4 files changed
+80 -15

No files matched your search

+36 -1
View File
@@ -15,6 +15,10 @@
#include <boost/assert.hpp>
#include <boost/checked_delete.hpp>
#ifndef BOOST_NO_AUTO_PTR
# include <memory> // for std::auto_ptr
#endif
namespace boost
{
@@ -27,11 +31,13 @@ template<typename T> class scoped_ptr // noncopyable
{
private:
T* ptr;
T * ptr;
scoped_ptr(scoped_ptr const &);
scoped_ptr & operator=(scoped_ptr const &);
typedef scoped_ptr<T> this_type;
public:
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
{
checked_delete(ptr);
@@ -71,6 +85,20 @@ public:
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
{
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);
}
// 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
#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED