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
24namespace zypp
25{
26
28 //
29 // CLASS NAME : AutoDispose<Tp>
30 //
92 template<class Tp>
93 class AutoDispose
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
139 reference operator*() const
140 { return _pimpl->_value; }
141
143 value_type * operator->() const
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
164 void resetDispose()
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 {}
181 ~Impl()
182 {
183 if ( _dispose )
184 try { _dispose( _value ); } catch(...) {}
185 }
188 };
189
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
231 void resetDispose()
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
248 ~Impl()
249 {
250 if ( _dispose )
251 try { _dispose(); } catch(...) {}
252 }
254 };
256 };
257
267 using OnScopeExit = AutoDispose<void>;
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
value_type * operator->() const
Pointer to the Tp object (asserted to be != NULL).
Definition: AutoDispose.h:143
reference value() const
Reference to the Tp object.
Definition: AutoDispose.h:135
const Dispose & getDispose() const
Return the current dispose function.
Definition: AutoDispose.h:156
void resetDispose()
Set no dispose function.
Definition: AutoDispose.h:164
function< void(dispose_param_type)> Dispose
Dispose function signatue.
Definition: AutoDispose.h:105
AutoDispose()
Default Ctor using default constructed value and no dispose function.
Definition: AutoDispose.h:109
std::conditional_t< std::is_pointer_v< Tp >||std::is_integral_v< Tp >, Tp const, reference > dispose_param_type
Definition: AutoDispose.h:101
reference operator*() const
Reference to the Tp object.
Definition: AutoDispose.h:139
void reset()
Reset to default Ctor values.
Definition: AutoDispose.h:147
shared_ptr< Impl > _pimpl
Definition: AutoDispose.h:190
void swap(AutoDispose &rhs)
Exchange the contents of two AutoDispose objects.
Definition: AutoDispose.h:151
void swapDispose(Dispose &dispose_r)
Exchange the dispose function.
Definition: AutoDispose.h:168
boost::call_traits< Tp >::param_type param_type
Definition: AutoDispose.h:96
boost::call_traits< Tp >::reference reference
Definition: AutoDispose.h:97
boost::call_traits< Tp >::const_reference const_reference
Definition: AutoDispose.h:98
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
Definition: AutoDispose.h:160
boost::call_traits< Tp >::value_type result_type
Definition: AutoDispose.h:100
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
std::ostream & operator<<(std::ostream &str, const Exception &obj)
Definition: Exception.cc:147
AutoDispose< void > OnScopeExit
Definition: AutoDispose.h:267
Impl(param_type value_r)
Definition: AutoDispose.h:174
AutoFD(int fd_r=-1)
Definition: AutoDispose.h:284
AutoFILE(FILE *file_r=nullptr)
Definition: AutoDispose.h:295
AutoFREE(Tp *ptr_r=nullptr)
Definition: AutoDispose.h:306