1// shared_ptr and weak_ptr implementation -*- C++ -*-
2
3// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25//  shared_count.hpp
26//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
27
28//  shared_ptr.hpp
29//  Copyright (C) 1998, 1999 Greg Colvin and Beman Dawes.
30//  Copyright (C) 2001, 2002, 2003 Peter Dimov
31
32//  weak_ptr.hpp
33//  Copyright (C) 2001, 2002, 2003 Peter Dimov
34
35//  enable_shared_from_this.hpp
36//  Copyright (C) 2002 Peter Dimov
37
38// Distributed under the Boost Software License, Version 1.0. (See
39// accompanying file LICENSE_1_0.txt or copy at
40// http://www.boost.org/LICENSE_1_0.txt)
41
42// GCC Note:  based on version 1.32.0 of the Boost library.
43
44/** @file bits/shared_ptr.h
45 *  This is an internal header file, included by other library headers.
46 *  You should not attempt to use it directly.
47 */
48
49#ifndef _SHARED_PTR_H
50#define _SHARED_PTR_H 1
51
52#ifndef __GXX_EXPERIMENTAL_CXX0X__
53# include <c++0x_warning.h>
54#endif
55
56#if defined(_GLIBCXX_INCLUDE_AS_TR1)
57#  error C++0x header cannot be included from TR1 header
58#endif
59
60_GLIBCXX_BEGIN_NAMESPACE(std)
61
62  /**
63   * @addtogroup pointer_abstractions
64   * @{
65   */
66
67  // counted ptr with no deleter or allocator support
68  template<typename _Ptr, _Lock_policy _Lp>
69    class _Sp_counted_ptr
70    : public _Sp_counted_base<_Lp>
71    {
72    public:
73      _Sp_counted_ptr(_Ptr __p)
74      : _M_ptr(__p) { }
75
76      virtual void
77      _M_dispose() // nothrow
78      { delete _M_ptr; }
79
80      virtual void
81      _M_destroy() // nothrow
82      { delete this; }
83
84      virtual void*
85      _M_get_deleter(const std::type_info& __ti)
86      { return 0; }
87
88      _Sp_counted_ptr(const _Sp_counted_ptr&) = delete;
89      _Sp_counted_ptr& operator=(const _Sp_counted_ptr&) = delete;
90
91    protected:
92      _Ptr             _M_ptr;  // copy constructor must not throw
93    };
94
95  // support for custom deleter and/or allocator
96  template<typename _Ptr, typename _Deleter, typename _Alloc, _Lock_policy _Lp>
97    class _Sp_counted_deleter
98    : public _Sp_counted_ptr<_Ptr, _Lp>
99    {
100      typedef typename _Alloc::template
101          rebind<_Sp_counted_deleter>::other _My_alloc_type;
102
103      // Helper class that stores the Deleter and also acts as an allocator.
104      // Used to dispose of the owned pointer and the internal refcount
105      // Requires that copies of _Alloc can free each other's memory.
106      struct _My_Deleter
107      : public _My_alloc_type    // copy constructor must not throw
108      {
109        _Deleter _M_del;         // copy constructor must not throw
110        _My_Deleter(_Deleter __d, const _Alloc& __a)
111          : _My_alloc_type(__a), _M_del(__d) { }
112      };
113
114    protected:
115      typedef _Sp_counted_ptr<_Ptr, _Lp> _Base_type;
116
117    public:
118      /**
119       *  @brief
120       *  @pre     __d(__p) must not throw.
121       */
122      _Sp_counted_deleter(_Ptr __p, _Deleter __d)
123      : _Base_type(__p), _M_del(__d, _Alloc()) { }
124
125      /**
126       *  @brief
127       *  @pre     __d(__p) must not throw.
128       */
129      _Sp_counted_deleter(_Ptr __p, _Deleter __d, const _Alloc& __a)
130      : _Base_type(__p), _M_del(__d, __a) { }
131
132      virtual void
133      _M_dispose() // nothrow
134      { _M_del._M_del(_Base_type::_M_ptr); }
135
136      virtual void
137      _M_destroy() // nothrow
138      {
139        _My_alloc_type __a(_M_del);
140        this->~_Sp_counted_deleter();
141        __a.deallocate(this, 1);
142      }
143
144      virtual void*
145      _M_get_deleter(const std::type_info& __ti)
146      { return __ti == typeid(_Deleter) ? &_M_del._M_del : 0; }
147
148    protected:
149      _My_Deleter      _M_del;  // copy constructor must not throw
150    };
151
152  // helpers for make_shared / allocate_shared
153
154  template<typename _Tp>
155    struct _Sp_destroy_inplace
156    {
157      void operator()(_Tp* __p) const { if (__p) __p->~_Tp(); }
158    };
159
160  struct _Sp_make_shared_tag { };
161
162  template<typename _Tp, typename _Alloc, _Lock_policy _Lp>
163    class _Sp_counted_ptr_inplace
164    : public _Sp_counted_deleter<_Tp*, _Sp_destroy_inplace<_Tp>, _Alloc, _Lp>
165    {
166      typedef _Sp_counted_deleter<_Tp*, _Sp_destroy_inplace<_Tp>, _Alloc, _Lp>
167        _Base_type;
168
169    public:
170      _Sp_counted_ptr_inplace(_Alloc __a)
171      : _Base_type(static_cast<_Tp*>(0), _Sp_destroy_inplace<_Tp>(), __a)
172      , _M_storage()
173      {
174        void* __p = &_M_storage;
175        ::new (__p) _Tp();  // might throw
176        _Base_type::_Base_type::_M_ptr = static_cast<_Tp*>(__p);
177      }
178
179      template<typename... _Args>
180        _Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
181        : _Base_type(static_cast<_Tp*>(0), _Sp_destroy_inplace<_Tp>(), __a)
182        , _M_storage()
183        {
184          void* __p = &_M_storage;
185          ::new (__p) _Tp(std::forward<_Args>(__args)...);  // might throw
186          _Base_type::_Base_type::_M_ptr = static_cast<_Tp*>(__p);
187        }
188
189      // override because the allocator needs to know the dynamic type
190      virtual void
191      _M_destroy() // nothrow
192      {
193        typedef typename _Alloc::template
194            rebind<_Sp_counted_ptr_inplace>::other _My_alloc_type;
195        _My_alloc_type __a(_Base_type::_M_del);
196        this->~_Sp_counted_ptr_inplace();
197        __a.deallocate(this, 1);
198      }
199
200      // sneaky trick so __shared_ptr can get the managed pointer
201      virtual void*
202      _M_get_deleter(const std::type_info& __ti)
203      {
204        return __ti == typeid(_Sp_make_shared_tag)
205               ? static_cast<void*>(&_M_storage)
206               : _Base_type::_M_get_deleter(__ti);
207      }
208
209    private:
210      typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type
211        _M_storage;
212    };
213
214  template<_Lock_policy _Lp = __default_lock_policy>
215    class __weak_count;
216
217  template<_Lock_policy _Lp = __default_lock_policy>
218    class __shared_count
219    {
220    public:
221      __shared_count()
222      : _M_pi(0) // nothrow
223      { }
224
225      template<typename _Ptr>
226        __shared_count(_Ptr __p) : _M_pi(0)
227        {
228          __try
229            {
230              _M_pi = new _Sp_counted_ptr<_Ptr, _Lp>(__p);
231            }
232          __catch(...)
233            {
234              delete __p;
235              __throw_exception_again;
236            }
237        }
238
239      template<typename _Ptr, typename _Deleter>
240        __shared_count(_Ptr __p, _Deleter __d) : _M_pi(0)
241        {
242          // allocator's value_type doesn't matter, will rebind it anyway
243          typedef std::allocator<int> _Alloc;
244          typedef _Sp_counted_deleter<_Ptr, _Deleter, _Alloc, _Lp> _Sp_cd_type;
245          typedef std::allocator<_Sp_cd_type> _Alloc2;
246          _Alloc2 __a2;
247          __try
248            {
249              _M_pi = __a2.allocate(1);
250              ::new(static_cast<void*>(_M_pi)) _Sp_cd_type(__p, __d);
251            }
252          __catch(...)
253            {
254              __d(__p); // Call _Deleter on __p.
255              if (_M_pi)
256                __a2.deallocate(static_cast<_Sp_cd_type*>(_M_pi), 1);
257              __throw_exception_again;
258            }
259        }
260
261      template<typename _Ptr, typename _Deleter, typename _Alloc>
262        __shared_count(_Ptr __p, _Deleter __d, _Alloc __a) : _M_pi(0)
263        {
264          typedef _Sp_counted_deleter<_Ptr, _Deleter, _Alloc, _Lp> _Sp_cd_type;
265          typedef typename _Alloc::template rebind<_Sp_cd_type>::other _Alloc2;
266          _Alloc2 __a2(__a);
267          __try
268            {
269              _M_pi = __a2.allocate(1);
270              ::new(static_cast<void*>(_M_pi)) _Sp_cd_type(__p, __d, __a);
271            }
272          __catch(...)
273            {
274              __d(__p); // Call _Deleter on __p.
275              if (_M_pi)
276                __a2.deallocate(static_cast<_Sp_cd_type*>(_M_pi), 1);
277              __throw_exception_again;
278            }
279        }
280
281      template<typename _Tp, typename _Alloc, typename... _Args>
282        __shared_count(_Sp_make_shared_tag, _Tp*, _Alloc __a, _Args&&... __args)
283        : _M_pi(0)
284        {
285          typedef _Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp> _Sp_cp_type;
286          typedef typename _Alloc::template rebind<_Sp_cp_type>::other _Alloc2;
287          _Alloc2 __a2(__a);
288          __try
289            {
290              _M_pi = __a2.allocate(1);
291              ::new(static_cast<void*>(_M_pi)) _Sp_cp_type(__a,
292                    std::forward<_Args>(__args)...);
293            }
294          __catch(...)
295            {
296              if (_M_pi)
297        	__a2.deallocate(static_cast<_Sp_cp_type*>(_M_pi), 1);
298              __throw_exception_again;
299            }
300        }
301
302#if _GLIBCXX_DEPRECATED
303      // Special case for auto_ptr<_Tp> to provide the strong guarantee.
304      template<typename _Tp>
305        explicit
306        __shared_count(std::auto_ptr<_Tp>&& __r)
307        : _M_pi(new _Sp_counted_ptr<_Tp*, _Lp>(__r.get()))
308        { __r.release(); }
309#endif
310
311      // Special case for unique_ptr<_Tp,_Del> to provide the strong guarantee.
312      template<typename _Tp, typename _Del>
313        explicit
314        __shared_count(std::unique_ptr<_Tp, _Del>&& __r)
315        : _M_pi(_S_create_from_up(std::move(__r)))
316        { __r.release(); }
317
318      // Throw bad_weak_ptr when __r._M_get_use_count() == 0.
319      explicit
320      __shared_count(const __weak_count<_Lp>& __r);
321
322      ~__shared_count() // nothrow
323      {
324        if (_M_pi != 0)
325          _M_pi->_M_release();
326      }
327
328      __shared_count(const __shared_count& __r)
329      : _M_pi(__r._M_pi) // nothrow
330      {
331        if (_M_pi != 0)
332          _M_pi->_M_add_ref_copy();
333      }
334
335      __shared_count&
336      operator=(const __shared_count& __r) // nothrow
337      {
338        _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
339        if (__tmp != _M_pi)
340          {
341            if (__tmp != 0)
342              __tmp->_M_add_ref_copy();
343            if (_M_pi != 0)
344              _M_pi->_M_release();
345            _M_pi = __tmp;
346          }
347        return *this;
348      }
349
350      void
351      _M_swap(__shared_count& __r) // nothrow
352      {
353        _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
354        __r._M_pi = _M_pi;
355        _M_pi = __tmp;
356      }
357
358      long
359      _M_get_use_count() const // nothrow
360      { return _M_pi != 0 ? _M_pi->_M_get_use_count() : 0; }
361
362      bool
363      _M_unique() const // nothrow
364      { return this->_M_get_use_count() == 1; }
365
366      void*
367      _M_get_deleter(const std::type_info& __ti) const
368      { return _M_pi ? _M_pi->_M_get_deleter(__ti) : 0; }
369
370      bool
371      _M_less(const __shared_count& __rhs) const
372      { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
373
374      bool
375      _M_less(const __weak_count<_Lp>& __rhs) const
376      { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
377
378      // friend function injected into enclosing namespace and found by ADL
379      friend inline bool
380      operator==(const __shared_count& __a, const __shared_count& __b)
381      { return __a._M_pi == __b._M_pi; }
382
383    private:
384      friend class __weak_count<_Lp>;
385
386      template<typename _Tp, typename _Del>
387        static _Sp_counted_base<_Lp>*
388        _S_create_from_up(std::unique_ptr<_Tp, _Del>&& __r,
389          typename std::enable_if<!std::is_reference<_Del>::value>::type* = 0)
390        {
391          return new _Sp_counted_deleter<_Tp*, _Del, std::allocator<_Tp>,
392            _Lp>(__r.get(), __r.get_deleter());
393        }
394
395      template<typename _Tp, typename _Del>
396        static _Sp_counted_base<_Lp>*
397        _S_create_from_up(std::unique_ptr<_Tp, _Del>&& __r,
398          typename std::enable_if<std::is_reference<_Del>::value>::type* = 0)
399        {
400          typedef typename std::remove_reference<_Del>::type _Del1;
401          typedef std::reference_wrapper<_Del1> _Del2;
402          return new _Sp_counted_deleter<_Tp*, _Del2, std::allocator<_Tp>,
403            _Lp>(__r.get(), std::ref(__r.get_deleter()));
404        }
405
406      _Sp_counted_base<_Lp>*  _M_pi;
407    };
408
409
410  template<_Lock_policy _Lp>
411    class __weak_count
412    {
413    public:
414      __weak_count()
415      : _M_pi(0) // nothrow
416      { }
417
418      __weak_count(const __shared_count<_Lp>& __r)
419      : _M_pi(__r._M_pi) // nothrow
420      {
421	if (_M_pi != 0)
422	  _M_pi->_M_weak_add_ref();
423      }
424
425      __weak_count(const __weak_count<_Lp>& __r)
426      : _M_pi(__r._M_pi) // nothrow
427      {
428	if (_M_pi != 0)
429	  _M_pi->_M_weak_add_ref();
430      }
431
432      ~__weak_count() // nothrow
433      {
434	if (_M_pi != 0)
435	  _M_pi->_M_weak_release();
436      }
437
438      __weak_count<_Lp>&
439      operator=(const __shared_count<_Lp>& __r) // nothrow
440      {
441	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
442	if (__tmp != 0)
443	  __tmp->_M_weak_add_ref();
444	if (_M_pi != 0)
445	  _M_pi->_M_weak_release();
446	_M_pi = __tmp;
447	return *this;
448      }
449
450      __weak_count<_Lp>&
451      operator=(const __weak_count<_Lp>& __r) // nothrow
452      {
453	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
454	if (__tmp != 0)
455	  __tmp->_M_weak_add_ref();
456	if (_M_pi != 0)
457	  _M_pi->_M_weak_release();
458	_M_pi = __tmp;
459	return *this;
460      }
461
462      void
463      _M_swap(__weak_count<_Lp>& __r) // nothrow
464      {
465	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
466	__r._M_pi = _M_pi;
467	_M_pi = __tmp;
468      }
469
470      long
471      _M_get_use_count() const // nothrow
472      { return _M_pi != 0 ? _M_pi->_M_get_use_count() : 0; }
473
474      bool
475      _M_less(const __weak_count& __rhs) const
476      { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
477
478      bool
479      _M_less(const __shared_count<_Lp>& __rhs) const
480      { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
481
482      // friend function injected into enclosing namespace and found by ADL
483      friend inline bool
484      operator==(const __weak_count& __a, const __weak_count& __b)
485      { return __a._M_pi == __b._M_pi; }
486
487    private:
488      friend class __shared_count<_Lp>;
489
490      _Sp_counted_base<_Lp>*  _M_pi;
491    };
492
493  // now that __weak_count is defined we can define this constructor:
494  template<_Lock_policy _Lp>
495    inline
496    __shared_count<_Lp>::
497    __shared_count(const __weak_count<_Lp>& __r)
498    : _M_pi(__r._M_pi)
499    {
500      if (_M_pi != 0)
501	_M_pi->_M_add_ref_lock();
502      else
503	__throw_bad_weak_ptr();
504    }
505
506  // Forward declarations.
507  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
508    class __shared_ptr;
509
510  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
511    class __weak_ptr;
512
513  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
514    class __enable_shared_from_this;
515
516  template<typename _Tp>
517    class shared_ptr;
518
519  template<typename _Tp>
520    class weak_ptr;
521
522  template<typename _Tp>
523    class enable_shared_from_this;
524
525  // Support for enable_shared_from_this.
526
527  // Friend of __enable_shared_from_this.
528  template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>
529    void
530    __enable_shared_from_this_helper(const __shared_count<_Lp>&,
531				     const __enable_shared_from_this<_Tp1,
532				     _Lp>*, const _Tp2*);
533
534  // Friend of enable_shared_from_this.
535  template<typename _Tp1, typename _Tp2>
536    void
537    __enable_shared_from_this_helper(const __shared_count<>&,
538				     const enable_shared_from_this<_Tp1>*,
539				     const _Tp2*);
540
541  template<_Lock_policy _Lp>
542    inline void
543    __enable_shared_from_this_helper(const __shared_count<_Lp>&, ...)
544    { }
545
546
547  template<typename _Tp, _Lock_policy _Lp>
548    class __shared_ptr
549    {
550    public:
551      typedef _Tp   element_type;
552
553      /** @brief  Construct an empty %__shared_ptr.
554       *  @post   use_count()==0 && get()==0
555       */
556      __shared_ptr()
557      : _M_ptr(0), _M_refcount() // never throws
558      { }
559
560      /** @brief  Construct a %__shared_ptr that owns the pointer @a __p.
561       *  @param  __p  A pointer that is convertible to element_type*.
562       *  @post   use_count() == 1 && get() == __p
563       *  @throw  std::bad_alloc, in which case @c delete @a __p is called.
564       */
565      template<typename _Tp1>
566        explicit
567        __shared_ptr(_Tp1* __p)
568	: _M_ptr(__p), _M_refcount(__p)
569        {
570	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
571	  // __glibcxx_function_requires(_CompleteConcept<_Tp1*>)
572	  __enable_shared_from_this_helper(_M_refcount, __p, __p);
573	}
574
575      //
576      // Requirements: _Deleter's copy constructor and destructor must
577      // not throw
578      //
579      // __shared_ptr will release __p by calling __d(__p)
580      //
581      /** @brief  Construct a %__shared_ptr that owns the pointer @a __p
582       *          and the deleter @a __d.
583       *  @param  __p  A pointer.
584       *  @param  __d  A deleter.
585       *  @post   use_count() == 1 && get() == __p
586       *  @throw  std::bad_alloc, in which case @a __d(__p) is called.
587       */
588      template<typename _Tp1, typename _Deleter>
589        __shared_ptr(_Tp1* __p, _Deleter __d)
590        : _M_ptr(__p), _M_refcount(__p, __d)
591        {
592	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
593	  // TODO requires _Deleter CopyConstructible and __d(__p) well-formed
594	  __enable_shared_from_this_helper(_M_refcount, __p, __p);
595	}
596
597      //
598      // Requirements: _Deleter's copy constructor and destructor must
599      // not throw _Alloc's copy constructor and destructor must not
600      // throw.
601      //
602      // __shared_ptr will release __p by calling __d(__p)
603      //
604      /** @brief  Construct a %__shared_ptr that owns the pointer @a __p
605       *          and the deleter @a __d.
606       *  @param  __p  A pointer.
607       *  @param  __d  A deleter.
608       *  @param  __a  An allocator.
609       *  @post   use_count() == 1 && get() == __p
610       *  @throw  std::bad_alloc, in which case @a __d(__p) is called.
611       */
612      template<typename _Tp1, typename _Deleter, typename _Alloc>
613        __shared_ptr(_Tp1* __p, _Deleter __d, const _Alloc& __a)
614	: _M_ptr(__p), _M_refcount(__p, __d, __a)
615        {
616	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
617	  // TODO requires _Deleter CopyConstructible and __d(__p) well-formed
618	  __enable_shared_from_this_helper(_M_refcount, __p, __p);
619	}
620
621      /** @brief  Constructs a %__shared_ptr instance that stores @a __p
622       *          and shares ownership with @a __r.
623       *  @param  __r  A %__shared_ptr.
624       *  @param  __p  A pointer that will remain valid while @a *__r is valid.
625       *  @post   get() == __p && use_count() == __r.use_count()
626       *
627       *  This can be used to construct a @c shared_ptr to a sub-object
628       *  of an object managed by an existing @c shared_ptr.
629       *
630       * @code
631       * shared_ptr< pair<int,int> > pii(new pair<int,int>());
632       * shared_ptr<int> pi(pii, &pii->first);
633       * assert(pii.use_count() == 2);
634       * @endcode
635       */
636      template<typename _Tp1>
637        __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, _Tp* __p)
638	: _M_ptr(__p), _M_refcount(__r._M_refcount) // never throws
639        { }
640
641      //  generated copy constructor, assignment, destructor are fine.
642
643      /** @brief  If @a __r is empty, constructs an empty %__shared_ptr;
644       *          otherwise construct a %__shared_ptr that shares ownership
645       *          with @a __r.
646       *  @param  __r  A %__shared_ptr.
647       *  @post   get() == __r.get() && use_count() == __r.use_count()
648       */
649      template<typename _Tp1>
650        __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
651	: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
652        { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
653
654      /** @brief  Move-constructs a %__shared_ptr instance from @a __r.
655       *  @param  __r  A %__shared_ptr rvalue.
656       *  @post   *this contains the old value of @a __r, @a __r is empty.
657       */
658      __shared_ptr(__shared_ptr&& __r)
659      : _M_ptr(__r._M_ptr), _M_refcount() // never throws
660      {
661        _M_refcount._M_swap(__r._M_refcount);
662        __r._M_ptr = 0;
663      }
664
665      /** @brief  Move-constructs a %__shared_ptr instance from @a __r.
666       *  @param  __r  A %__shared_ptr rvalue.
667       *  @post   *this contains the old value of @a __r, @a __r is empty.
668       */
669      template<typename _Tp1>
670        __shared_ptr(__shared_ptr<_Tp1, _Lp>&& __r)
671	: _M_ptr(__r._M_ptr), _M_refcount() // never throws
672        {
673          __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
674          _M_refcount._M_swap(__r._M_refcount);
675          __r._M_ptr = 0;
676        }
677
678      /** @brief  Constructs a %__shared_ptr that shares ownership with @a __r
679       *          and stores a copy of the pointer stored in @a __r.
680       *  @param  __r  A weak_ptr.
681       *  @post   use_count() == __r.use_count()
682       *  @throw  bad_weak_ptr when __r.expired(),
683       *          in which case the constructor has no effect.
684       */
685      template<typename _Tp1>
686        explicit
687        __shared_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
688	: _M_refcount(__r._M_refcount) // may throw
689        {
690	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
691	  // It is now safe to copy __r._M_ptr, as _M_refcount(__r._M_refcount)
692	  // did not throw.
693	  _M_ptr = __r._M_ptr;
694	}
695
696      template<typename _Tp1, typename _Del>
697        explicit
698        __shared_ptr(const std::unique_ptr<_Tp1, _Del>&) = delete;
699
700      /**
701       * If an exception is thrown this constructor has no effect.
702       */
703      template<typename _Tp1, typename _Del>
704        explicit
705        __shared_ptr(std::unique_ptr<_Tp1, _Del>&& __r)
706	: _M_ptr(__r.get()), _M_refcount()
707        {
708	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
709	  _Tp1* __tmp = __r.get();
710	  _M_refcount = __shared_count<_Lp>(std::move(__r));
711	  __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
712	}
713
714#if _GLIBCXX_DEPRECATED
715      /**
716       * @post use_count() == 1 and __r.get() == 0
717       */
718      template<typename _Tp1>
719        explicit
720        __shared_ptr(std::auto_ptr<_Tp1>&& __r)
721	: _M_ptr(__r.get()), _M_refcount()
722        {
723	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
724	  // TODO requires _Tp1 is complete, delete __r.release() well-formed
725	  _Tp1* __tmp = __r.get();
726	  _M_refcount = __shared_count<_Lp>(std::move(__r));
727	  __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
728	}
729#endif
730
731      template<typename _Tp1>
732        __shared_ptr&
733        operator=(const __shared_ptr<_Tp1, _Lp>& __r) // never throws
734        {
735	  _M_ptr = __r._M_ptr;
736	  _M_refcount = __r._M_refcount; // __shared_count::op= doesn't throw
737	  return *this;
738	}
739
740#if _GLIBCXX_DEPRECATED
741      template<typename _Tp1>
742        __shared_ptr&
743        operator=(std::auto_ptr<_Tp1>&& __r)
744        {
745	  __shared_ptr(std::move(__r)).swap(*this);
746	  return *this;
747	}
748#endif
749
750      __shared_ptr&
751      operator=(__shared_ptr&& __r)
752      {
753        __shared_ptr(std::move(__r)).swap(*this);
754        return *this;
755      }
756
757      template<class _Tp1>
758        __shared_ptr&
759        operator=(__shared_ptr<_Tp1, _Lp>&& __r)
760        {
761          __shared_ptr(std::move(__r)).swap(*this);
762          return *this;
763        }
764
765      template<typename _Tp1, typename _Del>
766        __shared_ptr&
767        operator=(const std::unique_ptr<_Tp1, _Del>& __r) = delete;
768
769      template<typename _Tp1, typename _Del>
770        __shared_ptr&
771        operator=(std::unique_ptr<_Tp1, _Del>&& __r)
772        {
773	  __shared_ptr(std::move(__r)).swap(*this);
774	  return *this;
775        }
776
777      void
778      reset() // never throws
779      { __shared_ptr().swap(*this); }
780
781      template<typename _Tp1>
782        void
783        reset(_Tp1* __p) // _Tp1 must be complete.
784        {
785	  // Catch self-reset errors.
786	  _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr);
787	  __shared_ptr(__p).swap(*this);
788	}
789
790      template<typename _Tp1, typename _Deleter>
791        void
792        reset(_Tp1* __p, _Deleter __d)
793        { __shared_ptr(__p, __d).swap(*this); }
794
795      template<typename _Tp1, typename _Deleter, typename _Alloc>
796        void
797        reset(_Tp1* __p, _Deleter __d, const _Alloc& __a)
798        { __shared_ptr(__p, __d, __a).swap(*this); }
799
800      // Allow class instantiation when _Tp is [cv-qual] void.
801      typename std::add_lvalue_reference<_Tp>::type
802      operator*() const // never throws
803      {
804	_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
805	return *_M_ptr;
806      }
807
808      _Tp*
809      operator->() const // never throws
810      {
811	_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
812	return _M_ptr;
813      }
814
815      _Tp*
816      get() const // never throws
817      { return _M_ptr; }
818
819      // Implicit conversion to "bool"
820    private:
821      typedef _Tp* __shared_ptr::*__unspecified_bool_type;
822
823    public:
824      operator __unspecified_bool_type() const // never throws
825      { return _M_ptr == 0 ? 0 : &__shared_ptr::_M_ptr; }
826
827      bool
828      unique() const // never throws
829      { return _M_refcount._M_unique(); }
830
831      long
832      use_count() const // never throws
833      { return _M_refcount._M_get_use_count(); }
834
835      void
836      swap(__shared_ptr<_Tp, _Lp>&& __other) // never throws
837      {
838	std::swap(_M_ptr, __other._M_ptr);
839	_M_refcount._M_swap(__other._M_refcount);
840      }
841
842      template<typename _Tp1>
843        bool
844        owner_before(__shared_ptr<_Tp1, _Lp> const& __rhs) const
845        { return _M_refcount._M_less(__rhs._M_refcount); }
846
847      template<typename _Tp1>
848        bool
849        owner_before(__weak_ptr<_Tp1, _Lp> const& __rhs) const
850        { return _M_refcount._M_less(__rhs._M_refcount); }
851
852    protected:
853      // This constructor is non-standard, it is used by allocate_shared.
854      template<typename _Alloc, typename... _Args>
855        __shared_ptr(_Sp_make_shared_tag __tag, _Alloc __a, _Args&&... __args)
856        : _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
857				std::forward<_Args>(__args)...)
858        {
859          // _M_ptr needs to point to the newly constructed object.
860          // This relies on _Sp_counted_ptr_inplace::_M_get_deleter.
861          void* __p = _M_refcount._M_get_deleter(typeid(__tag));
862          _M_ptr = static_cast<_Tp*>(__p);
863	  __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
864        }
865
866      template<typename _Tp1, _Lock_policy _Lp1, typename _Alloc,
867               typename... _Args>
868        friend __shared_ptr<_Tp1, _Lp1>
869        __allocate_shared(_Alloc __a, _Args&&... __args);
870
871    private:
872      void*
873      _M_get_deleter(const std::type_info& __ti) const
874      { return _M_refcount._M_get_deleter(__ti); }
875
876      template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
877      template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
878
879      template<typename _Del, typename _Tp1, _Lock_policy _Lp1>
880        friend _Del* get_deleter(const __shared_ptr<_Tp1, _Lp1>&);
881
882      _Tp*         	   _M_ptr;         // Contained pointer.
883      __shared_count<_Lp>  _M_refcount;    // Reference counter.
884    };
885
886  // 20.8.13.2.7 shared_ptr comparisons
887  template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
888    inline bool
889    operator==(const __shared_ptr<_Tp1, _Lp>& __a,
890        const __shared_ptr<_Tp2, _Lp>& __b)
891    { return __a.get() == __b.get(); }
892
893  template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
894    inline bool
895    operator!=(const __shared_ptr<_Tp1, _Lp>& __a,
896        const __shared_ptr<_Tp2, _Lp>& __b)
897    { return __a.get() != __b.get(); }
898
899  template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
900    inline bool
901    operator<(const __shared_ptr<_Tp1, _Lp>& __a,
902        const __shared_ptr<_Tp2, _Lp>& __b)
903    { return __a.get() < __b.get(); }
904
905  template<typename _Sp>
906    struct _Sp_less : public binary_function<_Sp, _Sp, bool>
907    {
908      bool
909      operator()(const _Sp& __lhs, const _Sp& __rhs) const
910      {
911        return std::less<typename _Sp::element_type*>()(__lhs.get(),
912            __rhs.get());
913      }
914    };
915
916  template<typename _Tp, _Lock_policy _Lp>
917    struct less<__shared_ptr<_Tp, _Lp>>
918    : public _Sp_less<__shared_ptr<_Tp, _Lp>>
919    { };
920
921  // XXX LessThanComparable<_Tp> concept should provide >, >= and <=
922  template<typename _Tp, _Lock_policy _Lp>
923    inline bool
924    operator>(const __shared_ptr<_Tp, _Lp>& __a,
925        const __shared_ptr<_Tp, _Lp>& __b)
926    { return __a.get() > __b.get(); }
927
928  template<typename _Tp, _Lock_policy _Lp>
929    inline bool
930    operator>=(const __shared_ptr<_Tp, _Lp>& __a,
931        const __shared_ptr<_Tp, _Lp>& __b)
932    { return __a.get() >= __b.get(); }
933
934  template<typename _Tp, _Lock_policy _Lp>
935    inline bool
936    operator<=(const __shared_ptr<_Tp, _Lp>& __a,
937        const __shared_ptr<_Tp, _Lp>& __b)
938    { return __a.get() <= __b.get(); }
939
940  // 2.2.3.8 shared_ptr specialized algorithms.
941  template<typename _Tp, _Lock_policy _Lp>
942    inline void
943    swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b)
944    { __a.swap(__b); }
945
946  template<typename _Tp, _Lock_policy _Lp>
947    inline void
948    swap(__shared_ptr<_Tp, _Lp>&& __a, __shared_ptr<_Tp, _Lp>& __b)
949    { __a.swap(__b); }
950
951  template<typename _Tp, _Lock_policy _Lp>
952    inline void
953    swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>&& __b)
954    { __a.swap(__b); }
955
956  // 2.2.3.9 shared_ptr casts
957  /** @warning The seemingly equivalent
958   *           <code>shared_ptr<_Tp, _Lp>(static_cast<_Tp*>(__r.get()))</code>
959   *           will eventually result in undefined behaviour,
960   *           attempting to delete the same object twice.
961   */
962  template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
963    inline __shared_ptr<_Tp, _Lp>
964    static_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
965    { return __shared_ptr<_Tp, _Lp>(__r, static_cast<_Tp*>(__r.get())); }
966
967  /** @warning The seemingly equivalent
968   *           <code>shared_ptr<_Tp, _Lp>(const_cast<_Tp*>(__r.get()))</code>
969   *           will eventually result in undefined behaviour,
970   *           attempting to delete the same object twice.
971   */
972  template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
973    inline __shared_ptr<_Tp, _Lp>
974    const_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
975    { return __shared_ptr<_Tp, _Lp>(__r, const_cast<_Tp*>(__r.get())); }
976
977  /** @warning The seemingly equivalent
978   *           <code>shared_ptr<_Tp, _Lp>(dynamic_cast<_Tp*>(__r.get()))</code>
979   *           will eventually result in undefined behaviour,
980   *           attempting to delete the same object twice.
981   */
982  template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
983    inline __shared_ptr<_Tp, _Lp>
984    dynamic_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
985    {
986      if (_Tp* __p = dynamic_cast<_Tp*>(__r.get()))
987        return __shared_ptr<_Tp, _Lp>(__r, __p);
988      return __shared_ptr<_Tp, _Lp>();
989    }
990
991  // 2.2.3.7 shared_ptr I/O
992  template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy _Lp>
993    std::basic_ostream<_Ch, _Tr>&
994    operator<<(std::basic_ostream<_Ch, _Tr>& __os,
995	       const __shared_ptr<_Tp, _Lp>& __p)
996    {
997      __os << __p.get();
998      return __os;
999    }
1000
1001  // 2.2.3.10 shared_ptr get_deleter (experimental)
1002  template<typename _Del, typename _Tp, _Lock_policy _Lp>
1003    inline _Del*
1004    get_deleter(const __shared_ptr<_Tp, _Lp>& __p)
1005    { return static_cast<_Del*>(__p._M_get_deleter(typeid(_Del))); }
1006
1007
1008  template<typename _Tp, _Lock_policy _Lp>
1009    class __weak_ptr
1010    {
1011    public:
1012      typedef _Tp element_type;
1013
1014      __weak_ptr()
1015      : _M_ptr(0), _M_refcount() // never throws
1016      { }
1017
1018      // Generated copy constructor, assignment, destructor are fine.
1019
1020      // The "obvious" converting constructor implementation:
1021      //
1022      //  template<typename _Tp1>
1023      //    __weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
1024      //    : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
1025      //    { }
1026      //
1027      // has a serious problem.
1028      //
1029      //  __r._M_ptr may already have been invalidated. The _M_ptr(__r._M_ptr)
1030      //  conversion may require access to *__r._M_ptr (virtual inheritance).
1031      //
1032      // It is not possible to avoid spurious access violations since
1033      // in multithreaded programs __r._M_ptr may be invalidated at any point.
1034      template<typename _Tp1>
1035        __weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
1036	: _M_refcount(__r._M_refcount) // never throws
1037        {
1038	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
1039	  _M_ptr = __r.lock().get();
1040	}
1041
1042      template<typename _Tp1>
1043        __weak_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
1044	: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
1045        { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
1046
1047      template<typename _Tp1>
1048        __weak_ptr&
1049        operator=(const __weak_ptr<_Tp1, _Lp>& __r) // never throws
1050        {
1051	  _M_ptr = __r.lock().get();
1052	  _M_refcount = __r._M_refcount;
1053	  return *this;
1054	}
1055
1056      template<typename _Tp1>
1057        __weak_ptr&
1058        operator=(const __shared_ptr<_Tp1, _Lp>& __r) // never throws
1059        {
1060	  _M_ptr = __r._M_ptr;
1061	  _M_refcount = __r._M_refcount;
1062	  return *this;
1063	}
1064
1065      __shared_ptr<_Tp, _Lp>
1066      lock() const // never throws
1067      {
1068#ifdef __GTHREADS
1069	// Optimization: avoid throw overhead.
1070	if (expired())
1071	  return __shared_ptr<element_type, _Lp>();
1072
1073	__try
1074	  {
1075	    return __shared_ptr<element_type, _Lp>(*this);
1076	  }
1077	__catch(const bad_weak_ptr&)
1078	  {
1079	    // Q: How can we get here?
1080	    // A: Another thread may have invalidated r after the
1081	    //    use_count test above.
1082	    return __shared_ptr<element_type, _Lp>();
1083	  }
1084
1085#else
1086	// Optimization: avoid try/catch overhead when single threaded.
1087	return expired() ? __shared_ptr<element_type, _Lp>()
1088	                 : __shared_ptr<element_type, _Lp>(*this);
1089
1090#endif
1091      } // XXX MT
1092
1093      long
1094      use_count() const // never throws
1095      { return _M_refcount._M_get_use_count(); }
1096
1097      bool
1098      expired() const // never throws
1099      { return _M_refcount._M_get_use_count() == 0; }
1100
1101      template<typename _Tp1>
1102        bool
1103        owner_before(const __shared_ptr<_Tp1, _Lp>& __rhs) const
1104        { return _M_refcount._M_less(__rhs._M_refcount); }
1105
1106      template<typename _Tp1>
1107        bool
1108        owner_before(const __weak_ptr<_Tp1, _Lp>& __rhs) const
1109        { return _M_refcount._M_less(__rhs._M_refcount); }
1110
1111      void
1112      reset() // never throws
1113      { __weak_ptr().swap(*this); }
1114
1115      void
1116      swap(__weak_ptr& __s) // never throws
1117      {
1118	std::swap(_M_ptr, __s._M_ptr);
1119	_M_refcount._M_swap(__s._M_refcount);
1120      }
1121
1122      // comparisons
1123      template<typename _Tp1>
1124        bool operator<(const __weak_ptr<_Tp1, _Lp>&) const = delete;
1125      template<typename _Tp1>
1126        bool operator<=(const __weak_ptr<_Tp1, _Lp>&) const = delete;
1127      template<typename _Tp1>
1128        bool operator>(const __weak_ptr<_Tp1, _Lp>&) const = delete;
1129      template<typename _Tp1>
1130        bool operator>=(const __weak_ptr<_Tp1, _Lp>&) const = delete;
1131
1132    private:
1133      // Used by __enable_shared_from_this.
1134      void
1135      _M_assign(_Tp* __ptr, const __shared_count<_Lp>& __refcount)
1136      {
1137	_M_ptr = __ptr;
1138	_M_refcount = __refcount;
1139      }
1140
1141      template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
1142      template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
1143      friend class __enable_shared_from_this<_Tp, _Lp>;
1144      friend class enable_shared_from_this<_Tp>;
1145
1146      _Tp*       	 _M_ptr;         // Contained pointer.
1147      __weak_count<_Lp>  _M_refcount;    // Reference counter.
1148    };
1149
1150  // 20.8.13.3.7 weak_ptr specialized algorithms.
1151  template<typename _Tp, _Lock_policy _Lp>
1152    inline void
1153    swap(__weak_ptr<_Tp, _Lp>& __a, __weak_ptr<_Tp, _Lp>& __b)
1154    { __a.swap(__b); }
1155
1156  /// owner_less
1157  template<typename _Tp> struct owner_less;
1158
1159  template<typename _Tp, typename _Tp1>
1160    struct _Sp_owner_less : public binary_function<_Tp, _Tp, bool>
1161    {
1162      bool
1163      operator()(const _Tp& __lhs, const _Tp& __rhs) const
1164      { return __lhs.owner_before(__rhs); }
1165      bool
1166      operator()(const _Tp& __lhs, const _Tp1& __rhs) const
1167      { return __lhs.owner_before(__rhs); }
1168      bool
1169      operator()(const _Tp1& __lhs, const _Tp& __rhs) const
1170      { return __lhs.owner_before(__rhs); }
1171    };
1172
1173  template<typename _Tp, _Lock_policy _Lp>
1174    struct owner_less<__shared_ptr<_Tp, _Lp>>
1175    : public _Sp_owner_less<__shared_ptr<_Tp, _Lp>, __weak_ptr<_Tp, _Lp>>
1176    { };
1177
1178  template<typename _Tp, _Lock_policy _Lp>
1179    struct owner_less<__weak_ptr<_Tp, _Lp>>
1180    : public _Sp_owner_less<__weak_ptr<_Tp, _Lp>, __shared_ptr<_Tp, _Lp>>
1181    {
1182    };
1183
1184
1185  template<typename _Tp, _Lock_policy _Lp>
1186    class __enable_shared_from_this
1187    {
1188    protected:
1189      __enable_shared_from_this() { }
1190
1191      __enable_shared_from_this(const __enable_shared_from_this&) { }
1192
1193      __enable_shared_from_this&
1194      operator=(const __enable_shared_from_this&)
1195      { return *this; }
1196
1197      ~__enable_shared_from_this() { }
1198
1199    public:
1200      __shared_ptr<_Tp, _Lp>
1201      shared_from_this()
1202      { return __shared_ptr<_Tp, _Lp>(this->_M_weak_this); }
1203
1204      __shared_ptr<const _Tp, _Lp>
1205      shared_from_this() const
1206      { return __shared_ptr<const _Tp, _Lp>(this->_M_weak_this); }
1207
1208    private:
1209      template<typename _Tp1>
1210        void
1211        _M_weak_assign(_Tp1* __p, const __shared_count<_Lp>& __n) const
1212        { _M_weak_this._M_assign(__p, __n); }
1213
1214      template<typename _Tp1>
1215        friend void
1216        __enable_shared_from_this_helper(const __shared_count<_Lp>& __pn,
1217					 const __enable_shared_from_this* __pe,
1218					 const _Tp1* __px)
1219        {
1220	  if (__pe != 0)
1221	    __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
1222	}
1223
1224      mutable __weak_ptr<_Tp, _Lp>  _M_weak_this;
1225    };
1226
1227  /**
1228   *  @brief A smart pointer with reference-counted copy semantics.
1229   *
1230   *  The object pointed to is deleted when the last shared_ptr pointing to
1231   *  it is destroyed or reset.
1232   */
1233  template<typename _Tp>
1234    class shared_ptr
1235    : public __shared_ptr<_Tp>
1236    {
1237    public:
1238      shared_ptr()
1239      : __shared_ptr<_Tp>() { }
1240
1241      template<typename _Tp1>
1242        explicit
1243        shared_ptr(_Tp1* __p)
1244	: __shared_ptr<_Tp>(__p) { }
1245
1246      template<typename _Tp1, typename _Deleter>
1247        shared_ptr(_Tp1* __p, _Deleter __d)
1248	: __shared_ptr<_Tp>(__p, __d) { }
1249
1250      template<typename _Tp1, typename _Deleter, typename _Alloc>
1251        shared_ptr(_Tp1* __p, _Deleter __d, const _Alloc& __a)
1252	: __shared_ptr<_Tp>(__p, __d, __a) { }
1253
1254      // Aliasing constructor
1255      template<typename _Tp1>
1256        shared_ptr(const shared_ptr<_Tp1>& __r, _Tp* __p)
1257	: __shared_ptr<_Tp>(__r, __p) { }
1258
1259      template<typename _Tp1>
1260        shared_ptr(const shared_ptr<_Tp1>& __r)
1261	: __shared_ptr<_Tp>(__r) { }
1262
1263      shared_ptr(shared_ptr&& __r)
1264      : __shared_ptr<_Tp>(std::move(__r)) { }
1265
1266      template<typename _Tp1>
1267        shared_ptr(shared_ptr<_Tp1>&& __r)
1268        : __shared_ptr<_Tp>(std::move(__r)) { }
1269
1270      template<typename _Tp1>
1271        explicit
1272        shared_ptr(const weak_ptr<_Tp1>& __r)
1273	: __shared_ptr<_Tp>(__r) { }
1274
1275#if _GLIBCXX_DEPRECATED
1276      template<typename _Tp1>
1277        explicit
1278        shared_ptr(std::auto_ptr<_Tp1>&& __r)
1279	: __shared_ptr<_Tp>(std::move(__r)) { }
1280#endif
1281
1282      template<typename _Tp1, typename _Del>
1283        explicit
1284        shared_ptr(const std::unique_ptr<_Tp1, _Del>&) = delete;
1285
1286      template<typename _Tp1, typename _Del>
1287        explicit
1288        shared_ptr(std::unique_ptr<_Tp1, _Del>&& __r)
1289	: __shared_ptr<_Tp>(std::move(__r)) { }
1290
1291      template<typename _Tp1>
1292        shared_ptr&
1293        operator=(const shared_ptr<_Tp1>& __r) // never throws
1294        {
1295	  this->__shared_ptr<_Tp>::operator=(__r);
1296	  return *this;
1297	}
1298
1299#if _GLIBCXX_DEPRECATED
1300      template<typename _Tp1>
1301        shared_ptr&
1302        operator=(std::auto_ptr<_Tp1>&& __r)
1303        {
1304	  this->__shared_ptr<_Tp>::operator=(std::move(__r));
1305	  return *this;
1306	}
1307#endif
1308
1309      shared_ptr&
1310      operator=(shared_ptr&& __r)
1311      {
1312        this->__shared_ptr<_Tp>::operator=(std::move(__r));
1313        return *this;
1314      }
1315
1316      template<class _Tp1>
1317        shared_ptr&
1318        operator=(shared_ptr<_Tp1>&& __r)
1319        {
1320          this->__shared_ptr<_Tp>::operator=(std::move(__r));
1321          return *this;
1322        }
1323
1324      template<typename _Tp1, typename _Del>
1325        shared_ptr&
1326        operator=(const std::unique_ptr<_Tp1, _Del>& __r) = delete;
1327
1328      template<typename _Tp1, typename _Del>
1329        shared_ptr&
1330        operator=(std::unique_ptr<_Tp1, _Del>&& __r)
1331        {
1332	  this->__shared_ptr<_Tp>::operator=(std::move(__r));
1333	  return *this;
1334	}
1335
1336    private:
1337      // This constructor is non-standard, it is used by allocate_shared.
1338      template<typename _Alloc, typename... _Args>
1339        shared_ptr(_Sp_make_shared_tag __tag, _Alloc __a, _Args&&... __args)
1340        : __shared_ptr<_Tp>(__tag, __a, std::forward<_Args>(__args)...)
1341        { }
1342
1343      template<typename _Tp1, typename _Alloc, typename... _Args>
1344        friend shared_ptr<_Tp1>
1345        allocate_shared(_Alloc __a, _Args&&... __args);
1346    };
1347
1348  // 20.8.13.2.7 shared_ptr comparisons
1349  template<typename _Tp1, typename _Tp2>
1350    inline bool
1351    operator==(const shared_ptr<_Tp1>& __a, const shared_ptr<_Tp2>& __b)
1352    { return __a.get() == __b.get(); }
1353
1354  template<typename _Tp1, typename _Tp2>
1355    inline bool
1356    operator!=(const shared_ptr<_Tp1>& __a, const shared_ptr<_Tp2>& __b)
1357    { return __a.get() != __b.get(); }
1358
1359  template<typename _Tp1, typename _Tp2>
1360    inline bool
1361    operator<(const shared_ptr<_Tp1>& __a, const shared_ptr<_Tp2>& __b)
1362    { return __a.get() < __b.get(); }
1363
1364  template<typename _Tp>
1365    struct less<shared_ptr<_Tp>>
1366    : public _Sp_less<shared_ptr<_Tp>>
1367    { };
1368
1369  // 20.8.13.2.9 shared_ptr specialized algorithms.
1370  template<typename _Tp>
1371    inline void
1372    swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>& __b)
1373    { __a.swap(__b); }
1374
1375  template<typename _Tp>
1376    inline void
1377    swap(shared_ptr<_Tp>&& __a, shared_ptr<_Tp>& __b)
1378    { __a.swap(__b); }
1379
1380  template<typename _Tp>
1381    inline void
1382    swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>&& __b)
1383    { __a.swap(__b); }
1384
1385  // 20.8.13.2.10 shared_ptr casts.
1386  template<typename _Tp, typename _Tp1>
1387    inline shared_ptr<_Tp>
1388    static_pointer_cast(const shared_ptr<_Tp1>& __r)
1389    { return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); }
1390
1391  template<typename _Tp, typename _Tp1>
1392    inline shared_ptr<_Tp>
1393    const_pointer_cast(const shared_ptr<_Tp1>& __r)
1394    { return shared_ptr<_Tp>(__r, const_cast<_Tp*>(__r.get())); }
1395
1396  template<typename _Tp, typename _Tp1>
1397    inline shared_ptr<_Tp>
1398    dynamic_pointer_cast(const shared_ptr<_Tp1>& __r)
1399    {
1400      if (_Tp* __p = dynamic_cast<_Tp*>(__r.get()))
1401        return shared_ptr<_Tp>(__r, __p);
1402      return shared_ptr<_Tp>();
1403    }
1404
1405
1406  /**
1407   *  @brief A smart pointer with weak semantics.
1408   *
1409   *  With forwarding constructors and assignment operators.
1410   */
1411  template<typename _Tp>
1412    class weak_ptr
1413    : public __weak_ptr<_Tp>
1414    {
1415    public:
1416      weak_ptr()
1417      : __weak_ptr<_Tp>() { }
1418
1419      template<typename _Tp1>
1420        weak_ptr(const weak_ptr<_Tp1>& __r)
1421	: __weak_ptr<_Tp>(__r) { }
1422
1423      template<typename _Tp1>
1424        weak_ptr(const shared_ptr<_Tp1>& __r)
1425	: __weak_ptr<_Tp>(__r) { }
1426
1427      template<typename _Tp1>
1428        weak_ptr&
1429        operator=(const weak_ptr<_Tp1>& __r) // never throws
1430        {
1431	  this->__weak_ptr<_Tp>::operator=(__r);
1432	  return *this;
1433	}
1434
1435      template<typename _Tp1>
1436        weak_ptr&
1437        operator=(const shared_ptr<_Tp1>& __r) // never throws
1438        {
1439	  this->__weak_ptr<_Tp>::operator=(__r);
1440	  return *this;
1441	}
1442
1443      shared_ptr<_Tp>
1444      lock() const // never throws
1445      {
1446#ifdef __GTHREADS
1447	if (this->expired())
1448	  return shared_ptr<_Tp>();
1449
1450	__try
1451	  {
1452	    return shared_ptr<_Tp>(*this);
1453	  }
1454	__catch(const bad_weak_ptr&)
1455	  {
1456	    return shared_ptr<_Tp>();
1457	  }
1458#else
1459	return this->expired() ? shared_ptr<_Tp>()
1460	                       : shared_ptr<_Tp>(*this);
1461#endif
1462      }
1463
1464      // comparisons
1465      template<typename _Tp1>
1466        bool operator<(const weak_ptr<_Tp1>&) const = delete;
1467      template<typename _Tp1>
1468        bool operator<=(const weak_ptr<_Tp1>&) const = delete;
1469      template<typename _Tp1>
1470        bool operator>(const weak_ptr<_Tp1>&) const = delete;
1471      template<typename _Tp1>
1472        bool operator>=(const weak_ptr<_Tp1>&) const = delete;
1473    };
1474
1475  // 20.8.13.3.7 weak_ptr specialized algorithms.
1476  template<typename _Tp>
1477    inline void
1478    swap(weak_ptr<_Tp>& __a, weak_ptr<_Tp>& __b)
1479    { __a.swap(__b); }
1480
1481  /// owner_less
1482  template<typename _Tp>
1483    struct owner_less<shared_ptr<_Tp>>
1484    : public _Sp_owner_less<shared_ptr<_Tp>, weak_ptr<_Tp>>
1485    { };
1486
1487  template<typename _Tp>
1488    struct owner_less<weak_ptr<_Tp>>
1489    : public _Sp_owner_less<weak_ptr<_Tp>, shared_ptr<_Tp>>
1490    { };
1491
1492  /**
1493   *  @brief Base class allowing use of member function shared_from_this.
1494   */
1495  template<typename _Tp>
1496    class enable_shared_from_this
1497    {
1498    protected:
1499      enable_shared_from_this() { }
1500
1501      enable_shared_from_this(const enable_shared_from_this&) { }
1502
1503      enable_shared_from_this&
1504      operator=(const enable_shared_from_this&)
1505      { return *this; }
1506
1507      ~enable_shared_from_this() { }
1508
1509    public:
1510      shared_ptr<_Tp>
1511      shared_from_this()
1512      { return shared_ptr<_Tp>(this->_M_weak_this); }
1513
1514      shared_ptr<const _Tp>
1515      shared_from_this() const
1516      { return shared_ptr<const _Tp>(this->_M_weak_this); }
1517
1518    private:
1519      template<typename _Tp1>
1520        void
1521        _M_weak_assign(_Tp1* __p, const __shared_count<>& __n) const
1522        { _M_weak_this._M_assign(__p, __n); }
1523
1524      template<typename _Tp1>
1525        friend void
1526        __enable_shared_from_this_helper(const __shared_count<>& __pn,
1527					 const enable_shared_from_this* __pe,
1528					 const _Tp1* __px)
1529        {
1530	  if (__pe != 0)
1531	    __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
1532	}
1533
1534      mutable weak_ptr<_Tp>  _M_weak_this;
1535    };
1536
1537  template<typename _Tp, _Lock_policy _Lp, typename _Alloc, typename... _Args>
1538    inline __shared_ptr<_Tp, _Lp>
1539    __allocate_shared(_Alloc __a, _Args&&... __args)
1540    {
1541      return __shared_ptr<_Tp, _Lp>(_Sp_make_shared_tag(),
1542          std::forward<_Alloc>(__a), std::forward<_Args>(__args)...);
1543    }
1544
1545  template<typename _Tp, _Lock_policy _Lp, typename... _Args>
1546    inline __shared_ptr<_Tp, _Lp>
1547    __make_shared(_Args&&... __args)
1548    {
1549      typedef typename std::remove_const<_Tp>::type _Tp_nc;
1550      return __allocate_shared<_Tp, _Lp>(std::allocator<_Tp_nc>(),
1551              std::forward<_Args>(__args)...);
1552    }
1553
1554  /** @brief  Create an object that is owned by a shared_ptr.
1555   *  @param  __a     An allocator.
1556   *  @param  __args  Arguments for the @a _Tp object's constructor.
1557   *  @return A shared_ptr that owns the newly created object.
1558   *  @throw  An exception thrown from @a _Alloc::allocate or from the
1559   *          constructor of @a _Tp.
1560   *
1561   *  A copy of @a __a will be used to allocate memory for the shared_ptr
1562   *  and the new object.
1563   */
1564  template<typename _Tp, typename _Alloc, typename... _Args>
1565    inline shared_ptr<_Tp>
1566    allocate_shared(_Alloc __a, _Args&&... __args)
1567    {
1568      return shared_ptr<_Tp>(_Sp_make_shared_tag(), std::forward<_Alloc>(__a),
1569              std::forward<_Args>(__args)...);
1570    }
1571
1572  /** @brief  Create an object that is owned by a shared_ptr.
1573   *  @param  __args  Arguments for the @a _Tp object's constructor.
1574   *  @return A shared_ptr that owns the newly created object.
1575   *  @throw  std::bad_alloc, or an exception thrown from the
1576   *          constructor of @a _Tp.
1577   */
1578  template<typename _Tp, typename... _Args>
1579    inline shared_ptr<_Tp>
1580    make_shared(_Args&&... __args)
1581    {
1582      typedef typename std::remove_const<_Tp>::type _Tp_nc;
1583      return allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
1584              std::forward<_Args>(__args)...);
1585    }
1586
1587  // @} group pointer_abstractions
1588
1589_GLIBCXX_END_NAMESPACE
1590
1591#endif // _SHARED_PTR_H
1592