libzypp  17.28.8
AutoDispose.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_AUTODISPOSE_H
13 #define ZYPP_AUTODISPOSE_H
14 
15 #include <iosfwd>
16 #include <boost/call_traits.hpp>
17 
18 #include <zypp-core/base/NonCopyable.h>
19 #include <zypp-core/base/PtrTypes.h>
20 #include <zypp-core/base/Function.h>
21 #include <zypp-core/Pathname.h>
22 
24 namespace zypp
25 {
26 
28  //
29  // CLASS NAME : AutoDispose<Tp>
30  //
92  template<class Tp>
94  {
95  public:
96  typedef typename boost::call_traits<Tp>::param_type param_type;
97  typedef typename boost::call_traits<Tp>::reference reference;
98  typedef typename boost::call_traits<Tp>::const_reference const_reference;
99  typedef Tp value_type;
100  typedef typename boost::call_traits<Tp>::value_type result_type;
101  using dispose_param_type = std::conditional_t< std::is_pointer_v<Tp> || std::is_integral_v<Tp>, Tp const, reference >;
102 
103  public:
105  using Dispose = function<void ( dispose_param_type )>;
106 
107  public:
110  : _pimpl( new Impl( value_type() ) )
111  {}
112 
114  explicit AutoDispose( const Dispose & dispose_r )
115  : _pimpl( new Impl( value_type(), dispose_r ) )
116  {}
117 
119  explicit AutoDispose( param_type value_r )
120  : _pimpl( new Impl( value_r ) )
121  {}
122 
124  AutoDispose( param_type value_r, const Dispose & dispose_r )
125  : _pimpl( new Impl( value_r, dispose_r ) )
126  {}
127 
128  public:
129 
131  operator reference() const
132  { return _pimpl->_value; }
133 
135  reference value() const
136  { return _pimpl->_value; }
137 
140  { return _pimpl->_value; }
141 
144  { return & _pimpl->_value; }
145 
147  void reset()
148  { AutoDispose().swap( *this ); }
149 
151  void swap( AutoDispose & rhs )
152  { _pimpl.swap( rhs._pimpl ); }
153 
154  public:
156  const Dispose & getDispose() const
157  { return _pimpl->_dispose; }
158 
160  void setDispose( const Dispose & dispose_r )
161  { _pimpl->_dispose = dispose_r; }
162 
165  { setDispose( Dispose() ); }
166 
168  void swapDispose( Dispose & dispose_r )
169  { _pimpl->_dispose.swap( dispose_r ); }
170 
171  private:
172  struct Impl : private base::NonCopyable
173  {
174  Impl( param_type value_r )
175  : _value( value_r )
176  {}
177  Impl( param_type value_r, const Dispose & dispose_r )
178  : _value( value_r )
179  , _dispose( dispose_r )
180  {}
182  {
183  if ( _dispose )
184  try { _dispose( _value ); } catch(...) {}
185  }
188  };
189 
190  shared_ptr<Impl> _pimpl;
191  };
192 
193  template<>
194  class AutoDispose<void>
195  {
196  public:
198  typedef function<void ()> Dispose;
199 
200  public:
203  : _pimpl( new Impl() )
204  {}
205 
207  explicit AutoDispose( const Dispose & dispose_r )
208  : _pimpl( new Impl( dispose_r ) )
209  {}
210 
211  public:
212 
214  void reset()
215  { AutoDispose().swap( *this ); }
216 
218  void swap( AutoDispose & rhs )
219  { _pimpl.swap( rhs._pimpl ); }
220 
221  public:
223  const Dispose & getDispose() const
224  { return _pimpl->_dispose; }
225 
227  void setDispose( const Dispose & dispose_r )
228  { _pimpl->_dispose = dispose_r; }
229 
232  { setDispose( Dispose() ); }
233 
235  void swapDispose( Dispose & dispose_r )
236  { _pimpl->_dispose.swap( dispose_r ); }
237 
238  private:
239  struct Impl : private base::NonCopyable
240  {
241  Impl( )
242  {}
243 
244  Impl( const Dispose & dispose_r )
245  : _dispose( dispose_r )
246  {}
247 
249  {
250  if ( _dispose )
251  try { _dispose(); } catch(...) {}
252  }
254  };
255  shared_ptr<Impl> _pimpl;
256  };
257 
268 
270 
272  template<class Tp>
273  inline std::ostream & operator<<( std::ostream & str, const AutoDispose<Tp> & obj )
274  { return str << obj.value(); }
275 
276 
282  struct AutoFD : public AutoDispose<int>
283  {
284  AutoFD( int fd_r = -1 ) : AutoDispose<int>( fd_r, [] ( int fd_r ) { if ( fd_r != -1 ) ::close( fd_r ); } ) {}
285  };
286 
293  struct AutoFILE : public AutoDispose<FILE*>
294  {
295  AutoFILE( FILE* file_r = nullptr ) : AutoDispose<FILE*>( file_r, [] ( FILE* file_r ) { if ( file_r ) ::fclose( file_r ); } ) {}
296  };
297 
303  template <typename Tp>
304  struct AutoFREE : public AutoDispose<Tp*>
305  {
306  AutoFREE( Tp* ptr_r = nullptr ) : AutoDispose<Tp*>( ptr_r, [] ( Tp* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {}
307  AutoFREE( void* ptr_r ) : AutoFREE( static_cast<Tp*>(ptr_r) ) {}
308  };
309 
310  template <>
311  struct AutoFREE<void> : public AutoDispose<void*>
312  {
313  AutoFREE( void* ptr_r = nullptr ) : AutoDispose<void*>( ptr_r, [] ( void* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {}
314  };
316 } // namespace zypp
318 #endif // ZYPP_AUTODISPOSE_H
AutoFREE(Tp *ptr_r=nullptr)
Definition: AutoDispose.h:306
Impl(const Dispose &dispose_r)
Definition: AutoDispose.h:244
void reset()
Reset to default Ctor values.
Definition: AutoDispose.h:147
void swapDispose(Dispose &dispose_r)
Exchange the dispose function.
Definition: AutoDispose.h:168
shared_ptr< Impl > _pimpl
Definition: AutoDispose.h:255
void swap(AutoDispose &rhs)
Exchange the contents of two AutoDispose objects.
Definition: AutoDispose.h:218
String related utilities and Regular expression matching.
std::conditional_t< std::is_pointer_v< FILE * >||std::is_integral_v< FILE * >, FILE * const, reference > dispose_param_type
Definition: AutoDispose.h:101
void reset()
Reset to default Ctor values.
Definition: AutoDispose.h:214
AutoDispose<int> calling ::close
Definition: AutoDispose.h:282
void swap(AutoDispose &rhs)
Exchange the contents of two AutoDispose objects.
Definition: AutoDispose.h:151
shared_ptr< Impl > _pimpl
Definition: AutoDispose.h:190
void resetDispose()
Set no dispose function.
Definition: AutoDispose.h:231
function< void(dispose_param_type)> Dispose
Dispose function signatue.
Definition: AutoDispose.h:105
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
Definition: AutoDispose.h:227
Impl(param_type value_r, const Dispose &dispose_r)
Definition: AutoDispose.h:177
Impl(param_type value_r)
Definition: AutoDispose.h:174
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
AutoDispose()
Default Ctor using default constructed value and no dispose function.
Definition: AutoDispose.h:202
AutoFREE(void *ptr_r)
Definition: AutoDispose.h:307
const Dispose & getDispose() const
Return the current dispose function.
Definition: AutoDispose.h:156
reference operator*() const
Reference to the Tp object.
Definition: AutoDispose.h:139
boost::call_traits< Tp >::const_reference const_reference
Definition: AutoDispose.h:98
AutoDispose()
Default Ctor using default constructed value and no dispose function.
Definition: AutoDispose.h:109
boost::call_traits< Tp >::param_type param_type
Definition: AutoDispose.h:96
boost::call_traits< Tp >::value_type result_type
Definition: AutoDispose.h:100
void resetDispose()
Set no dispose function.
Definition: AutoDispose.h:164
AutoDispose(const Dispose &dispose_r)
Ctor taking dispose function and using default constructed value.
Definition: AutoDispose.h:207
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
Definition: AutoDispose.h:160
AutoFILE(FILE *file_r=nullptr)
Definition: AutoDispose.h:295
AutoDispose(const Dispose &dispose_r)
Ctor taking dispose function and using default constructed value.
Definition: AutoDispose.h:114
AutoFREE(void *ptr_r=nullptr)
Definition: AutoDispose.h:313
reference value() const
Reference to the Tp object.
Definition: AutoDispose.h:135
boost::call_traits< Tp >::reference reference
Definition: AutoDispose.h:97
AutoFD(int fd_r=-1)
Definition: AutoDispose.h:284
void swapDispose(Dispose &dispose_r)
Exchange the dispose function.
Definition: AutoDispose.h:235
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition: AutoDispose.h:93
AutoDispose<FILE*> calling ::fclose
Definition: AutoDispose.h:293
value_type * operator->() const
Pointer to the Tp object (asserted to be != NULL).
Definition: AutoDispose.h:143
AutoDispose(param_type value_r)
Ctor taking value and no dispose function.
Definition: AutoDispose.h:119
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
AutoDispose(param_type value_r, const Dispose &dispose_r)
Ctor taking value and dispose function.
Definition: AutoDispose.h:124
function< void()> Dispose
Dispose function signatue.
Definition: AutoDispose.h:198
const Dispose & getDispose() const
Return the current dispose function.
Definition: AutoDispose.h:223