diff options
author | Brad King <brad.king@kitware.com> | 2007-03-03 20:05:52 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2007-03-03 20:05:52 (GMT) |
commit | 8c1f9e1b83c465f4072e541c9e2b1c2a69414d45 (patch) | |
tree | abe65eb0089ec80c85bc7d8db0752e46f89cfe5c | |
parent | ed722cbe619ae6a57ad264a7462314813da44bb3 (diff) | |
download | CMake-8c1f9e1b83c465f4072e541c9e2b1c2a69414d45.zip CMake-8c1f9e1b83c465f4072e541c9e2b1c2a69414d45.tar.gz CMake-8c1f9e1b83c465f4072e541c9e2b1c2a69414d45.tar.bz2 |
ENH: Implemented auto_ptr_ref in a way that allows conversion of the pointed-to type.
-rw-r--r-- | Source/kwsys/auto_ptr.hxx.in | 10 | ||||
-rw-r--r-- | Source/kwsys/testAutoPtr.cxx | 5 |
2 files changed, 6 insertions, 9 deletions
diff --git a/Source/kwsys/auto_ptr.hxx.in b/Source/kwsys/auto_ptr.hxx.in index 89a9de6..4306884 100644 --- a/Source/kwsys/auto_ptr.hxx.in +++ b/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; } }; diff --git a/Source/kwsys/testAutoPtr.cxx b/Source/kwsys/testAutoPtr.cxx index 5234428..aa44cb6 100644 --- a/Source/kwsys/testAutoPtr.cxx +++ b/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"); |