...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
boost::interprocess::intrusive_ptr
// In header: <boost/interprocess/smart_ptr/intrusive_ptr.hpp> template<typename T, typename VoidPointer> class intrusive_ptr { public: // types typedef boost::intrusive::pointer_traits< VoidPointer >::template rebind_pointer< T >::type pointer; // Provides the type of the internal stored pointer. typedef T element_type; // Provides the type of the stored pointer. // construct/copy/destruct intrusive_ptr(); intrusive_ptr(const pointer &, bool = true); intrusive_ptr(intrusive_ptr const &); template<typename U> intrusive_ptr(intrusive_ptr< U, VP > const &); intrusive_ptr& operator=(intrusive_ptr const &); template<typename U> intrusive_ptr& operator=(intrusive_ptr< U, VP > const &); intrusive_ptr& operator=(pointer); ~intrusive_ptr(); // public member functions pointer & get(); const pointer & get() const; T & operator*() const; const pointer & operator->() const; pointer & operator->(); operator unspecified_bool_type() const; bool operator!() const; void swap(intrusive_ptr &); };
The intrusive_ptr class template stores a pointer to an object with an embedded reference count. intrusive_ptr is parameterized on T (the type of the object pointed to) and VoidPointer(a void pointer type that defines the type of pointer that intrusive_ptr will store). intrusive_ptr<T, void *> defines a class with a T* member whereas intrusive_ptr<T, offset_ptr<void> > defines a class with a offset_ptr<T> member. Relies on unqualified calls to:
void intrusive_ptr_add_ref(T * p); void intrusive_ptr_release(T * p);
with (p != 0)
The object is responsible for destroying itself.
intrusive_ptr
public
construct/copy/destructintrusive_ptr();
Constructor. Initializes internal pointer to 0. Does not throw
intrusive_ptr(const pointer & p, bool add_ref = true);
Constructor. Copies pointer and if "p" is not zero and "add_ref" is true calls intrusive_ptr_add_ref(to_raw_pointer(p)). Does not throw
intrusive_ptr(intrusive_ptr const & rhs);
Copy constructor. Copies the internal pointer and if "p" is not zero calls intrusive_ptr_add_ref(to_raw_pointer(p)). Does not throw
template<typename U> intrusive_ptr(intrusive_ptr< U, VP > const & rhs);
Constructor from related. Copies the internal pointer and if "p" is not zero calls intrusive_ptr_add_ref(to_raw_pointer(p)). Does not throw
intrusive_ptr& operator=(intrusive_ptr const & rhs);
Assignment operator. Equivalent to intrusive_ptr(r).swap(*this). Does not throw
template<typename U> intrusive_ptr& operator=(intrusive_ptr< U, VP > const & rhs);
Assignment from related. Equivalent to intrusive_ptr(r).swap(*this). Does not throw
intrusive_ptr& operator=(pointer rhs);
Assignment from pointer. Equivalent to intrusive_ptr(r).swap(*this). Does not throw
~intrusive_ptr();
Destructor. If internal pointer is not 0, calls intrusive_ptr_release(to_raw_pointer(m_ptr)). Does not throw
intrusive_ptr
public member functionspointer & get();
Returns a reference to the internal pointer. Does not throw
const pointer & get() const;
Returns a reference to the internal pointer. Does not throw
T & operator*() const;
Returns *get(). Does not throw
const pointer & operator->() const;
Returns *get(). Does not throw
pointer & operator->();
Returns get(). Does not throw
operator unspecified_bool_type() const;
Conversion to boolean. Does not throw
bool operator!() const;
Not operator. Does not throw
void swap(intrusive_ptr & rhs);
Exchanges the contents of the two smart pointers. Does not throw