libzypp  17.35.8
ReferenceCounted.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_CORE_BASE_REFERENCECOUNTED_H
13 #define ZYPP_CORE_BASE_REFERENCECOUNTED_H
14 
15 #include <iosfwd>
16 
17 #include <zypp-core/Globals.h>
19 
21 namespace zypp
22 {
23  namespace base
25  {
26 
28  //
29  // CLASS NAME : ReferenceCounted
30  //
35  {
37  friend std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj );
38 
39  public:
44 
48  ReferenceCounted( const ReferenceCounted & rhs );
49 
53  virtual ~ReferenceCounted();
54 
59  { return *this; }
60 
61  public:
63  unsigned refCount() const
64  { return _counter; }
65 
67  void ref() const
68  { ref_to( ++_counter ); }
69 
74  void unref() const
75  {
76  if ( !_counter )
77  unrefException(); // will throw!
78  if ( --_counter )
79  unref_to( _counter );
80  else
81  delete this;
82  }
83 
87  static void add_ref( const ReferenceCounted * ptr_r )
88  { if( ptr_r ) ptr_r->ref(); }
89 
93  static void release( const ReferenceCounted * ptr_r )
94  { if( ptr_r ) ptr_r->unref(); }
95 
96  protected:
98  virtual std::ostream & dumpOn( std::ostream & str ) const;
99 
101  virtual void ref_to( unsigned /* rep_cnt_r */ ) const {}
102 
107  virtual void unref_to( unsigned /* rep_cnt_r */ ) const {}
108 
109  private:
111  mutable unsigned _counter;
112 
114  void unrefException() const;
115  };
117 
119  inline void intrusive_ptr_add_ref( const ReferenceCounted * ptr_r )
120  { ReferenceCounted::add_ref( ptr_r ); }
121 
123  inline void intrusive_ptr_release( const ReferenceCounted * ptr_r )
124  { ReferenceCounted::release( ptr_r ); }
125 
127  inline std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj )
128  { return obj.dumpOn( str ); }
129 
131  } // namespace base
134 } // namespace zypp
136 
137 #define IMPL_PTR_TYPE(NAME) \
138 void intrusive_ptr_add_ref( const NAME * ptr_r ) \
139 { zypp::base::ReferenceCounted::add_ref( ptr_r ); } \
140 void intrusive_ptr_release( const NAME * ptr_r ) \
141 { zypp::base::ReferenceCounted::release( ptr_r ); }
142 
144 #endif // ZYPP_CORE_BASE_REFERENCECOUNTED_H
virtual std::ostream & dumpOn(std::ostream &str) const
Overload to realize std::ostream & operator<<.
String related utilities and Regular expression matching.
std::ostream & operator<<(std::ostream &str, const Flags< TEnum > &obj)
Definition: Flags.h:166
unsigned refCount() const
Return reference counter value.
Provides API related macros.
virtual void ref_to(unsigned) const
Trigger derived classes after refCount was increased.
void intrusive_ptr_add_ref(const ReferenceCounted *ptr_r)
const Arch Arch_armv7hnl Arch_armv7nhl ZYPP_API
Definition: ResTraits.h:93
static void release(const ReferenceCounted *ptr_r)
Called by zypp::intrusive_ptr to add a reference.
void intrusive_ptr_release(const ReferenceCounted *ptr_r)
unsigned _counter
The reference counter.
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
Definition: Capability.cc:580
Base class for reference counted objects.
ReferenceCounted & operator=(const ReferenceCounted &)
Assignment.
void unref() const
Release a reference.
virtual void unref_to(unsigned) const
Trigger derived classes after refCount was decreased.
Easy-to use interface to the ZYPP dependency resolver.
Definition: Application.cc:19
static void add_ref(const ReferenceCounted *ptr_r)
Called by zypp::intrusive_ptr to add a reference.
void ref() const
Add a reference.
std::ostream & operator<<(std::ostream &str, const ReferenceCounted &obj)