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