OSDN Git Service

2006-09-22 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 22 Sep 2006 14:22:21 +0000 (14:22 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 22 Sep 2006 14:22:21 +0000 (14:22 +0000)
* include/tr1/boost_shared_ptr.h: Trivial formatting fixes.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117145 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/boost_shared_ptr.h

index 353b2b6..b10764c 100644 (file)
@@ -1,3 +1,7 @@
+2006-09-22  Paolo Carlini  <pcarlini@suse.de>
+
+       * include/tr1/boost_shared_ptr.h: Trivial formatting fixes.
+
 2006-09-21  Benjamin Kosnik  <bkoz@redhat.com>
 
        * include/ext/type_traits.h (__numeric_traits_integer): New.
index bc8028d..0363207 100644 (file)
@@ -58,1009 +58,1020 @@ namespace std
 {
 _GLIBCXX_BEGIN_NAMESPACE(tr1)
 
-class bad_weak_ptr : public std::exception
-{
-public:
-  virtual char const*
-  what() const throw() { return "tr1::bad_weak_ptr"; }
-};
+  class bad_weak_ptr : public std::exception
+  {
+  public:
+    virtual char const*
+    what() const throw()
+    { return "tr1::bad_weak_ptr"; }
+  };
 
   // Substitute for bad_weak_ptr object in the case of -fno-exceptions.
-inline void
-__throw_bad_weak_ptr()
-{
+  inline void
+  __throw_bad_weak_ptr()
+  {
 #if __EXCEPTIONS
-  throw bad_weak_ptr();
+    throw bad_weak_ptr();
 #else
-  std::abort();
+    std::abort();
 #endif
-}
-
-using __gnu_cxx::_Lock_policy;
-using __gnu_cxx::__default_lock_policy;
-using __gnu_cxx::_S_single;
-using __gnu_cxx::_S_mutex;
-using __gnu_cxx::_S_atomic;
+  }
 
-template<typename _Tp>
-  struct _Sp_deleter
-  {
-    typedef void result_type;
-    typedef _Tp* argument_type;
+  using __gnu_cxx::_Lock_policy;
+  using __gnu_cxx::__default_lock_policy;
+  using __gnu_cxx::_S_single;
+  using __gnu_cxx::_S_mutex;
+  using __gnu_cxx::_S_atomic;
 
-    void
-    operator()(_Tp* p) const
-    { delete p; }
-  };
+  template<typename _Tp>
+    struct _Sp_deleter
+    {
+      typedef void result_type;
+      typedef _Tp* argument_type;
 
-// Empty helper class except when the template argument is _S_mutex.
-template<_Lock_policy _Lp>
-  class _Mutex_base
-  { };
+      void
+      operator()(_Tp* p) const
+      { delete p; }
+    };
 
-template<>
-  class _Mutex_base<_S_mutex> : public __gnu_cxx::__mutex
-  { };
+  // Empty helper class except when the template argument is _S_mutex.
+  template<_Lock_policy _Lp>
+    class _Mutex_base
+    { };
 
+  template<>
+    class _Mutex_base<_S_mutex> : public __gnu_cxx::__mutex
+    { };
 
-template<_Lock_policy _Lp = __default_lock_policy>
-  class _Sp_counted_base : public _Mutex_base<_Lp>
-  {
-  public:  
-    _Sp_counted_base() : _M_use_count(1), _M_weak_count(1) { }
-  
-    virtual
-    ~_Sp_counted_base() // nothrow 
-    { }
-  
-    // Called when _M_use_count drops to zero, to release the resources
-    // managed by *this.
-    virtual void
-    dispose() = 0; // nothrow
-  
-    // Called when _M_weak_count drops to zero.
-    virtual void
-    destroy() // nothrow
-    { delete this; }
-  
-    virtual void*
-    get_deleter(const std::type_info&) = 0;
-  
-    void
-    add_ref_copy()
-    { __gnu_cxx::__atomic_add(&_M_use_count, 1); }
-  
-    void
-    add_ref_lock();
-  
-    void
-    release() // nothrow
+  template<_Lock_policy _Lp = __default_lock_policy>
+    class _Sp_counted_base : public _Mutex_base<_Lp>
     {
-      if (__gnu_cxx::__exchange_and_add(&_M_use_count, -1) == 1)
-        {
-          dispose();
-  #ifdef __GTHREADS    
-          _GLIBCXX_READ_MEM_BARRIER;
-          _GLIBCXX_WRITE_MEM_BARRIER;
-  #endif
-          if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
-            destroy();
-        }
-    }
+    public:  
+      _Sp_counted_base() : _M_use_count(1), _M_weak_count(1) { }
+      
+      virtual
+      ~_Sp_counted_base() // nothrow 
+      { }
   
-    void
-    weak_add_ref() // nothrow
-    { __gnu_cxx::__atomic_add(&_M_weak_count, 1); }
+      // Called when _M_use_count drops to zero, to release the resources
+      // managed by *this.
+      virtual void
+      dispose() = 0; // nothrow
+      
+      // Called when _M_weak_count drops to zero.
+      virtual void
+      destroy() // nothrow
+      { delete this; }
+      
+      virtual void*
+      get_deleter(const std::type_info&) = 0;
+      
+      void
+      add_ref_copy()
+      { __gnu_cxx::__atomic_add(&_M_use_count, 1); }
   
-    void
-    weak_release() // nothrow
-    {
-      if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
-        {
-#ifdef __GTHREADS
-          _GLIBCXX_READ_MEM_BARRIER;
-          _GLIBCXX_WRITE_MEM_BARRIER;
+      void
+      add_ref_lock();
+      
+      void
+      release() // nothrow
+      {
+       if (__gnu_cxx::__exchange_and_add(&_M_use_count, -1) == 1)
+         {
+           dispose();
+#ifdef __GTHREADS      
+           _GLIBCXX_READ_MEM_BARRIER;
+           _GLIBCXX_WRITE_MEM_BARRIER;
 #endif
-          destroy();
-        }
-    }
-  
-    long
-    use_count() const // nothrow
-    { return _M_use_count; }  // XXX is this MT safe? 
+           if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
+             destroy();
+         }
+      }
   
-  private:  
-    _Sp_counted_base(_Sp_counted_base const&);
-    _Sp_counted_base& operator=(_Sp_counted_base const&);
+      void
+      weak_add_ref() // nothrow
+      { __gnu_cxx::__atomic_add(&_M_weak_count, 1); }
   
-    _Atomic_word _M_use_count;        // #shared
-    _Atomic_word _M_weak_count;       // #weak + (#shared != 0)
-  };
-
-template<>
-  inline void
-  _Sp_counted_base<_S_single>::add_ref_lock()
-  {
-    if (__gnu_cxx::__exchange_and_add(&_M_use_count, 1) == 0)
+      void
+      weak_release() // nothrow
       {
-        _M_use_count = 0;
-        __throw_bad_weak_ptr();
+       if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
+         {
+#ifdef __GTHREADS
+           _GLIBCXX_READ_MEM_BARRIER;
+           _GLIBCXX_WRITE_MEM_BARRIER;
+#endif
+           destroy();
+         }
       }
-  }
+  
+      long
+      use_count() const // nothrow
+      { return _M_use_count; }  // XXX is this MT safe? 
+      
+    private:  
+      _Sp_counted_base(_Sp_counted_base const&);
+      _Sp_counted_base& operator=(_Sp_counted_base const&);
+      
+      _Atomic_word _M_use_count;        // #shared
+      _Atomic_word _M_weak_count;       // #weak + (#shared != 0)
+    };
+
+  template<>
+    inline void
+    _Sp_counted_base<_S_single>::add_ref_lock()
+    {
+      if (__gnu_cxx::__exchange_and_add(&_M_use_count, 1) == 0)
+       {
+         _M_use_count = 0;
+         __throw_bad_weak_ptr();
+       }
+    }
   
 #ifdef __GTHREADS
-template<>
-  inline void
-  _Sp_counted_base<_S_mutex>::add_ref_lock()
-  {
-    __gnu_cxx::__scoped_lock sentry(*this);
-    if (__gnu_cxx::__exchange_and_add(&_M_use_count, 1) == 0)
-      {
-        _M_use_count = 0;
-        __throw_bad_weak_ptr();
-      }
-  }
+  template<>
+    inline void
+    _Sp_counted_base<_S_mutex>::add_ref_lock()
+    {
+      __gnu_cxx::__scoped_lock sentry(*this);
+      if (__gnu_cxx::__exchange_and_add(&_M_use_count, 1) == 0)
+       {
+         _M_use_count = 0;
+         __throw_bad_weak_ptr();
+       }
+    }
 #endif
 
-template<> 
-  inline void
-  _Sp_counted_base<_S_atomic>::add_ref_lock()
-  {
-    // Perform lock-free add-if-not-zero operation.
-    _Atomic_word __count;
-    do
+  template<> 
+    inline void
+    _Sp_counted_base<_S_atomic>::add_ref_lock()
     {
-      __count = _M_use_count;
-      if (__count == 0)
-       __throw_bad_weak_ptr();
-
-      // Replace the current counter value with the old value + 1, as
-      // long as it's not changed meanwhile. 
+      // Perform lock-free add-if-not-zero operation.
+      _Atomic_word __count;
+      do
+       {
+         __count = _M_use_count;
+         if (__count == 0)
+           __throw_bad_weak_ptr();
+         
+         // Replace the current counter value with the old value + 1, as
+         // long as it's not changed meanwhile. 
+       }
+      while (!__sync_bool_compare_and_swap(&_M_use_count, __count,
+                                          __count + 1));
     }
-    while (!__sync_bool_compare_and_swap(&_M_use_count, __count, __count + 1));
-  }
 
-template<typename _Ptr, typename _Deleter, _Lock_policy _Lp>
-  class _Sp_counted_base_impl : public _Sp_counted_base<_Lp>
-  {
-  public:
-    /**
-     *  @brief   
-     *  @pre     d(p) must not throw.
-     */
-    _Sp_counted_base_impl(_Ptr __p, _Deleter __d)
-    : _M_ptr(__p), _M_del(__d) { }
-    
-    virtual void
-    dispose() // nothrow
-    { _M_del(_M_ptr); }
-    
-    virtual void*
-    get_deleter(const std::type_info& __ti)
-    { return __ti == typeid(_Deleter) ? &_M_del : 0; }
-    
-  private:
-    _Sp_counted_base_impl(const _Sp_counted_base_impl&);
-    _Sp_counted_base_impl& operator=(const _Sp_counted_base_impl&);
+  template<typename _Ptr, typename _Deleter, _Lock_policy _Lp>
+    class _Sp_counted_base_impl : public _Sp_counted_base<_Lp>
+    {
+    public:
+      /**
+       *  @brief   
+       *  @pre     d(p) must not throw.
+       */
+      _Sp_counted_base_impl(_Ptr __p, _Deleter __d)
+      : _M_ptr(__p), _M_del(__d) { }
     
-    _Ptr     _M_ptr; // copy constructor must not throw
-    _Deleter _M_del; // copy constructor must not throw
-  };
+      virtual void
+      dispose() // nothrow
+      { _M_del(_M_ptr); }
+      
+      virtual void*
+      get_deleter(const std::type_info& __ti)
+      { return __ti == typeid(_Deleter) ? &_M_del : 0; }
+      
+    private:
+      _Sp_counted_base_impl(const _Sp_counted_base_impl&);
+      _Sp_counted_base_impl& operator=(const _Sp_counted_base_impl&);
+      
+      _Ptr     _M_ptr; // copy constructor must not throw
+      _Deleter _M_del; // copy constructor must not throw
+    };
 
-template<_Lock_policy _Lp = __default_lock_policy>
-  class weak_count;
+  template<_Lock_policy _Lp = __default_lock_policy>
+    class weak_count;
 
-template<_Lock_policy _Lp = __default_lock_policy>
-  class shared_count
-  {
-  private:  
-    _Sp_counted_base<_Lp>* _M_pi;
-  
-    friend class weak_count<_Lp>;
-  
-  public:  
-    shared_count() : _M_pi(0) // nothrow
-    { }
-  
-    template<typename _Ptr, typename _Deleter>
-      shared_count(_Ptr __p, _Deleter __d) : _M_pi(0)
-      {
-        try
-          {
-            _M_pi = new _Sp_counted_base_impl<_Ptr, _Deleter, _Lp>(__p, __d);
-          }
-        catch(...)
-          {
-            __d(__p); // Call _Deleter on __p.
-            __throw_exception_again;
-          }
-      }
-  
-    // Special case for auto_ptr<_Tp> to provide the strong guarantee.
-    template<typename _Tp>
-      explicit shared_count(std::auto_ptr<_Tp>& __r)
-      : _M_pi(new _Sp_counted_base_impl<_Tp*,
-             _Sp_deleter<_Tp>, _Lp >(__r.get(), _Sp_deleter<_Tp>()))
-      { __r.release(); }
-  
-    // Throw bad_weak_ptr when __r.use_count() == 0.
-    explicit shared_count(const weak_count<_Lp>& __r);
-  
-    ~shared_count() // nothrow
-    {
-      if (_M_pi != 0)
-        _M_pi->release();
-    }
-  
-    shared_count(const shared_count& __r)
-    : _M_pi(__r._M_pi) // nothrow
-    {
-      if (_M_pi != 0)
-        _M_pi->add_ref_copy();
-    }
-  
-    shared_count&
-    operator=(const shared_count& __r) // nothrow
+  template<_Lock_policy _Lp = __default_lock_policy>
+    class shared_count
     {
-      _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
-      if (__tmp != _M_pi)
-        {
-          if (__tmp != 0)
-            __tmp->add_ref_copy();
-          if (_M_pi != 0)
-            _M_pi->release();
-          _M_pi = __tmp;
-        }
-      return *this;
-    }
+    private:  
+      _Sp_counted_base<_Lp>* _M_pi;
   
-    void swap(shared_count& __r) // nothrow
-    {
-      _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
-      __r._M_pi = _M_pi;
-      _M_pi = __tmp;
-    }
+      friend class weak_count<_Lp>;
   
-    long
-    use_count() const // nothrow
-    { return _M_pi != 0 ? _M_pi->use_count() : 0; }
+    public: 
+      shared_count() : _M_pi(0) // nothrow
+      { }
   
-    bool
-    unique() const // nothrow
-    { return this->use_count() == 1; }
+      template<typename _Ptr, typename _Deleter>
+        shared_count(_Ptr __p, _Deleter __d) : _M_pi(0)
+        {
+         try
+           {
+             _M_pi = new _Sp_counted_base_impl<_Ptr, _Deleter, _Lp>(__p, __d);
+           }
+         catch(...)
+           {
+             __d(__p); // Call _Deleter on __p.
+             __throw_exception_again;
+           }
+       }
+      
+      // Special case for auto_ptr<_Tp> to provide the strong guarantee.
+      template<typename _Tp>
+        explicit
+        shared_count(std::auto_ptr<_Tp>& __r)
+       : _M_pi(new _Sp_counted_base_impl<_Tp*,
+               _Sp_deleter<_Tp>, _Lp >(__r.get(), _Sp_deleter<_Tp>()))
+        { __r.release(); }
   
-    friend inline bool
-    operator==(const shared_count& __a, const shared_count& __b)
-    { return __a._M_pi == __b._M_pi; }
+      // Throw bad_weak_ptr when __r.use_count() == 0.
+      explicit shared_count(const weak_count<_Lp>& __r);
   
-    friend inline bool
-    operator<(const shared_count& __a, const shared_count& __b)
-    { return std::less<_Sp_counted_base<_Lp>*>()(__a._M_pi, __b._M_pi); }
+      ~shared_count() // nothrow
+      {
+       if (_M_pi != 0)
+         _M_pi->release();
+      }
+      
+      shared_count(const shared_count& __r)
+      : _M_pi(__r._M_pi) // nothrow
+      {
+       if (_M_pi != 0)
+         _M_pi->add_ref_copy();
+      }
   
-    void*
-    get_deleter(const std::type_info& __ti) const
-    { return _M_pi ? _M_pi->get_deleter(__ti) : 0; }
-  };
-
-template<_Lock_policy _Lp>
-  class weak_count
-  {
-  private:  
-    _Sp_counted_base<_Lp>* _M_pi;
+      shared_count&
+      operator=(const shared_count& __r) // nothrow
+      {
+       _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
+       if (__tmp != _M_pi)
+         {
+           if (__tmp != 0)
+             __tmp->add_ref_copy();
+           if (_M_pi != 0)
+             _M_pi->release();
+           _M_pi = __tmp;
+         }
+       return *this;
+      }
   
-    friend class shared_count<_Lp>;
+      void
+      swap(shared_count& __r) // nothrow
+      {
+       _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
+       __r._M_pi = _M_pi;
+       _M_pi = __tmp;
+      }
   
-  public:  
-    weak_count()
-    : _M_pi(0) // nothrow
-    { }
+      long
+      use_count() const // nothrow
+      { return _M_pi != 0 ? _M_pi->use_count() : 0; }
+      
+      bool
+      unique() const // nothrow
+      { return this->use_count() == 1; }
+      
+      friend inline bool
+      operator==(const shared_count& __a, const shared_count& __b)
+      { return __a._M_pi == __b._M_pi; }
   
-    weak_count(const shared_count<_Lp>& __r)
-    : _M_pi(__r._M_pi) // nothrow
-    {
-      if (_M_pi != 0)
-        _M_pi->weak_add_ref();
-    }
+      friend inline bool
+      operator<(const shared_count& __a, const shared_count& __b)
+      { return std::less<_Sp_counted_base<_Lp>*>()(__a._M_pi, __b._M_pi); }
   
-    weak_count(const weak_count<_Lp>& __r)
-    : _M_pi(__r._M_pi) // nothrow
+      void*
+      get_deleter(const std::type_info& __ti) const
+      { return _M_pi ? _M_pi->get_deleter(__ti) : 0; }
+    };
+
+  template<_Lock_policy _Lp>
+    class weak_count
     {
-      if (_M_pi != 0)
-        _M_pi->weak_add_ref();
-    }
+    private:  
+      _Sp_counted_base<_Lp>* _M_pi;
+      
+      friend class shared_count<_Lp>;
+      
+    public:  
+      weak_count()
+      : _M_pi(0) // nothrow
+      { }
   
-    ~weak_count() // nothrow
-    {
-      if (_M_pi != 0)
-        _M_pi->weak_release();
-    }
+      weak_count(const shared_count<_Lp>& __r)
+      : _M_pi(__r._M_pi) // nothrow
+      {
+       if (_M_pi != 0)
+         _M_pi->weak_add_ref();
+      }
+      
+      weak_count(const weak_count<_Lp>& __r)
+      : _M_pi(__r._M_pi) // nothrow
+      {
+       if (_M_pi != 0)
+         _M_pi->weak_add_ref();
+      }
+      
+      ~weak_count() // nothrow
+      {
+       if (_M_pi != 0)
+         _M_pi->weak_release();
+      }
+      
+      weak_count<_Lp>&
+      operator=(const shared_count<_Lp>& __r) // nothrow
+      {
+       _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
+       if (__tmp != 0)
+         __tmp->weak_add_ref();
+       if (_M_pi != 0)
+         _M_pi->weak_release();
+       _M_pi = __tmp;  
+       return *this;
+      }
+      
+      weak_count<_Lp>&
+      operator=(const weak_count<_Lp>& __r) // nothrow
+      {
+       _Sp_counted_base<_Lp> * __tmp = __r._M_pi;
+       if (__tmp != 0)
+         __tmp->weak_add_ref();
+       if (_M_pi != 0)
+         _M_pi->weak_release();
+       _M_pi = __tmp;
+       return *this;
+      }
   
-    weak_count<_Lp>&
-    operator=(const shared_count<_Lp>& __r) // nothrow
-    {
-      _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
-      if (__tmp != 0)
-        __tmp->weak_add_ref();
-      if (_M_pi != 0)
-        _M_pi->weak_release();
-      _M_pi = __tmp;  
-      return *this;
-    }
+      void
+      swap(weak_count<_Lp>& __r) // nothrow
+      {
+       _Sp_counted_base<_Lp> * __tmp = __r._M_pi;
+       __r._M_pi = _M_pi;
+       _M_pi = __tmp;
+      }
   
-    weak_count<_Lp>&
-    operator=(const weak_count<_Lp>& __r) // nothrow
+      long
+      use_count() const // nothrow
+      { return _M_pi != 0 ? _M_pi->use_count() : 0; }
+      
+      friend inline bool
+      operator==(const weak_count<_Lp>& __a, const weak_count<_Lp>& __b)
+      { return __a._M_pi == __b._M_pi; }
+      
+      friend inline bool
+      operator<(const weak_count<_Lp>& __a, const weak_count<_Lp>& __b)
+      { return std::less<_Sp_counted_base<_Lp>*>()(__a._M_pi, __b._M_pi); }
+    };
+
+  template<_Lock_policy _Lp>
+    inline
+    shared_count<_Lp>::
+    shared_count(const weak_count<_Lp>& __r)
+    : _M_pi(__r._M_pi)
     {
-      _Sp_counted_base<_Lp> * __tmp = __r._M_pi;
-      if (__tmp != 0)
-        __tmp->weak_add_ref();
       if (_M_pi != 0)
-        _M_pi->weak_release();
-      _M_pi = __tmp;
-      return *this;
-    }
-  
-    void
-    swap(weak_count<_Lp>& __r) // nothrow
-    {
-      _Sp_counted_base<_Lp> * __tmp = __r._M_pi;
-      __r._M_pi = _M_pi;
-      _M_pi = __tmp;
+       _M_pi->add_ref_lock();
+      else
+       __throw_bad_weak_ptr();
     }
   
-    long
-    use_count() const // nothrow
-    { return _M_pi != 0 ? _M_pi->use_count() : 0; }
-  
-    friend inline bool
-    operator==(const weak_count<_Lp>& __a, const weak_count<_Lp>& __b)
-    { return __a._M_pi == __b._M_pi; }
+
+  // Forward decls.
+  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
+    class __shared_ptr;
   
-    friend inline bool
-    operator<(const weak_count<_Lp>& __a, const weak_count<_Lp>& __b)
-    { return std::less<_Sp_counted_base<_Lp>*>()(__a._M_pi, __b._M_pi); }
-  };
+  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
+    class __weak_ptr;
 
-template<_Lock_policy _Lp>
-  inline
-  shared_count<_Lp>::shared_count(const weak_count<_Lp>& __r)
-  : _M_pi(__r._M_pi)
-  {
-    if (_M_pi != 0)
-      _M_pi->add_ref_lock();
-    else
-      __throw_bad_weak_ptr();
-  }
+  template<typename _Tp, _Lock_policy _Lp>
+    class __enable_shared_from_this;
 
+  struct __static_cast_tag { };
+  struct __const_cast_tag { };
+  struct __dynamic_cast_tag { };
+  struct __polymorphic_cast_tag { };
 
-// Forward decls.
-template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
-  class __shared_ptr;
+  template<class _Tp>
+    struct __shared_ptr_reference
+    { typedef _Tp& __type; };
 
-template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
-  class __weak_ptr;
+  template<>
+    struct __shared_ptr_reference<void>
+    { typedef void __type; };
 
-template<typename _Tp, _Lock_policy _Lp>
-  class __enable_shared_from_this;
+  template<>
+    struct __shared_ptr_reference<void const>
+    { typedef void __type; };
 
-struct __static_cast_tag { };
-struct __const_cast_tag { };
-struct __dynamic_cast_tag { };
-struct __polymorphic_cast_tag { };
+  template<>
+    struct __shared_ptr_reference<void volatile>
+    { typedef void __type; };
 
-template<class _Tp>
-  struct shared_ptr_traits
-  { typedef _Tp& reference; };
+  template<>
+    struct __shared_ptr_reference<void const volatile>
+    { typedef void __type; };
 
-template<>
-  struct shared_ptr_traits<void>
-  { typedef void reference; };
 
-template<>
-  struct shared_ptr_traits<void const>
-  { typedef void reference; };
+  // Support for enable_shared_from_this.
 
-template<>
-  struct shared_ptr_traits<void volatile>
-  { typedef void reference; };
+  // Friend of __enable_shared_from_this.
+  template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>
+    void
+    __enable_shared_from_this_helper(const shared_count<_Lp>&,
+                                    const __enable_shared_from_this<_Tp1,
+                                    _Lp>*, const _Tp2*);
 
-template<>
-  struct shared_ptr_traits<void const volatile>
-  { typedef void reference; };
+  template<_Lock_policy _Lp>
+    inline void
+    __enable_shared_from_this_helper(const shared_count<_Lp>&, ...)
+    { }
 
 
-// Support for enable_shared_from_this.
+  /**
+   *  @class shared_ptr <tr1/memory>
+   *
+   *  A smart pointer with reference-counted copy semantics.
+   *  The object pointed to is deleted when the last shared_ptr pointing to
+   *  it is destroyed or reset.
+   */
+  template<typename _Tp, _Lock_policy _Lp>
+    class __shared_ptr
+    {
+      typedef typename __shared_ptr_reference<_Tp>::__type _Reference;
 
-// Friend of __enable_shared_from_this.
-template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>
-  void
-  __enable_shared_from_this_helper(const shared_count<_Lp>&,
-                            const __enable_shared_from_this<_Tp1, _Lp>*,
-                            const _Tp2*);
+    public:
+      typedef _Tp   element_type;
+      
+      /** @brief  Construct an empty %__shared_ptr.
+       *  @post   use_count()==0 && get()==0
+       */
+      __shared_ptr()
+      : _M_ptr(0), _M_refcount() // never throws
+      { }
 
-template<_Lock_policy _Lp>
-  inline void
-  __enable_shared_from_this_helper(const shared_count<_Lp>&, ...)
-  { }
+      /** @brief  Construct a %__shared_ptr that owns the pointer @a p.
+       *  @param  p  A pointer that is convertible to element_type*.
+       *  @post   use_count() == 1 && get() == p
+       *  @throw  std::bad_alloc, in which case @c delete @a p is called.
+       */
+      template<typename _Tp1>
+        explicit
+        __shared_ptr(_Tp1* __p)
+       : _M_ptr(__p), _M_refcount(__p, _Sp_deleter<_Tp1>())
+        {
+         __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+         // __glibcxx_function_requires(_CompleteConcept<_Tp1*>)
+         __enable_shared_from_this_helper( _M_refcount, __p, __p );
+       }
 
+      //
+      // Requirements: D's copy constructor and destructor must not throw
+      //
+      // __shared_ptr will release p by calling d(p)
+      //
+      /** @brief  Construct a %__shared_ptr that owns the pointer @a p
+       *          and the deleter @a d.
+       *  @param  p  A pointer.
+       *  @param  d  A deleter.
+       *  @post   use_count() == 1 && get() == p
+       *  @throw  std::bad_alloc, in which case @a d(p) is called.
+       */
+      template<typename _Tp1, typename _Deleter>
+        __shared_ptr(_Tp1* __p, _Deleter __d)
+       : _M_ptr(__p), _M_refcount(__p, __d)
+        {
+         __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+         // TODO requires D is CopyConstructible and d(p) well-formed
+         __enable_shared_from_this_helper( _M_refcount, __p, __p );
+       }
+      
+      //  generated copy constructor, assignment, destructor are fine.
+      
+      /** @brief  If @a r is empty, constructs an empty %__shared_ptr;
+       *          otherwise construct a %__shared_ptr that shares ownership
+       *          with @a r.
+       *  @param  r  A %__shared_ptr.
+       *  @post   get() == r.get() && use_count() == r.use_count()
+       *  @throw  std::bad_alloc, in which case 
+       */
+      template<typename _Tp1>
+        __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
+       : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
+        { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
+
+      /** @brief  Constructs a %__shared_ptr that shares ownership with @a r
+       *          and stores a copy of the pointer stored in @a r.
+       *  @param  r  A weak_ptr.
+       *  @post   use_count() == r.use_count()
+       *  @throw  bad_weak_ptr when r.expired(),
+       *          in which case the constructor has no effect.
+       */
+      template<typename _Tp1>
+        explicit
+        __shared_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
+       : _M_refcount(__r._M_refcount) // may throw
+        {
+         __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+         // It is now safe to copy r__._M_ptr, as _M_refcount(__r._M_refcount)
+         // did not throw.
+         _M_ptr = __r._M_ptr;
+       }
 
-/**
- *  @class shared_ptr <tr1/memory>
- *
- *  A smart pointer with reference-counted copy semantics.
- *  The object pointed to is deleted when the last shared_ptr pointing to it
- *  is destroyed or reset.
- */
-template<typename _Tp, _Lock_policy _Lp>
-  class __shared_ptr
-  {
-    typedef typename shared_ptr_traits<_Tp>::reference _Reference;
+      /**
+       * @post use_count() == 1 and r.get() == 0
+       */
+      template<typename _Tp1>
+        explicit
+        __shared_ptr(std::auto_ptr<_Tp1>& __r)
+       : _M_ptr(__r.get()), _M_refcount()
+        {
+         // TODO requires r.release() convertible to _Tp*, Tp1 is complete,
+         // delete r.release() well-formed
+         _Tp1 * __tmp = __r.get();
+         _M_refcount = shared_count<_Lp>(__r);
+         __enable_shared_from_this_helper( _M_refcount, __tmp, __tmp );
+       }
 
-  public:
-    typedef _Tp   element_type;
+      template<typename _Tp1>
+        __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __static_cast_tag)
+       : _M_ptr(static_cast<element_type*>(__r._M_ptr)),
+         _M_refcount(__r._M_refcount)
+        { }
+
+      template<typename _Tp1>
+        __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __const_cast_tag)
+       : _M_ptr(const_cast<element_type*>(__r._M_ptr)),
+         _M_refcount(__r._M_refcount)
+        { }
+
+      template<typename _Tp1>
+        __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __dynamic_cast_tag)
+       : _M_ptr(dynamic_cast<element_type*>(__r._M_ptr)),
+         _M_refcount(__r._M_refcount)
+        {
+         if (_M_ptr == 0) // need to allocate new counter -- the cast failed
+           _M_refcount = shared_count<_Lp>();
+       }
+      
+      template<typename _Tp1>
+        __shared_ptr&
+        operator=(const __shared_ptr<_Tp1, _Lp>& __r) // never throws
+        {
+         _M_ptr = __r._M_ptr;
+         _M_refcount = __r._M_refcount; // shared_count::op= doesn't throw
+         return *this;
+       }
 
-    /** @brief  Construct an empty %__shared_ptr.
-     *  @post   use_count()==0 && get()==0
-     */
-    __shared_ptr()
-    : _M_ptr(0), _M_refcount() // never throws
-    { }
+      template<typename _Tp1>
+        __shared_ptr&
+        operator=(std::auto_ptr<_Tp1>& __r)
+        {
+         __shared_ptr(__r).swap(*this);
+         return *this;
+       }
 
-    /** @brief  Construct a %__shared_ptr that owns the pointer @a p.
-     *  @param  p  A pointer that is convertible to element_type*.
-     *  @post   use_count() == 1 && get() == p
-     *  @throw  std::bad_alloc, in which case @c delete @a p is called.
-     */
-    template<typename _Tp1>
-      explicit __shared_ptr(_Tp1* __p)
-      : _M_ptr(__p), _M_refcount(__p, _Sp_deleter<_Tp1>())
-      {
-        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
-        // __glibcxx_function_requires(_CompleteConcept<_Tp1*>)
-        __enable_shared_from_this_helper( _M_refcount, __p, __p );
-      }
+      void
+      reset() // never throws
+      { __shared_ptr().swap(*this); }
 
-    //
-    // Requirements: D's copy constructor and destructor must not throw
-    //
-    // __shared_ptr will release p by calling d(p)
-    //
-    /** @brief  Construct a %__shared_ptr that owns the pointer @a p
-     *          and the deleter @a d.
-     *  @param  p  A pointer.
-     *  @param  d  A deleter.
-     *  @post   use_count() == 1 && get() == p
-     *  @throw  std::bad_alloc, in which case @a d(p) is called.
-     */
-    template<typename _Tp1, typename _Deleter>
-      __shared_ptr(_Tp1* __p, _Deleter __d)
-      : _M_ptr(__p), _M_refcount(__p, __d)
-      {
-        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
-        // TODO requires D is CopyConstructible and d(p) well-formed
-        __enable_shared_from_this_helper( _M_refcount, __p, __p );
-      }
+      template<typename _Tp1>
+        void
+        reset(_Tp1* __p) // _Tp1 must be complete.
+        {
+         // Catch self-reset errors.
+         _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr); 
+         __shared_ptr(__p).swap(*this);
+       }
 
-    //  generated copy constructor, assignment, destructor are fine.
-
-    /** @brief  If @a r is empty, constructs an empty %__shared_ptr; otherwise
-     *          construct a %__shared_ptr that shares ownership with @a r.
-     *  @param  r  A %__shared_ptr.
-     *  @post   get() == r.get() && use_count() == r.use_count()
-     *  @throw  std::bad_alloc, in which case 
-     */
-    template<typename _Tp1>
-      __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
-      : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
-      { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
-
-    /** @brief  Constructs a %__shared_ptr that shares ownership with @a r
-     *          and stores a copy of the pointer stored in @a r.
-     *  @param  r  A weak_ptr.
-     *  @post   use_count() == r.use_count()
-     *  @throw  bad_weak_ptr when r.expired(),
-     *          in which case the constructor has no effect.
-     */
-    template<typename _Tp1>
-      explicit __shared_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
-      : _M_refcount(__r._M_refcount) // may throw
-      {
-        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
-        // It is now safe to copy r__._M_ptr, as _M_refcount(__r._M_refcount)
-        // did not throw.
-        _M_ptr = __r._M_ptr;
-      }
+      template<typename _Tp1, typename _Deleter>
+        void
+        reset(_Tp1 * __p, _Deleter __d)
+        { __shared_ptr(__p, __d).swap(*this); }
 
-    /**
-     * @post use_count() == 1 and r.get() == 0
-     */
-    template<typename _Tp1>
-      explicit __shared_ptr(std::auto_ptr<_Tp1>& __r)
-      : _M_ptr(__r.get()), _M_refcount()
+      // Error to instantiate if _Tp is [cv-qual] void.
+      _Reference
+      operator*() const // never throws
       {
-        // TODO requires r.release() convertible to _Tp*, Tp1 is complete,
-        // delete r.release() well-formed
-        _Tp1 * __tmp = __r.get();
-        _M_refcount = shared_count<_Lp>(__r);
-        __enable_shared_from_this_helper( _M_refcount, __tmp, __tmp );
+       _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
+       return *_M_ptr;
       }
 
-    template<typename _Tp1>
-      __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __static_cast_tag)
-      : _M_ptr(static_cast<element_type*>(__r._M_ptr)),
-       _M_refcount(__r._M_refcount)
-      { }
-
-    template<typename _Tp1>
-      __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __const_cast_tag)
-      : _M_ptr(const_cast<element_type*>(__r._M_ptr)),
-       _M_refcount(__r._M_refcount)
-      { }
-
-    template<typename _Tp1>
-      __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __dynamic_cast_tag)
-      : _M_ptr(dynamic_cast<element_type*>(__r._M_ptr)),
-       _M_refcount(__r._M_refcount)
+      _Tp*
+      operator->() const // never throws
       {
-        if (_M_ptr == 0) // need to allocate new counter -- the cast failed
-          _M_refcount = shared_count<_Lp>();
+       _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
+       return _M_ptr;
       }
+    
+      _Tp*
+      get() const // never throws
+      { return _M_ptr; }
 
-    template<typename _Tp1>
-      __shared_ptr&
-      operator=(const __shared_ptr<_Tp1, _Lp>& __r) // never throws
-      {
-        _M_ptr = __r._M_ptr;
-        _M_refcount = __r._M_refcount; // shared_count::op= doesn't throw
-        return *this;
-      }
+      // Implicit conversion to "bool"
+    private:
+      typedef _Tp* __shared_ptr::*__unspecified_bool_type;
 
-    template<typename _Tp1>
-      __shared_ptr&
-      operator=(std::auto_ptr<_Tp1>& __r)
-      {
-        __shared_ptr(__r).swap(*this);
-        return *this;
-      }
+    public:
+      operator __unspecified_bool_type() const // never throws
+      { return _M_ptr == 0 ? 0 : &__shared_ptr::_M_ptr; }
 
-    void
-    reset() // never throws
-    { __shared_ptr().swap(*this); }
+      bool
+      unique() const // never throws
+      { return _M_refcount.unique(); }
+
+      long
+      use_count() const // never throws
+      { return _M_refcount.use_count(); }
 
-    template<typename _Tp1>
       void
-      reset(_Tp1* __p) // _Tp1 must be complete.
+      swap(__shared_ptr<_Tp, _Lp>& __other) // never throws
       {
-       // Catch self-reset errors.
-        _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr); 
-        __shared_ptr(__p).swap(*this);
+       std::swap(_M_ptr, __other._M_ptr);
+       _M_refcount.swap(__other._M_refcount);
       }
 
-    template<typename _Tp1, typename _Deleter>
-      void
-      reset(_Tp1 * __p, _Deleter __d)
-      { __shared_ptr(__p, __d).swap(*this); }
-
-    // Error to instantiate if _Tp is [cv-qual] void.
-    _Reference
-    operator*() const // never throws
-    {
-      _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
-      return *_M_ptr;
-    }
-
-    _Tp*
-    operator->() const // never throws
+    private:
+      void*
+      _M_get_deleter(const std::type_info& __ti) const
+      { return _M_refcount.get_deleter(__ti); }
+
+      template<typename _Tp1, _Lock_policy _Lp1>
+        bool
+        _M_less(const __shared_ptr<_Tp1, _Lp1>& __rhs) const
+        { return _M_refcount < __rhs._M_refcount; }
+
+      template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
+      template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
+
+      template<typename _Del, typename _Tp1, _Lock_policy _Lp1>
+        friend _Del* get_deleter(const __shared_ptr<_Tp1, _Lp1>&);
+
+      // Friends injected into enclosing namespace and found by ADL:
+      template<typename _Tp1>
+        friend inline bool
+        operator==(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
+        { return __a.get() == __b.get(); }
+
+      template<typename _Tp1>
+        friend inline bool
+        operator!=(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
+        { return __a.get() != __b.get(); }
+
+      template<typename _Tp1>
+        friend inline bool
+        operator<(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
+        { return __a._M_less(__b); }
+
+      _Tp*                     _M_ptr;         // Contained pointer.
+      shared_count<_Lp>        _M_refcount;    // Reference counter.
+    };
+
+  // 2.2.3.8 shared_ptr specialized algorithms.
+  template<typename _Tp, _Lock_policy _Lp>
+    inline void
+    swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b)
+    { __a.swap(__b); }
+
+  // 2.2.3.9 shared_ptr casts
+  /** @warning The seemingly equivalent
+   *           <code>shared_ptr<T>(static_cast<T*>(r.get()))</code>
+   *           will eventually result in undefined behaviour,
+   *           attempting to delete the same object twice.
+   */
+  template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
+    __shared_ptr<_Tp, _Lp>
+    static_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
+    { return __shared_ptr<_Tp, _Lp>(__r, __static_cast_tag()); }
+
+  /** @warning The seemingly equivalent
+   *           <code>shared_ptr<T>(const_cast<T*>(r.get()))</code>
+   *           will eventually result in undefined behaviour,
+   *           attempting to delete the same object twice.
+   */
+  template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
+    __shared_ptr<_Tp, _Lp>
+    const_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
+    { return __shared_ptr<_Tp, _Lp>(__r, __const_cast_tag()); }
+
+  /** @warning The seemingly equivalent
+   *           <code>shared_ptr<T>(dynamic_cast<T*>(r.get()))</code>
+   *           will eventually result in undefined behaviour,
+   *           attempting to delete the same object twice.
+   */
+  template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
+    __shared_ptr<_Tp, _Lp>
+    dynamic_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
+    { return __shared_ptr<_Tp, _Lp>(__r, __dynamic_cast_tag()); }
+
+  // 2.2.3.7 shared_ptr I/O
+  template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy _Lp>
+    std::basic_ostream<_Ch, _Tr>&
+    operator<<(std::basic_ostream<_Ch, _Tr>& __os, 
+              const __shared_ptr<_Tp, _Lp>& __p)
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
-      return _M_ptr;
+      __os << __p.get();
+      return __os;
     }
-    
-    _Tp*
-    get() const // never throws
-    { return _M_ptr; }
-
-    // Implicit conversion to "bool"
-  private:
-    typedef _Tp* __shared_ptr::*__unspecified_bool_type;
-
-  public:
-    operator __unspecified_bool_type() const // never throws
-    { return _M_ptr == 0 ? 0 : &__shared_ptr::_M_ptr; }
 
-    bool
-    unique() const // never throws
-    { return _M_refcount.unique(); }
+  // 2.2.3.10 shared_ptr get_deleter (experimental)
+  template<typename _Del, typename _Tp, _Lock_policy _Lp>
+    inline _Del*
+    get_deleter(const __shared_ptr<_Tp, _Lp>& __p)
+    { return static_cast<_Del*>(__p._M_get_deleter(typeid(_Del))); }
 
-    long
-    use_count() const // never throws
-    { return _M_refcount.use_count(); }
 
-    void
-    swap(__shared_ptr<_Tp, _Lp>& __other) // never throws
+  template<typename _Tp, _Lock_policy _Lp>
+    class __weak_ptr
     {
-      std::swap(_M_ptr, __other._M_ptr);
-      _M_refcount.swap(__other._M_refcount);
-    }
-
-  private:
-    void*
-    _M_get_deleter(const std::type_info& __ti) const
-    { return _M_refcount.get_deleter(__ti); }
-
-    template<typename _Tp1, _Lock_policy _Lp1>
-      bool
-      _M_less(const __shared_ptr<_Tp1, _Lp1>& __rhs) const
-      { return _M_refcount < __rhs._M_refcount; }
-
-    template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
-    template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
-
-    template<typename _Del, typename _Tp1, _Lock_policy _Lp1>
-      friend _Del* get_deleter(const __shared_ptr<_Tp1, _Lp1>&);
-
-    // Friends injected into enclosing namespace and found by ADL:
-    template<typename _Tp1>
-      friend inline bool
-      operator==(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
-      { return __a.get() == __b.get(); }
-
-    template<typename _Tp1>
-      friend inline bool
-      operator!=(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
-      { return __a.get() != __b.get(); }
-
-    template<typename _Tp1>
-      friend inline bool
-      operator<(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
-      { return __a._M_less(__b); }
-
-    _Tp*               _M_ptr;         // Contained pointer.
-    shared_count<_Lp>  _M_refcount;    // Reference counter.
-  }; 
-
-// 2.2.3.8 shared_ptr specialized algorithms.
-template<typename _Tp, _Lock_policy _Lp>
-  inline void
-  swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b)
-  { __a.swap(__b); }
-
-// 2.2.3.9 shared_ptr casts
-/** @warning The seemingly equivalent
- *           <code>shared_ptr<T>(static_cast<T*>(r.get()))</code>
- *           will eventually result in undefined behaviour,
- *           attempting to delete the same object twice.
- */
-template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
-  __shared_ptr<_Tp, _Lp>
-  static_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
-  { return __shared_ptr<_Tp, _Lp>(__r, __static_cast_tag()); }
-
-/** @warning The seemingly equivalent
- *           <code>shared_ptr<T>(const_cast<T*>(r.get()))</code>
- *           will eventually result in undefined behaviour,
- *           attempting to delete the same object twice.
- */
-template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
-  __shared_ptr<_Tp, _Lp>
-  const_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
-  { return __shared_ptr<_Tp, _Lp>(__r, __const_cast_tag()); }
-
-/** @warning The seemingly equivalent
- *           <code>shared_ptr<T>(dynamic_cast<T*>(r.get()))</code>
- *           will eventually result in undefined behaviour,
- *           attempting to delete the same object twice.
- */
-template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
-  __shared_ptr<_Tp, _Lp>
-  dynamic_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
-  { return __shared_ptr<_Tp, _Lp>(__r, __dynamic_cast_tag()); }
-
-// 2.2.3.7 shared_ptr I/O
-template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy _Lp>
-  std::basic_ostream<_Ch, _Tr>&
-  operator<<(std::basic_ostream<_Ch, _Tr>& __os, 
-            const __shared_ptr<_Tp, _Lp>& __p)
-  {
-    __os << __p.get();
-    return __os;
-  }
-
-// 2.2.3.10 shared_ptr get_deleter (experimental)
-template<typename _Del, typename _Tp, _Lock_policy _Lp>
-  inline _Del*
-  get_deleter(const __shared_ptr<_Tp, _Lp>& __p)
-  { return static_cast<_Del*>(__p._M_get_deleter(typeid(_Del))); }
-
-
-template<typename _Tp, _Lock_policy _Lp>
-  class __weak_ptr
-  {
-  public:
-    typedef _Tp element_type;
-
-    __weak_ptr() : _M_ptr(0), _M_refcount() // never throws
-    { }
+    public:
+      typedef _Tp element_type;
+      
+      __weak_ptr() : _M_ptr(0), _M_refcount() // never throws
+      { }
 
-    // Generated copy constructor, assignment, destructor are fine.
-
-    // The "obvious" converting constructor implementation:
-    //
-    //  template<class Y>
-    //    __weak_ptr(__weak_ptr<Y> const & r)
-    //    : _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
-    //    { }
-    //
-    // has a serious problem.
-    //
-    //  r._M_ptr may already have been invalidated. The _M_ptr(r._M_ptr)
-    //  conversion may require access to *r._M_ptr (virtual inheritance).
-    //
-    // It is not possible to avoid spurious access violations since
-    // in multithreaded programs r._M_ptr may be invalidated at any point.
-    template<typename _Tp1>
-      __weak_ptr(const __weak_ptr<_Tp1, _Lp>& r)
-      : _M_refcount(r._M_refcount) // never throws
-      {
-        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
-        _M_ptr = r.lock().get();
-      }
+      // Generated copy constructor, assignment, destructor are fine.
+      
+      // The "obvious" converting constructor implementation:
+      //
+      //  template<class Y>
+      //    __weak_ptr(__weak_ptr<Y> const & r)
+      //    : _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
+      //    { }
+      //
+      // has a serious problem.
+      //
+      //  r._M_ptr may already have been invalidated. The _M_ptr(r._M_ptr)
+      //  conversion may require access to *r._M_ptr (virtual inheritance).
+      //
+      // It is not possible to avoid spurious access violations since
+      // in multithreaded programs r._M_ptr may be invalidated at any point.
+      template<typename _Tp1>
+        __weak_ptr(const __weak_ptr<_Tp1, _Lp>& r)
+       : _M_refcount(r._M_refcount) // never throws
+        {
+         __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+           _M_ptr = r.lock().get();
+       }
 
-    template<typename _Tp1>
-      __weak_ptr(const __shared_ptr<_Tp1, _Lp>& r)
-      : _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
-      { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
+      template<typename _Tp1>
+        __weak_ptr(const __shared_ptr<_Tp1, _Lp>& r)
+       : _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
+        { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
 
-    template<typename _Tp1>
-      __weak_ptr&
-      operator=(const __weak_ptr<_Tp1, _Lp>& r) // never throws
-      {
-        _M_ptr = r.lock().get();
-        _M_refcount = r._M_refcount;
-        return *this;
-      }
+      template<typename _Tp1>
+        __weak_ptr&
+        operator=(const __weak_ptr<_Tp1, _Lp>& r) // never throws
+        {
+         _M_ptr = r.lock().get();
+         _M_refcount = r._M_refcount;
+         return *this;
+       }
+      
+      template<typename _Tp1>
+        __weak_ptr&
+        operator=(const __shared_ptr<_Tp1, _Lp>& r) // never throws
+        {
+         _M_ptr = r._M_ptr;
+         _M_refcount = r._M_refcount;
+         return *this;
+       }
 
-    template<typename _Tp1>
-      __weak_ptr&
-      operator=(const __shared_ptr<_Tp1, _Lp>& r) // never throws
+      __shared_ptr<_Tp, _Lp>
+      lock() const // never throws
       {
-        _M_ptr = r._M_ptr;
-        _M_refcount = r._M_refcount;
-        return *this;
-      }
-
-    __shared_ptr<_Tp, _Lp>
-    lock() const // never throws
-    {
 #ifdef __GTHREADS
-      // Optimization: avoid throw overhead.
-      if (expired())
-       return __shared_ptr<element_type, _Lp>();
+       // Optimization: avoid throw overhead.
+       if (expired())
+         return __shared_ptr<element_type, _Lp>();
       
-      try
-       {
-         return __shared_ptr<element_type, _Lp>(*this);
-       }
-      catch (const bad_weak_ptr&)
-       {
-         // Q: How can we get here?
-         // A: Another thread may have invalidated r after the
-         //    use_count test above.
-         return __shared_ptr<element_type>();
-       }
-
+       try
+         {
+           return __shared_ptr<element_type, _Lp>(*this);
+         }
+       catch (const bad_weak_ptr&)
+         {
+           // Q: How can we get here?
+           // A: Another thread may have invalidated r after the
+           //    use_count test above.
+           return __shared_ptr<element_type>();
+         }
+       
 #else
-      // Optimization: avoid try/catch overhead when single threaded.
-      return expired() ? __shared_ptr<element_type, _Lp>()
-                      : __shared_ptr<element_type, _Lp>(*this);
+       // Optimization: avoid try/catch overhead when single threaded.
+       return expired() ? __shared_ptr<element_type, _Lp>()
+                        : __shared_ptr<element_type, _Lp>(*this);
 
 #endif
-    } // XXX MT
-
-    long
-    use_count() const // never throws
-    { return _M_refcount.use_count(); }
-
-    bool
-    expired() const // never throws
-    { return _M_refcount.use_count() == 0; }
+      } // XXX MT
 
-    void
-    reset() // never throws
-    { __weak_ptr().swap(*this); }
-
-    void
-    swap(__weak_ptr& __s) // never throws
-    {
-      std::swap(_M_ptr, __s._M_ptr);
-      _M_refcount.swap(__s._M_refcount);
-    }
+      long
+      use_count() const // never throws
+      { return _M_refcount.use_count(); }
 
-  private:
-    template<typename _Tp1>
       bool
-      _M_less(const __weak_ptr<_Tp1, _Lp>& __rhs) const
-      { return _M_refcount < __rhs._M_refcount; }
-
-    // Used by __enable_shared_from_this.
-    void
-    _M_assign(_Tp* __ptr, const shared_count<_Lp>& __refcount)
-    {
-      _M_ptr = __ptr;
-      _M_refcount = __refcount;
-    }
-
-    // Friend injected into namespace and found by ADL.
-    template<typename _Tp1>
-      friend inline bool
-      operator<(const __weak_ptr& __lhs, const __weak_ptr<_Tp1, _Lp>& __rhs)
-      { return __lhs._M_less(__rhs); }
-
-    template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
-    template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
-    friend class __enable_shared_from_this<_Tp, _Lp>;
-
-    _Tp*                       _M_ptr;           // Contained pointer.
-    weak_count<_Lp>    _M_refcount;      // Reference counter.
-  };  
-
-// 2.2.4.7 weak_ptr specialized algorithms.
-template<typename _Tp, _Lock_policy _Lp>
-  void
-  swap(__weak_ptr<_Tp, _Lp>& __a, __weak_ptr<_Tp, _Lp>& __b)
-  { __a.swap(__b); }
+      expired() const // never throws
+      { return _M_refcount.use_count() == 0; }
+      
+      void
+      reset() // never throws
+      { __weak_ptr().swap(*this); }
 
+      void
+      swap(__weak_ptr& __s) // never throws
+      {
+       std::swap(_M_ptr, __s._M_ptr);
+       _M_refcount.swap(__s._M_refcount);
+      }
 
-template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
-  class __enable_shared_from_this
-  {
-  protected:
-    __enable_shared_from_this() { }
+    private:
+      template<typename _Tp1>
+        bool
+        _M_less(const __weak_ptr<_Tp1, _Lp>& __rhs) const
+        { return _M_refcount < __rhs._M_refcount; }
 
-    __enable_shared_from_this(const __enable_shared_from_this&) { }
+      // Used by __enable_shared_from_this.
+      void
+      _M_assign(_Tp* __ptr, const shared_count<_Lp>& __refcount)
+      {
+       _M_ptr = __ptr;
+       _M_refcount = __refcount;
+      }
 
-    __enable_shared_from_this&
-    operator=(const __enable_shared_from_this&)
-    { return *this; }
+      // Friend injected into namespace and found by ADL.
+      template<typename _Tp1>
+        friend inline bool
+        operator<(const __weak_ptr& __lhs, const __weak_ptr<_Tp1, _Lp>& __rhs)
+        { return __lhs._M_less(__rhs); }
+      
+      template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
+      template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
+      friend class __enable_shared_from_this<_Tp, _Lp>;
+      
+      _Tp*                     _M_ptr;           // Contained pointer.
+      weak_count<_Lp>          _M_refcount;      // Reference counter.
+    };
 
-    ~__enable_shared_from_this() { }
+  // 2.2.4.7 weak_ptr specialized algorithms.
+  template<typename _Tp, _Lock_policy _Lp>
+    void
+    swap(__weak_ptr<_Tp, _Lp>& __a, __weak_ptr<_Tp, _Lp>& __b)
+    { __a.swap(__b); }
 
-  public:
-    __shared_ptr<_Tp, _Lp>
-    shared_from_this()
-    {
-      __shared_ptr<_Tp, _Lp> __p(this->_M_weak_this);
-      return __p;
-    }
 
-    __shared_ptr<const _Tp, _Lp>
-    shared_from_this() const
+  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
+    class __enable_shared_from_this
     {
-      __shared_ptr<const _Tp, _Lp> __p(this->_M_weak_this);
-      return __p;
-    }
+    protected:
+      __enable_shared_from_this() { }
+      
+      __enable_shared_from_this(const __enable_shared_from_this&) { }
+      
+      __enable_shared_from_this&
+      operator=(const __enable_shared_from_this&)
+      { return *this; }
 
-  private:
-    template<typename _Tp1>
-      void
-      _M_weak_assign(_Tp1* __p, const shared_count<_Lp>& __n) const
-      { _M_weak_this._M_assign(__p, __n); }
-
-    template<typename _Tp1>
-      friend void
-      __enable_shared_from_this_helper(const shared_count<_Lp>& __pn,
-                                      const __enable_shared_from_this* __pe,
-                                      const _Tp1* __px)
+      ~__enable_shared_from_this() { }
+      
+    public:
+      __shared_ptr<_Tp, _Lp>
+      shared_from_this()
       {
-        if (__pe != 0)
-          __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
+       __shared_ptr<_Tp, _Lp> __p(this->_M_weak_this);
+       return __p;
       }
+      
+      __shared_ptr<const _Tp, _Lp>
+      shared_from_this() const
+      {
+       __shared_ptr<const _Tp, _Lp> __p(this->_M_weak_this);
+       return __p;
+      }
+      
+    private:
+      template<typename _Tp1>
+        void
+        _M_weak_assign(_Tp1* __p, const shared_count<_Lp>& __n) const
+        { _M_weak_this._M_assign(__p, __n); }
+
+      template<typename _Tp1>
+        friend void
+        __enable_shared_from_this_helper(const shared_count<_Lp>& __pn,
+                                        const __enable_shared_from_this* __pe,
+                                        const _Tp1* __px)
+        {
+         if (__pe != 0)
+           __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
+       }
+      
+      mutable __weak_ptr<_Tp, _Lp> _M_weak_this;
+    };
 
-    mutable __weak_ptr<_Tp, _Lp> _M_weak_this;
-  };
-
-template<typename _Tp>
-  class shared_ptr;
+  template<typename _Tp>
+    class shared_ptr;
 
-// The actual TR1 weak_ptr, with forwarding constructors and
-// assignment operators.
-template<typename _Tp>
-  class weak_ptr : public __weak_ptr<_Tp>
-  {
-  public:
-    weak_ptr() : __weak_ptr<_Tp>() { }
-  
-    template<typename _Tp1>
-      weak_ptr(const __weak_ptr<_Tp1>& r) : __weak_ptr<_Tp>(r) { }
+  // The actual TR1 weak_ptr, with forwarding constructors and
+  // assignment operators.
+  template<typename _Tp>
+    class weak_ptr : public __weak_ptr<_Tp>
+    {
+    public:
+      weak_ptr() : __weak_ptr<_Tp>() { }
+      
+      template<typename _Tp1>
+        weak_ptr(const __weak_ptr<_Tp1>& r) : __weak_ptr<_Tp>(r) { }
     
-    template<typename _Tp1>
-      weak_ptr(const __shared_ptr<_Tp1>& r) : __weak_ptr<_Tp>(r) { }
+      template<typename _Tp1>
+        weak_ptr(const __shared_ptr<_Tp1>& r) : __weak_ptr<_Tp>(r) { }
 
-    template<typename _Tp1>
-      weak_ptr&
-      operator=(const weak_ptr<_Tp1>& r) // never throws
-      {
-        this->__weak_ptr<_Tp>::operator=(r);
-        return *this;
-      }
+      template<typename _Tp1>
+        weak_ptr&
+        operator=(const weak_ptr<_Tp1>& r) // never throws
+        {
+         this->__weak_ptr<_Tp>::operator=(r);
+         return *this;
+       }
 
-    template<typename _Tp1>
-      weak_ptr&
-      operator=(const shared_ptr<_Tp1>& r) // never throws
-      {
-        this->__weak_ptr<_Tp>::operator=(r);
-        return *this;
-      }
-  };
+      template<typename _Tp1>
+        weak_ptr&
+        operator=(const shared_ptr<_Tp1>& r) // never throws
+        {
+         this->__weak_ptr<_Tp>::operator=(r);
+         return *this;
+       }
+    };
 
-// The actual TR1 shared_ptr, with forwarding constructors and
-// assignment operators.
-template<typename _Tp>
-  class shared_ptr : public __shared_ptr<_Tp>
-  {
-  public:
-    shared_ptr() : __shared_ptr<_Tp>() { }
-    
-    template<typename _Tp1>
-      explicit shared_ptr(_Tp1* __p)
-      : __shared_ptr<_Tp>(__p) { }
+  // The actual TR1 shared_ptr, with forwarding constructors and
+  // assignment operators.
+  template<typename _Tp>
+    class shared_ptr : public __shared_ptr<_Tp>
+    {
+    public:
+      shared_ptr() : __shared_ptr<_Tp>() { }
+      
+      template<typename _Tp1>
+        explicit
+        shared_ptr(_Tp1* __p)
+       : __shared_ptr<_Tp>(__p) { }
     
-    template<typename _Tp1, typename _Deleter>
-      shared_ptr(_Tp1* __p, _Deleter __d)
-      : __shared_ptr<_Tp>(__p, __d) { }
+      template<typename _Tp1, typename _Deleter>
+        shared_ptr(_Tp1* __p, _Deleter __d)
+       : __shared_ptr<_Tp>(__p, __d) { }
     
-    template<typename _Tp1>
-      shared_ptr(const __shared_ptr<_Tp1>& __r)
-      : __shared_ptr<_Tp>(__r) { }
+      template<typename _Tp1>
+        shared_ptr(const __shared_ptr<_Tp1>& __r)
+       : __shared_ptr<_Tp>(__r) { }
     
-    template<typename _Tp1>
-      explicit shared_ptr(const __weak_ptr<_Tp1>& __r)
-      : __shared_ptr<_Tp>(__r) { }
+      template<typename _Tp1>
+        explicit
+        shared_ptr(const __weak_ptr<_Tp1>& __r)
+       : __shared_ptr<_Tp>(__r) { }
     
-    template<typename _Tp1>
-      explicit shared_ptr(std::auto_ptr<_Tp1>& __r)
-      : __shared_ptr<_Tp>(__r) { }
-
-    template<typename _Tp1>
-      shared_ptr(const __shared_ptr<_Tp1>& __r, __static_cast_tag)
-      : __shared_ptr<_Tp>(__r, __static_cast_tag()) { }
-
-    template<typename _Tp1>
-      shared_ptr(const __shared_ptr<_Tp1>& __r, __const_cast_tag)
-      : __shared_ptr<_Tp>(__r, __const_cast_tag()) { }
+      template<typename _Tp1>
+        explicit
+        shared_ptr(std::auto_ptr<_Tp1>& __r)
+       : __shared_ptr<_Tp>(__r) { }
+
+      template<typename _Tp1>
+        shared_ptr(const __shared_ptr<_Tp1>& __r, __static_cast_tag)
+       : __shared_ptr<_Tp>(__r, __static_cast_tag()) { }
+
+      template<typename _Tp1>
+        shared_ptr(const __shared_ptr<_Tp1>& __r, __const_cast_tag)
+       : __shared_ptr<_Tp>(__r, __const_cast_tag()) { }
     
-    template<typename _Tp1>
-      shared_ptr(const __shared_ptr<_Tp1>& __r, __dynamic_cast_tag)
-      : __shared_ptr<_Tp>(__r, __dynamic_cast_tag()) { }
-
-    // Additional non-base assignment operators to avoid excessive errors.
-    template<typename _Tp1>
-      shared_ptr&
-      operator=(std::auto_ptr<_Tp1>& __r)
-      {
-        this->__shared_ptr<_Tp>::operator=(__r);
-        return *this;
-      }
-
-    template<typename _Tp1>
-      shared_ptr&
-      operator=(const shared_ptr<_Tp1>& __r) // never throws
-      {
-        this->__shared_ptr<_Tp>::operator=(__r);
-        return *this;
-      }
-  };
+      template<typename _Tp1>
+        shared_ptr(const __shared_ptr<_Tp1>& __r, __dynamic_cast_tag)
+       : __shared_ptr<_Tp>(__r, __dynamic_cast_tag()) { }
+
+      // Additional non-base assignment operators to avoid excessive errors.
+      template<typename _Tp1>
+        shared_ptr&
+        operator=(std::auto_ptr<_Tp1>& __r)
+        {
+         this->__shared_ptr<_Tp>::operator=(__r);
+         return *this;
+       }
 
-template<typename _Tp>
-  class enable_shared_from_this : public __enable_shared_from_this<_Tp>
-  {
-  protected:
-    enable_shared_from_this()
-    : __enable_shared_from_this<_Tp>() { }
-    
-    enable_shared_from_this(const enable_shared_from_this&)
-    : __enable_shared_from_this<_Tp>(enable_shared_from_this<_Tp>()) { }
-  };
+      template<typename _Tp1>
+        shared_ptr&
+        operator=(const shared_ptr<_Tp1>& __r) // never throws
+        {
+         this->__shared_ptr<_Tp>::operator=(__r);
+         return *this;
+       }
+    };
 
+  template<typename _Tp>
+    class enable_shared_from_this : public __enable_shared_from_this<_Tp>
+    {
+    protected:
+      enable_shared_from_this()
+      : __enable_shared_from_this<_Tp>() { }
+      
+      enable_shared_from_this(const enable_shared_from_this&)
+      : __enable_shared_from_this<_Tp>(enable_shared_from_this<_Tp>()) { }
+    };
+  
 _GLIBCXX_END_NAMESPACE
 } // namespace std