1951a39d68df598db08dfced8b4707755864a0492Ying Wang// auto_ptr implementation -*- C++ -*-
2951a39d68df598db08dfced8b4707755864a0492Ying Wang
343f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4951a39d68df598db08dfced8b4707755864a0492Ying Wang//
5951a39d68df598db08dfced8b4707755864a0492Ying Wang// This file is part of the GNU ISO C++ Library.  This library is free
6951a39d68df598db08dfced8b4707755864a0492Ying Wang// software; you can redistribute it and/or modify it under the
7951a39d68df598db08dfced8b4707755864a0492Ying Wang// terms of the GNU General Public License as published by the
8951a39d68df598db08dfced8b4707755864a0492Ying Wang// Free Software Foundation; either version 3, or (at your option)
9951a39d68df598db08dfced8b4707755864a0492Ying Wang// any later version.
10951a39d68df598db08dfced8b4707755864a0492Ying Wang
11951a39d68df598db08dfced8b4707755864a0492Ying Wang// This library is distributed in the hope that it will be useful,
12951a39d68df598db08dfced8b4707755864a0492Ying Wang// but WITHOUT ANY WARRANTY; without even the implied warranty of
13951a39d68df598db08dfced8b4707755864a0492Ying Wang// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14951a39d68df598db08dfced8b4707755864a0492Ying Wang// GNU General Public License for more details.
15951a39d68df598db08dfced8b4707755864a0492Ying Wang
16951a39d68df598db08dfced8b4707755864a0492Ying Wang// Under Section 7 of GPL version 3, you are granted additional
17951a39d68df598db08dfced8b4707755864a0492Ying Wang// permissions described in the GCC Runtime Library Exception, version
18951a39d68df598db08dfced8b4707755864a0492Ying Wang// 3.1, as published by the Free Software Foundation.
19951a39d68df598db08dfced8b4707755864a0492Ying Wang
20951a39d68df598db08dfced8b4707755864a0492Ying Wang// You should have received a copy of the GNU General Public License and
21951a39d68df598db08dfced8b4707755864a0492Ying Wang// a copy of the GCC Runtime Library Exception along with this program;
22951a39d68df598db08dfced8b4707755864a0492Ying Wang// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23951a39d68df598db08dfced8b4707755864a0492Ying Wang// <http://www.gnu.org/licenses/>.
24951a39d68df598db08dfced8b4707755864a0492Ying Wang
25951a39d68df598db08dfced8b4707755864a0492Ying Wang/** @file backward/auto_ptr.h
26951a39d68df598db08dfced8b4707755864a0492Ying Wang *  This is an internal header file, included by other library headers.
2743f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh *  Do not attempt to use it directly. @headername{memory}
28951a39d68df598db08dfced8b4707755864a0492Ying Wang */
29951a39d68df598db08dfced8b4707755864a0492Ying Wang
3043f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh#ifndef _BACKWARD_AUTO_PTR_H
3143f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh#define _BACKWARD_AUTO_PTR_H 1
32951a39d68df598db08dfced8b4707755864a0492Ying Wang
33951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <bits/c++config.h>
34951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <debug/debug.h>
35951a39d68df598db08dfced8b4707755864a0492Ying Wang
3643f272afd56a57640c62c952f9266478bacf0244Andrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default)
3743f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh{
3843f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION
39951a39d68df598db08dfced8b4707755864a0492Ying Wang
40951a39d68df598db08dfced8b4707755864a0492Ying Wang  /**
41951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  A wrapper class to provide auto_ptr with reference semantics.
42951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  For example, an auto_ptr can be assigned (or constructed from)
43951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  the result of a function which returns an auto_ptr by value.
44951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
45951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  All the auto_ptr_ref stuff should happen behind the scenes.
46951a39d68df598db08dfced8b4707755864a0492Ying Wang   */
47951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp1>
48951a39d68df598db08dfced8b4707755864a0492Ying Wang    struct auto_ptr_ref
49951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
50951a39d68df598db08dfced8b4707755864a0492Ying Wang      _Tp1* _M_ptr;
51951a39d68df598db08dfced8b4707755864a0492Ying Wang
52951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
53951a39d68df598db08dfced8b4707755864a0492Ying Wang      auto_ptr_ref(_Tp1* __p): _M_ptr(__p) { }
5443f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh    } _GLIBCXX_DEPRECATED;
55951a39d68df598db08dfced8b4707755864a0492Ying Wang
56951a39d68df598db08dfced8b4707755864a0492Ying Wang
57951a39d68df598db08dfced8b4707755864a0492Ying Wang  /**
58951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  @brief  A simple smart pointer providing strict ownership semantics.
59951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
60951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  The Standard says:
61951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  <pre>
62951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  An @c auto_ptr owns the object it holds a pointer to.  Copying
63951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  an @c auto_ptr copies the pointer and transfers ownership to the
64951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  destination.  If more than one @c auto_ptr owns the same object
65951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  at the same time the behavior of the program is undefined.
66951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
67951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  The uses of @c auto_ptr include providing temporary
68951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  exception-safety for dynamically allocated memory, passing
69951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  ownership of dynamically allocated memory to a function, and
70951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  returning dynamically allocated memory from a function.  @c
71951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  auto_ptr does not meet the CopyConstructible and Assignable
72951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  requirements for Standard Library <a
73951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  href="tables.html#65">container</a> elements and thus
74951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  instantiating a Standard Library container with an @c auto_ptr
75951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  results in undefined behavior.
76951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  </pre>
77951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  Quoted from [20.4.5]/3.
78951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
79951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  Good examples of what can and cannot be done with auto_ptr can
80951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  be found in the libstdc++ testsuite.
81951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
82951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  _GLIBCXX_RESOLVE_LIB_DEFECTS
83951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  127.  auto_ptr<> conversion issues
84951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  These resolutions have all been incorporated.
85951a39d68df598db08dfced8b4707755864a0492Ying Wang   */
86951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp>
87951a39d68df598db08dfced8b4707755864a0492Ying Wang    class auto_ptr
88951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
89951a39d68df598db08dfced8b4707755864a0492Ying Wang    private:
90951a39d68df598db08dfced8b4707755864a0492Ying Wang      _Tp* _M_ptr;
91951a39d68df598db08dfced8b4707755864a0492Ying Wang
92951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
93951a39d68df598db08dfced8b4707755864a0492Ying Wang      /// The pointed-to type.
94951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _Tp element_type;
95951a39d68df598db08dfced8b4707755864a0492Ying Wang
96951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
97951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  An %auto_ptr is usually constructed from a raw pointer.
98951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  p  A pointer (defaults to NULL).
99951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
100951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This object now @e owns the object pointed to by @a p.
101951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
102951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
103951a39d68df598db08dfced8b4707755864a0492Ying Wang      auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
104951a39d68df598db08dfced8b4707755864a0492Ying Wang
105951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
106951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  An %auto_ptr can be constructed from another %auto_ptr.
107951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  a  Another %auto_ptr of the same type.
108951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
109951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This object now @e owns the object previously owned by @a a,
110951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  which has given up ownership.
111951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
112951a39d68df598db08dfced8b4707755864a0492Ying Wang      auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }
113951a39d68df598db08dfced8b4707755864a0492Ying Wang
114951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
115951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  An %auto_ptr can be constructed from another %auto_ptr.
116951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  a  Another %auto_ptr of a different but related type.
117951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
118951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  A pointer-to-Tp1 must be convertible to a
119951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  pointer-to-Tp/element_type.
120951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
121951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This object now @e owns the object previously owned by @a a,
122951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  which has given up ownership.
123951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
124951a39d68df598db08dfced8b4707755864a0492Ying Wang      template<typename _Tp1>
125951a39d68df598db08dfced8b4707755864a0492Ying Wang        auto_ptr(auto_ptr<_Tp1>& __a) throw() : _M_ptr(__a.release()) { }
126951a39d68df598db08dfced8b4707755864a0492Ying Wang
127951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
128951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  %auto_ptr assignment operator.
129951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  a  Another %auto_ptr of the same type.
130951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
131951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This object now @e owns the object previously owned by @a a,
132951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  which has given up ownership.  The object that this one @e
133951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  used to own and track has been deleted.
134951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
135951a39d68df598db08dfced8b4707755864a0492Ying Wang      auto_ptr&
136951a39d68df598db08dfced8b4707755864a0492Ying Wang      operator=(auto_ptr& __a) throw()
137951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
138951a39d68df598db08dfced8b4707755864a0492Ying Wang	reset(__a.release());
139951a39d68df598db08dfced8b4707755864a0492Ying Wang	return *this;
140951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
141951a39d68df598db08dfced8b4707755864a0492Ying Wang
142951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
143951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  %auto_ptr assignment operator.
144951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  a  Another %auto_ptr of a different but related type.
145951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
146951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  A pointer-to-Tp1 must be convertible to a pointer-to-Tp/element_type.
147951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
148951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This object now @e owns the object previously owned by @a a,
149951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  which has given up ownership.  The object that this one @e
150951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  used to own and track has been deleted.
151951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
152951a39d68df598db08dfced8b4707755864a0492Ying Wang      template<typename _Tp1>
153951a39d68df598db08dfced8b4707755864a0492Ying Wang        auto_ptr&
154951a39d68df598db08dfced8b4707755864a0492Ying Wang        operator=(auto_ptr<_Tp1>& __a) throw()
155951a39d68df598db08dfced8b4707755864a0492Ying Wang        {
156951a39d68df598db08dfced8b4707755864a0492Ying Wang	  reset(__a.release());
157951a39d68df598db08dfced8b4707755864a0492Ying Wang	  return *this;
158951a39d68df598db08dfced8b4707755864a0492Ying Wang	}
159951a39d68df598db08dfced8b4707755864a0492Ying Wang
160951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
161951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  When the %auto_ptr goes out of scope, the object it owns is
162951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  deleted.  If it no longer owns anything (i.e., @c get() is
163951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @c NULL), then this has no effect.
164951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
165951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The C++ standard says there is supposed to be an empty throw
166951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  specification here, but omitting it is standard conforming.  Its
167951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  presence can be detected only if _Tp::~_Tp() throws, but this is
168951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  prohibited.  [17.4.3.6]/2
169951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
170951a39d68df598db08dfced8b4707755864a0492Ying Wang      ~auto_ptr() { delete _M_ptr; }
171951a39d68df598db08dfced8b4707755864a0492Ying Wang
172951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
173951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Smart pointer dereferencing.
174951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
175951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  If this %auto_ptr no longer owns anything, then this
17643f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh       *  operation will crash.  (For a smart pointer, <em>no longer owns
17743f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh       *  anything</em> is the same as being a null pointer, and you know
178951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  what happens when you dereference one of those...)
179951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
180951a39d68df598db08dfced8b4707755864a0492Ying Wang      element_type&
181951a39d68df598db08dfced8b4707755864a0492Ying Wang      operator*() const throw()
182951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
183951a39d68df598db08dfced8b4707755864a0492Ying Wang	_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
184951a39d68df598db08dfced8b4707755864a0492Ying Wang	return *_M_ptr;
185951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
186951a39d68df598db08dfced8b4707755864a0492Ying Wang
187951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
188951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Smart pointer dereferencing.
189951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
190951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This returns the pointer itself, which the language then will
191951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  automatically cause to be dereferenced.
192951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
193951a39d68df598db08dfced8b4707755864a0492Ying Wang      element_type*
194951a39d68df598db08dfced8b4707755864a0492Ying Wang      operator->() const throw()
195951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
196951a39d68df598db08dfced8b4707755864a0492Ying Wang	_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
197951a39d68df598db08dfced8b4707755864a0492Ying Wang	return _M_ptr;
198951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
199951a39d68df598db08dfced8b4707755864a0492Ying Wang
200951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
201951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Bypassing the smart pointer.
202951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @return  The raw pointer being managed.
203951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
204951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  You can get a copy of the pointer that this object owns, for
205951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  situations such as passing to a function which only accepts
206951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  a raw pointer.
207951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
208951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @note  This %auto_ptr still owns the memory.
209951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
210951a39d68df598db08dfced8b4707755864a0492Ying Wang      element_type*
211951a39d68df598db08dfced8b4707755864a0492Ying Wang      get() const throw() { return _M_ptr; }
212951a39d68df598db08dfced8b4707755864a0492Ying Wang
213951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
214951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Bypassing the smart pointer.
215951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @return  The raw pointer being managed.
216951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
217951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  You can get a copy of the pointer that this object owns, for
218951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  situations such as passing to a function which only accepts
219951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  a raw pointer.
220951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
221951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @note  This %auto_ptr no longer owns the memory.  When this object
222951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  goes out of scope, nothing will happen.
223951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
224951a39d68df598db08dfced8b4707755864a0492Ying Wang      element_type*
225951a39d68df598db08dfced8b4707755864a0492Ying Wang      release() throw()
226951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
227951a39d68df598db08dfced8b4707755864a0492Ying Wang	element_type* __tmp = _M_ptr;
228951a39d68df598db08dfced8b4707755864a0492Ying Wang	_M_ptr = 0;
229951a39d68df598db08dfced8b4707755864a0492Ying Wang	return __tmp;
230951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
231951a39d68df598db08dfced8b4707755864a0492Ying Wang
232951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
233951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Forcibly deletes the managed object.
234951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  p  A pointer (defaults to NULL).
235951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
236951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  This object now @e owns the object pointed to by @a p.  The
237951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  previous object has been deleted.
238951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
239951a39d68df598db08dfced8b4707755864a0492Ying Wang      void
240951a39d68df598db08dfced8b4707755864a0492Ying Wang      reset(element_type* __p = 0) throw()
241951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
242951a39d68df598db08dfced8b4707755864a0492Ying Wang	if (__p != _M_ptr)
243951a39d68df598db08dfced8b4707755864a0492Ying Wang	  {
244951a39d68df598db08dfced8b4707755864a0492Ying Wang	    delete _M_ptr;
245951a39d68df598db08dfced8b4707755864a0492Ying Wang	    _M_ptr = __p;
246951a39d68df598db08dfced8b4707755864a0492Ying Wang	  }
247951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
248951a39d68df598db08dfced8b4707755864a0492Ying Wang
249951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
250951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Automatic conversions
251951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
252951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  These operations convert an %auto_ptr into and from an auto_ptr_ref
253951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  automatically as needed.  This allows constructs such as
254951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @code
255951a39d68df598db08dfced8b4707755864a0492Ying Wang       *    auto_ptr<Derived>  func_returning_auto_ptr(.....);
256951a39d68df598db08dfced8b4707755864a0492Ying Wang       *    ...
257951a39d68df598db08dfced8b4707755864a0492Ying Wang       *    auto_ptr<Base> ptr = func_returning_auto_ptr(.....);
258951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @endcode
259951a39d68df598db08dfced8b4707755864a0492Ying Wang       */
260951a39d68df598db08dfced8b4707755864a0492Ying Wang      auto_ptr(auto_ptr_ref<element_type> __ref) throw()
261951a39d68df598db08dfced8b4707755864a0492Ying Wang      : _M_ptr(__ref._M_ptr) { }
262951a39d68df598db08dfced8b4707755864a0492Ying Wang
263951a39d68df598db08dfced8b4707755864a0492Ying Wang      auto_ptr&
264951a39d68df598db08dfced8b4707755864a0492Ying Wang      operator=(auto_ptr_ref<element_type> __ref) throw()
265951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
266951a39d68df598db08dfced8b4707755864a0492Ying Wang	if (__ref._M_ptr != this->get())
267951a39d68df598db08dfced8b4707755864a0492Ying Wang	  {
268951a39d68df598db08dfced8b4707755864a0492Ying Wang	    delete _M_ptr;
269951a39d68df598db08dfced8b4707755864a0492Ying Wang	    _M_ptr = __ref._M_ptr;
270951a39d68df598db08dfced8b4707755864a0492Ying Wang	  }
271951a39d68df598db08dfced8b4707755864a0492Ying Wang	return *this;
272951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
273951a39d68df598db08dfced8b4707755864a0492Ying Wang
274951a39d68df598db08dfced8b4707755864a0492Ying Wang      template<typename _Tp1>
275951a39d68df598db08dfced8b4707755864a0492Ying Wang        operator auto_ptr_ref<_Tp1>() throw()
276951a39d68df598db08dfced8b4707755864a0492Ying Wang        { return auto_ptr_ref<_Tp1>(this->release()); }
277951a39d68df598db08dfced8b4707755864a0492Ying Wang
278951a39d68df598db08dfced8b4707755864a0492Ying Wang      template<typename _Tp1>
279951a39d68df598db08dfced8b4707755864a0492Ying Wang        operator auto_ptr<_Tp1>() throw()
280951a39d68df598db08dfced8b4707755864a0492Ying Wang        { return auto_ptr<_Tp1>(this->release()); }
28143f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh    } _GLIBCXX_DEPRECATED;
282951a39d68df598db08dfced8b4707755864a0492Ying Wang
283951a39d68df598db08dfced8b4707755864a0492Ying Wang  // _GLIBCXX_RESOLVE_LIB_DEFECTS
284951a39d68df598db08dfced8b4707755864a0492Ying Wang  // 541. shared_ptr template assignment and void
285951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<>
286951a39d68df598db08dfced8b4707755864a0492Ying Wang    class auto_ptr<void>
287951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
288951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
289951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef void element_type;
29043f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh    } _GLIBCXX_DEPRECATED;
291951a39d68df598db08dfced8b4707755864a0492Ying Wang
29243f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION
29343f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh} // namespace
294951a39d68df598db08dfced8b4707755864a0492Ying Wang
29543f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh#endif /* _BACKWARD_AUTO_PTR_H */
296