1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/PtrTypes.h
10 * \ingroup ZYPP_BASE_SMART_PTR
11 * \see ZYPP_BASE_SMART_PTR
13 #ifndef ZYPP_BASE_PTRTYPES_H
14 #define ZYPP_BASE_PTRTYPES_H
16 #include <boost/scoped_ptr.hpp>
17 #include <boost/shared_ptr.hpp>
18 #include <boost/weak_ptr.hpp>
19 #include <boost/intrusive_ptr.hpp>
21 ///////////////////////////////////////////////////////////////////
23 { /////////////////////////////////////////////////////////////////
24 ///////////////////////////////////////////////////////////////////
26 { /////////////////////////////////////////////////////////////////
28 /** \defgroup ZYPP_BASE_SMART_PTR ZYPP_BASE_SMART_PTR
29 * Smart pointer types.
31 * Namespace zypp::base provides 3 smart pointer types \b using the
32 * boost smart pointer library.
34 * \li \c scoped_ptr Simple sole ownership of single objects. Noncopyable.
36 * \li \c shared_ptr Object ownership shared among multiple pointers
38 * \li \c weak_ptr Non-owning observers of an object owned by shared_ptr.
43 using boost::scoped_ptr;
46 using boost::shared_ptr;
49 using boost::weak_ptr;
51 /** Use boost::intrusive_ptr as Ptr type*/
52 using boost::intrusive_ptr;
53 using boost::static_pointer_cast;
54 using boost::const_pointer_cast;
55 using boost::dynamic_pointer_cast;
57 ///////////////////////////////////////////////////////////////////
59 // CLASS NAME : ImplPtr
61 /** Wrapper for \c const correct access via \ref ZYPP_BASE_SMART_PTR.
63 * zypp::base::ImplPtr<tt>\<_D,_Ptr></tt> stores a \ref ZYPP_BASE_SMART_PTR
64 * of type \c _Ptr, which must be convertible into a <tt>_D *</tt>. Pointer
65 * style access (via \c -> and \c *) offers a <tt>const _D *</tt> in const
66 * a context, otherwise a <tt>_D *</tt>.
68 * Forwarding access from an interface to an implemantation class, an
69 * ImplPtr prevents const interface methods from accidentally calling
70 * nonconst implementation methods. In case you have to do so, call
71 * unconst to get the <tt>_D *</tt>.
73 * The second template argument defaults to <tt>_Ptr = shared_ptr<_D></tt>.
75 * \todo refine ctor and assign.
77 template<class _D, class _Ptr = shared_ptr<_D> >
80 typedef _D element_type;
83 ImplPtr( typename _Ptr::element_type * dptr = 0 )
92 _D & operator*() { return *_dptr; }
93 const _D & operator*() const { return *_dptr; };
94 _D * operator->() { return _dptr.get(); }
95 const _D * operator->() const { return _dptr.get(); }
96 _D * get() { return _dptr.get(); }
97 const _D * get() const { return _dptr.get(); }
99 _D * unconst() const { return _dptr.get(); }
104 ///////////////////////////////////////////////////////////////////
105 /** Wrapper for \c const correct access via pointer.
107 * Template specialization of ImplPtr, storing a raw <tt>_P *</tt>,
108 * which must be convertible into a <tt>_D *</tt>.
110 * \note The object pointed to will \b not be deleted. If you need
111 * automatic cleanup, use a \ref ZYPP_BASE_SMART_PTR instead of a
114 template<class _D,class _P>
115 struct ImplPtr<_D,_P*>
117 typedef _D element_type;
120 ImplPtr( _P * dptr = 0 )
124 _D & operator*() { return *_dptr; }
125 const _D & operator*() const { return *_dptr; };
126 _D * operator->() { return _dptr; }
127 const _D * operator->() const { return _dptr; }
128 _D * get() { return _dptr; }
129 const _D * get() const { return _dptr; }
131 _D * unconst() const { return _dptr; }
136 /////////////////////////////////////////////////////////////////
140 /////////////////////////////////////////////////////////////////
142 ///////////////////////////////////////////////////////////////////
143 /////////////////////////////////////////////////////////////////
145 ///////////////////////////////////////////////////////////////////
147 /** Forward declaration of Ptr types */
148 #define DEFINE_PTR_TYPE(NAME) \
150 extern void intrusive_ptr_add_ref( const NAME * ); \
151 extern void intrusive_ptr_release( const NAME * ); \
152 typedef zypp::base::intrusive_ptr<NAME> NAME##Ptr; \
153 typedef zypp::base::intrusive_ptr<const NAME> const##NAME##Ptr; \
154 typedef zypp::base::intrusive_ptr<NAME> NAME##_Ptr; \
155 typedef zypp::base::intrusive_ptr<const NAME> NAME##_constPtr;
157 ///////////////////////////////////////////////////////////////////
158 #endif // ZYPP_BASE_PTRTYPES_H