Bläddra i källkod

ENH: Implemented auto_ptr_ref in a way that allows conversion of the pointed-to type.

Brad King 18 år sedan
förälder
incheckning
8c1f9e1b83
2 ändrade filer med 6 tillägg och 9 borttagningar
  1. 5 5
      Source/kwsys/auto_ptr.hxx.in
  2. 1 4
      Source/kwsys/testAutoPtr.cxx

+ 5 - 5
Source/kwsys/auto_ptr.hxx.in

@@ -26,14 +26,14 @@ namespace detail
 // a private namespace.
 template <class Y> struct auto_ptr_ref
 {
-  auto_ptr<Y>& p_;
+  Y* p_;
 
   // The extra constructor argument prevents implicit conversion to
   // auto_ptr_ref from auto_ptr through the constructor.  Normally
   // this should be done with the explicit keyword but Borland 5.x
   // generates code in the conversion operator to call itself
   // infinately.
-  auto_ptr_ref(auto_ptr<Y>& p, int): p_(p) {}
+  auto_ptr_ref(Y* p, int): p_(p) {}
 };
 }
 
@@ -136,7 +136,7 @@ public:
   /** Construct from an auto_ptr_ref.  This is used when the
       constructor argument is a call to a function returning an
       auto_ptr.  */
-  auto_ptr(detail::auto_ptr_ref<X> r) throw(): x_(r.p_.release())
+  auto_ptr(detail::auto_ptr_ref<X> r) throw(): x_(r.p_)
     {
     }
 
@@ -145,7 +145,7 @@ public:
       another auto_ptr.  */
   template <class Y> operator detail::auto_ptr_ref<Y>() throw()
     {
-    return detail::auto_ptr_ref<Y>(*this, 1);
+    return detail::auto_ptr_ref<Y>(this->release(), 1);
     }
 
   /** Convert to an auto_ptr holding an object of a compatible type.
@@ -160,7 +160,7 @@ public:
       assignment.  */
   auto_ptr& operator=(detail::auto_ptr_ref<X> r) throw()
     {
-    this->reset(r.p_.release());
+    this->reset(r.p_);
     return *this;
     }
 };

+ 1 - 4
Source/kwsys/testAutoPtr.cxx

@@ -123,6 +123,7 @@ int testAutoPtr(int, char*[])
     }
 
 #if 0
+    // Is this allowed by the standard?
     {
     int received = function_call(generate_auto_ptr_B());
     ASSERT(received,
@@ -144,22 +145,18 @@ int testAutoPtr(int, char*[])
       "auto_ptr empty after assignment from factory function");
     }
 
-#if 0
     {
     kwsys::auto_ptr<A> pa(generate_auto_ptr_B());
     ASSERT(pa.get(),
       "auto_ptr empty after construction from compatible factory function");
     }
-#endif
 
-#if 0
     {
     kwsys::auto_ptr<A> pa;
     pa = generate_auto_ptr_B();
     ASSERT(pa.get(),
       "auto_ptr empty after assignment from compatible factory function");
     }
-#endif
   }
 
   ASSERT(instances == 0, "auto_ptr leaked an object");