From 547888d50736801d9b05971eb3d84a4fa3a5de07 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 17 Jul 2002 15:15:39 +0000 Subject: [PATCH] Consistent 'bool' conversions; scoped_ptr(auto_ptr); get_pointer(scoped_ptr) added. [SVN r14496] --- include/boost/scoped_array.hpp | 16 +++++++++++++++ include/boost/scoped_ptr.hpp | 37 +++++++++++++++++++++++++++++++++- include/boost/shared_array.hpp | 14 +++++++++++++ include/boost/shared_ptr.hpp | 28 ++++++++++++------------- 4 files changed, 80 insertions(+), 15 deletions(-) diff --git a/include/boost/scoped_array.hpp b/include/boost/scoped_array.hpp index 070925c..a62ba2b 100644 --- a/include/boost/scoped_array.hpp +++ b/include/boost/scoped_array.hpp @@ -33,6 +33,8 @@ private: scoped_array(scoped_array const &); scoped_array & operator=(scoped_array const &); + typedef scoped_array this_type; + public: typedef T element_type; @@ -67,6 +69,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_array & b) // never throws { T * tmp = b.ptr; diff --git a/include/boost/scoped_ptr.hpp b/include/boost/scoped_ptr.hpp index f452f7a..73737e9 100644 --- a/include/boost/scoped_ptr.hpp +++ b/include/boost/scoped_ptr.hpp @@ -15,6 +15,10 @@ #include #include +#ifndef BOOST_NO_AUTO_PTR +# include // for std::auto_ptr +#endif + namespace boost { @@ -27,11 +31,13 @@ template class scoped_ptr // noncopyable { private: - T* ptr; + T * ptr; scoped_ptr(scoped_ptr const &); scoped_ptr & operator=(scoped_ptr const &); + typedef scoped_ptr this_type; + public: typedef T element_type; @@ -40,6 +46,14 @@ public: { } +#ifndef BOOST_NO_AUTO_PTR + + explicit scoped_ptr(std::auto_ptr 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 inline void swap(scoped_ptr & a, scoped_ptr & b) // n a.swap(b); } +// get_pointer(p) is a generic way to say p.get() + +template inline T * get_pointer(scoped_ptr const & p) +{ + return p.get(); +} + } // namespace boost #endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED diff --git a/include/boost/shared_array.hpp b/include/boost/shared_array.hpp index a820abc..880992b 100644 --- a/include/boost/shared_array.hpp +++ b/include/boost/shared_array.hpp @@ -92,6 +92,20 @@ public: 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 { return pn.unique(); diff --git a/include/boost/shared_ptr.hpp b/include/boost/shared_ptr.hpp index 39df95f..28a6286 100644 --- a/include/boost/shared_ptr.hpp +++ b/include/boost/shared_ptr.hpp @@ -206,6 +206,20 @@ public: 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 { return pn.unique(); @@ -216,20 +230,6 @@ public: 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 & other) // never throws { std::swap(px, other.px);