13 #ifndef ZYPP_BASE_PTRTYPES_H
14 #define ZYPP_BASE_PTRTYPES_H
18 #include <boost/scoped_ptr.hpp>
19 #include <boost/shared_ptr.hpp>
20 #include <boost/weak_ptr.hpp>
21 #include <boost/intrusive_ptr.hpp>
82 using boost::scoped_ptr;
85 using boost::shared_ptr;
88 using boost::weak_ptr;
91 using boost::intrusive_ptr;
94 using boost::static_pointer_cast;
96 using boost::const_pointer_cast;
98 using boost::dynamic_pointer_cast;
119 inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr<_D> & obj )
123 return str << std::string(
"NULL");
127 inline std::ostream &
dumpOn( std::ostream & str,
const zypp::shared_ptr<_D> & obj )
130 return dumpOn( str, *obj );
131 return str << std::string(
"NULL");
136 inline std::ostream & operator<<( std::ostream & str, const zypp::intrusive_ptr<_D> & obj )
140 return str << std::string(
"NULL");
144 inline std::ostream &
dumpOn( std::ostream & str,
const zypp::intrusive_ptr<_D> & obj )
147 return dumpOn( str, *obj );
148 return str << std::string(
"NULL");
167 namespace rw_pointer {
176 {
return !ptr_r || ptr_r.unique(); }
178 {
return !ptr_r || ptr_r.unique(); }
181 {
return ptr_r.use_count(); }
183 {
return ptr_r.use_count(); }
189 typedef intrusive_ptr<_D>
_Ptr;
193 {
return !ptr_r || (ptr_r->refCount() <= 1); }
195 {
return !ptr_r || (ptr_r->refCount() <= 1); }
198 {
return ptr_r ? ptr_r->refCount() : 0; }
200 {
return ptr_r ? ptr_r->refCount() : 0; }
215 {
return ptr_r ? 1 : 0; }
217 {
return ptr_r ? 1 : 0; }
264 template<
class _D,
class _Traits = rw_po
inter::Shared<_D> >
267 typedef typename _Traits::_Ptr
_Ptr;
284 void reset(
typename _Ptr::element_type * dptr )
291 {
_dptr.swap( rhs ); }
300 {
return _dptr.operator->(); }
302 const _D *
get()
const
303 {
return _dptr.get(); }
309 {
return _dptr.operator->(); }
312 {
return _dptr.get(); }
316 {
return _Traits().unique(
_dptr ); }
319 {
return _Traits().use_count(
_dptr ); }
340 template<
class _D,
class _Ptr>
341 inline std::ostream & operator<<( std::ostream & str, const RW_pointer<_D, _Ptr> & obj )
344 return str << *obj.get();
345 return str << std::string(
"NULL");
349 template<
class _D,
class _Ptr>
351 {
return( lhs.
get() == rhs.
get() ); }
353 template<
class _D,
class _Ptr>
355 {
return( lhs.
get() == rhs.get() ); }
357 template<
class _D,
class _Ptr>
359 {
return( lhs.get() == rhs.
get() ); }
361 template<
class _D,
class _Ptr>
363 {
return( lhs.
get() == rhs.get() ); }
365 template<
class _D,
class _Ptr>
367 {
return( lhs.get() == rhs.
get() ); }
371 template<
class _D,
class _Ptr>
373 {
return ! ( lhs == rhs ); }
375 template<
class _D,
class _Ptr>
377 {
return ! ( lhs == rhs ); }
379 template<
class _D,
class _Ptr>
381 {
return ! ( lhs == rhs ); }
383 template<
class _D,
class _Ptr>
385 {
return ! ( lhs == rhs ); }
387 template<
class _D,
class _Ptr>
389 {
return ! ( lhs == rhs ); }
400 {
return rhs->clone(); }
413 template<
class _D,
class _Traits = rw_po
inter::Shared<_D> >
416 typedef typename _Traits::_Ptr
_Ptr;
433 void reset(
typename _Ptr::element_type * dptr )
440 {
_dptr.swap( rhs ); }
449 {
return _dptr.operator->(); }
451 const _D *
get()
const
452 {
return _dptr.get(); }
465 {
return _Traits().unique(
_dptr ); }
468 {
return _Traits().use_count(
_dptr ); }
497 template<
class _D,
class _Ptr>
498 inline std::ostream & operator<<( std::ostream & str, const RWCOW_pointer<_D, _Ptr> & obj )
501 return str << *obj.get();
502 return str << std::string(
"NULL");
506 template<
class _D,
class _Ptr>
508 {
return( lhs.
get() == rhs.
get() ); }
510 template<
class _D,
class _Ptr>
512 {
return( lhs.
get() == rhs.get() ); }
514 template<
class _D,
class _Ptr>
516 {
return( lhs.get() == rhs.
get() ); }
518 template<
class _D,
class _Ptr>
520 {
return( lhs.
get() == rhs.get() ); }
522 template<
class _D,
class _Ptr>
524 {
return( lhs.get() == rhs.
get() ); }
527 template<
class _D,
class _Ptr>
529 {
return ! ( lhs == rhs ); }
531 template<
class _D,
class _Ptr>
533 {
return ! ( lhs == rhs ); }
535 template<
class _D,
class _Ptr>
537 {
return ! ( lhs == rhs ); }
539 template<
class _D,
class _Ptr>
541 {
return ! ( lhs == rhs ); }
543 template<
class _D,
class _Ptr>
545 {
return ! ( lhs == rhs ); }
555 #define DEFINE_PTR_TYPE(NAME) \
557 extern void intrusive_ptr_add_ref( const NAME * ); \
558 extern void intrusive_ptr_release( const NAME * ); \
559 typedef zypp::intrusive_ptr<NAME> NAME##_Ptr; \
560 typedef zypp::intrusive_ptr<const NAME> NAME##_constPtr;
563 #endif // ZYPP_BASE_PTRTYPES_H