2 * Copyright 2001-2007, Ingo Weinhold, bonefish@users.sf.net. All rights reserved.
3 * Distributed under the terms of the MIT License.
5 #ifndef _AUTO_DELETER_H
6 #define _AUTO_DELETER_H
9 /*! Scope-based automatic deletion of objects/arrays.
10 ObjectDeleter - deletes an object
11 ArrayDeleter - deletes an array
12 MemoryDeleter - free()s malloc()ed memory
13 CObjectDeleter - calls an arbitrary specified destructor function
14 FileDescriptorCloser - closes a file descriptor
27 template<typename C
, typename DeleteFunc
>
35 inline AutoDeleter(C
*object
)
45 inline void SetTo(C
*object
)
47 if (object
!= fObject
) {
75 inline C
*operator->() const
91 inline void operator()(C
*object
)
98 struct ObjectDeleter
: AutoDeleter
<C
, ObjectDelete
<C
> >
100 ObjectDeleter() : AutoDeleter
<C
, ObjectDelete
<C
> >() {}
101 ObjectDeleter(C
*object
) : AutoDeleter
<C
, ObjectDelete
<C
> >(object
) {}
110 inline void operator()(C
*array
)
117 struct ArrayDeleter
: AutoDeleter
<C
, ArrayDelete
<C
> >
119 ArrayDeleter() : AutoDeleter
<C
, ArrayDelete
<C
> >() {}
120 ArrayDeleter(C
*array
) : AutoDeleter
<C
, ArrayDelete
<C
> >(array
) {}
128 inline void operator()(void *memory
)
134 struct MemoryDeleter
: AutoDeleter
<void, MemoryDelete
>
136 MemoryDeleter() : AutoDeleter
<void, MemoryDelete
>() {}
137 MemoryDeleter(void *memory
) : AutoDeleter
<void, MemoryDelete
>(memory
) {}
143 template<typename Type
, typename DestructorReturnType
>
146 inline void operator()(Type
*object
)
148 if (fDestructor
!= NULL
&& object
!= NULL
)
152 template<typename Destructor
>
153 inline void operator=(Destructor destructor
)
155 fDestructor
= destructor
;
159 DestructorReturnType (*fDestructor
)(Type
*);
162 template<typename Type
, typename DestructorReturnType
= void>
163 struct CObjectDeleter
164 : AutoDeleter
<Type
, CObjectDelete
<Type
, DestructorReturnType
> >
166 typedef AutoDeleter
<Type
, CObjectDelete
<Type
, DestructorReturnType
> > Base
;
168 template<typename Destructor
>
169 CObjectDeleter(Destructor destructor
) : Base()
171 Base::fDelete
= destructor
;
174 template<typename Destructor
>
175 CObjectDeleter(Type
*object
, Destructor destructor
) : Base(object
)
177 Base::fDelete
= destructor
;
184 template<typename Type
, typename DestructorReturnType
>
187 inline void operator()(Type
*object
)
189 if (fDestructor
&& object
!= NULL
)
190 (object
->*fDestructor
)();
193 template<typename Destructor
>
194 inline void operator=(Destructor destructor
)
196 fDestructor
= destructor
;
200 DestructorReturnType (Type::*fDestructor
)();
204 template<typename Type
, typename DestructorReturnType
= void>
206 : AutoDeleter
<Type
, MethodDelete
<Type
, DestructorReturnType
> >
208 typedef AutoDeleter
<Type
, MethodDelete
<Type
, DestructorReturnType
> > Base
;
210 template<typename Destructor
>
211 MethodDeleter(Destructor destructor
) : Base()
213 Base::fDelete
= destructor
;
216 template<typename Destructor
>
217 MethodDeleter(Type
*object
, Destructor destructor
) : Base(object
)
219 Base::fDelete
= destructor
;
224 // FileDescriptorCloser
226 struct FileDescriptorCloser
{
227 inline FileDescriptorCloser()
233 inline FileDescriptorCloser(int descriptor
)
235 fDescriptor(descriptor
)
239 inline ~FileDescriptorCloser()
244 inline void SetTo(int descriptor
)
246 if (fDescriptor
>= 0)
249 fDescriptor
= descriptor
;
259 int descriptor
= fDescriptor
;
269 } // namespace BPrivate
272 using ::BPrivate::ObjectDeleter
;
273 using ::BPrivate::ArrayDeleter
;
274 using ::BPrivate::MemoryDeleter
;
275 using ::BPrivate::CObjectDeleter
;
276 using ::BPrivate::MethodDeleter
;
277 using ::BPrivate::FileDescriptorCloser
;
280 #endif // _AUTO_DELETER_H