gcc50/csu: Skip depends step to avoid possible race
[dragonfly.git] / contrib / gcc-4.4 / libstdc++-v3 / include / bits / shared_ptr.h
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