|
- #ifndef BOOSTER_INTRUSIVE_PTR_H_INCLUDED
- #define BOOSTER_INTRUSIVE_PTR_H_INCLUDED
-
- //
- // intrusive_ptr.hpp
- //
- // Copyright (c) 2001, 2002 Peter Dimov
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- // See http://www.boost.org/libs/smart_ptr/intrusive_ptr.html for documentation.
- //
-
-
- #include <functional> // for std::less
- #include <iosfwd> // for std::basic_ostream
-
-
- namespace booster
- {
-
- ///
- /// \brief intrusive_ptr is the class taken as-is from boost.
- ///
- ///
- /// A smart pointer that uses intrusive reference counting.
- ///
- /// Relies on unqualified calls to
- ///
- /// void intrusive_ptr_add_ref(T * p);
- /// void intrusive_ptr_release(T * p);
- ///
- /// (p != 0)
- ///
- /// The object is responsible for destroying itself.
- ///
- /// See: http://www.boost.org/doc/libs/release/libs/smart_ptr
- ///
-
- template<class T> class intrusive_ptr
- {
- private:
-
- typedef intrusive_ptr this_type;
-
- public:
-
- typedef T element_type;
-
- intrusive_ptr(): p_(0)
- {
- }
-
- intrusive_ptr(T * p, bool add_ref = true): p_(p)
- {
- if(p_ != 0 && add_ref) intrusive_ptr_add_ref(p_);
- }
-
- T *release()
- {
- T *r = p_;
- p_ = 0;
- return r;
- }
-
- intrusive_ptr(intrusive_ptr const & rhs): p_(rhs.p_)
- {
- if(p_ != 0) intrusive_ptr_add_ref(p_);
- }
-
- ~intrusive_ptr()
- {
- if(p_ != 0) intrusive_ptr_release(p_);
- }
-
- template<class U> intrusive_ptr(intrusive_ptr<U> const & rhs): p_(rhs.get())
- {
- if(p_ != 0) intrusive_ptr_add_ref(p_);
- }
-
- intrusive_ptr & operator=(intrusive_ptr const & rhs)
- {
- this_type(rhs).swap(*this);
- return *this;
- }
-
- intrusive_ptr & operator=(T * rhs)
- {
- this_type(rhs).swap(*this);
- return *this;
- }
-
- T * get() const
- {
- return p_;
- }
-
- T & operator*() const
- {
- return *p_;
- }
-
- T * operator->() const
- {
- return p_;
- }
-
-
- typedef T * this_type::*unspecified_bool_type;
-
- operator unspecified_bool_type () const
- {
- return p_ == 0? 0: &this_type::p_;
- }
-
- // operator! is a Borland-specific workaround
- bool operator! () const
- {
- return p_ == 0;
- }
-
- void swap(intrusive_ptr & rhs)
- {
- T * tmp = p_;
- p_ = rhs.p_;
- rhs.p_ = tmp;
- }
-
- private:
-
- T * p_;
- };
-
- template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
- {
- return a.get() == b.get();
- }
-
- template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
- {
- return a.get() != b.get();
- }
-
- template<class T> inline bool operator==(intrusive_ptr<T> const & a, T * b)
- {
- return a.get() == b;
- }
-
- template<class T> inline bool operator!=(intrusive_ptr<T> const & a, T * b)
- {
- return a.get() != b;
- }
-
- template<class T> inline bool operator==(T * a, intrusive_ptr<T> const & b)
- {
- return a == b.get();
- }
-
- template<class T> inline bool operator!=(T * a, intrusive_ptr<T> const & b)
- {
- return a != b.get();
- }
-
- template<class T> inline bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b)
- {
- return std::less<T *>()(a.get(), b.get());
- }
-
- template<class T> void swap(intrusive_ptr<T> & lhs, intrusive_ptr<T> & rhs)
- {
- lhs.swap(rhs);
- }
-
- // mem_fn support
-
- template<class T> T * get_pointer(intrusive_ptr<T> const & p)
- {
- return p.get();
- }
-
- template<class T, class U> intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & p)
- {
- return static_cast<T *>(p.get());
- }
-
- template<class T, class U> intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & p)
- {
- return const_cast<T *>(p.get());
- }
-
- template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & p)
- {
- return dynamic_cast<T *>(p.get());
- }
-
- // operator<<
-
-
- template<class E, class T, class Y>
- std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
- {
- os << p.get();
- return os;
- }
-
-
- } // namespace booster
-
- #endif // #ifndef BOOSTER_INTRUSIVE_PTR_H_INCLUDED
|