]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/scoped_ptr.hpp
update boost
[lyx.git] / boost / boost / scoped_ptr.hpp
index f452f7a8a9d28c3fa6dadebbf5448332898196fa..738ad1be3ed967203b69d988b271495247c41f30 100644 (file)
 #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 ptr == 0? 0: &this_type::get;
+    }
+
+    bool operator! () const // never throws
+    {
+        return ptr == 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