Chris@16: Chris@16: // helper code for dealing with tracking non-boost shared_ptr/weak_ptr Chris@16: Chris@16: // Copyright Frank Mori Hess 2009. Chris@16: // Distributed under the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/signals2 for library home page. Chris@16: Chris@16: #ifndef BOOST_SIGNALS2_FOREIGN_PTR_HPP Chris@16: #define BOOST_SIGNALS2_FOREIGN_PTR_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifndef BOOST_NO_CXX11_SMART_PTR Chris@16: #include Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: template class shared_ptr; Chris@16: template class weak_ptr; Chris@16: Chris@16: namespace signals2 Chris@16: { Chris@16: template struct weak_ptr_traits Chris@16: {}; Chris@16: template struct weak_ptr_traits > Chris@16: { Chris@16: typedef boost::shared_ptr shared_type; Chris@16: }; Chris@16: #ifndef BOOST_NO_CXX11_SMART_PTR Chris@16: template struct weak_ptr_traits > Chris@16: { Chris@16: typedef std::shared_ptr shared_type; Chris@16: }; Chris@16: #endif Chris@16: Chris@16: template struct shared_ptr_traits Chris@16: {}; Chris@16: Chris@16: template struct shared_ptr_traits > Chris@16: { Chris@16: typedef boost::weak_ptr weak_type; Chris@16: }; Chris@16: #ifndef BOOST_NO_CXX11_SMART_PTR Chris@16: template struct shared_ptr_traits > Chris@16: { Chris@16: typedef std::weak_ptr weak_type; Chris@16: }; Chris@16: #endif Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: struct foreign_shared_ptr_impl_base Chris@16: { Chris@16: virtual ~foreign_shared_ptr_impl_base() {} Chris@16: virtual void* get() const = 0; Chris@16: virtual foreign_shared_ptr_impl_base * clone() const = 0; Chris@16: }; Chris@16: Chris@16: template Chris@16: class foreign_shared_ptr_impl: public foreign_shared_ptr_impl_base Chris@16: { Chris@16: public: Chris@16: foreign_shared_ptr_impl(const FSP &p): _p(p) Chris@16: {} Chris@16: virtual void * get() const Chris@16: { Chris@16: return _p.get(); Chris@16: } Chris@16: virtual foreign_shared_ptr_impl * clone() const Chris@16: { Chris@16: return new foreign_shared_ptr_impl(*this); Chris@16: } Chris@16: private: Chris@16: FSP _p; Chris@16: }; Chris@16: Chris@16: class foreign_void_shared_ptr Chris@16: { Chris@16: public: Chris@16: foreign_void_shared_ptr(): Chris@16: _p(0) Chris@16: {} Chris@16: foreign_void_shared_ptr(const foreign_void_shared_ptr &other): Chris@16: _p(other._p->clone()) Chris@16: {} Chris@16: template Chris@16: explicit foreign_void_shared_ptr(const FSP &fsp): Chris@16: _p(new foreign_shared_ptr_impl(fsp)) Chris@16: {} Chris@16: ~foreign_void_shared_ptr() Chris@16: { Chris@16: delete _p; Chris@16: } Chris@16: foreign_void_shared_ptr & operator=(const foreign_void_shared_ptr &other) Chris@16: { Chris@16: if(&other == this) return *this; Chris@16: foreign_void_shared_ptr(other).swap(*this); Chris@16: return *this; Chris@16: } Chris@16: void swap(foreign_void_shared_ptr &other) Chris@16: { Chris@16: boost::swap(_p, other._p); Chris@16: } Chris@16: private: Chris@16: foreign_shared_ptr_impl_base *_p; Chris@16: }; Chris@16: Chris@16: struct foreign_weak_ptr_impl_base Chris@16: { Chris@16: virtual ~foreign_weak_ptr_impl_base() {} Chris@16: virtual foreign_void_shared_ptr lock() const = 0; Chris@16: virtual bool expired() const = 0; Chris@16: virtual foreign_weak_ptr_impl_base * clone() const = 0; Chris@16: }; Chris@16: Chris@16: template Chris@16: class foreign_weak_ptr_impl: public foreign_weak_ptr_impl_base Chris@16: { Chris@16: public: Chris@16: foreign_weak_ptr_impl(const FWP &p): _p(p) Chris@16: {} Chris@16: virtual foreign_void_shared_ptr lock() const Chris@16: { Chris@16: return foreign_void_shared_ptr(_p.lock()); Chris@16: } Chris@16: virtual bool expired() const Chris@16: { Chris@16: return _p.expired(); Chris@16: } Chris@16: virtual foreign_weak_ptr_impl * clone() const Chris@16: { Chris@16: return new foreign_weak_ptr_impl(*this); Chris@16: } Chris@16: private: Chris@16: FWP _p; Chris@16: }; Chris@16: Chris@16: class foreign_void_weak_ptr Chris@16: { Chris@16: public: Chris@16: foreign_void_weak_ptr() Chris@16: {} Chris@16: foreign_void_weak_ptr(const foreign_void_weak_ptr &other): Chris@16: _p(other._p->clone()) Chris@16: {} Chris@16: template Chris@16: explicit foreign_void_weak_ptr(const FWP &fwp): Chris@16: _p(new foreign_weak_ptr_impl(fwp)) Chris@16: {} Chris@16: foreign_void_weak_ptr & operator=(const foreign_void_weak_ptr &other) Chris@16: { Chris@16: if(&other == this) return *this; Chris@16: foreign_void_weak_ptr(other).swap(*this); Chris@16: return *this; Chris@16: } Chris@16: void swap(foreign_void_weak_ptr &other) Chris@16: { Chris@16: boost::swap(_p, other._p); Chris@16: } Chris@16: foreign_void_shared_ptr lock() const Chris@16: { Chris@16: return _p->lock(); Chris@16: } Chris@16: bool expired() const Chris@16: { Chris@16: return _p->expired(); Chris@16: } Chris@16: private: Chris@16: boost::scoped_ptr _p; Chris@16: }; Chris@16: } // namespace detail Chris@16: Chris@16: } // namespace signals2 Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_SIGNALS2_FOREIGN_PTR_HPP