1//------------------------------------------------------------------------------
2//	Copyright (c) 2001-2004, OpenBeOS
3//
4//	Permission is hereby granted, free of charge, to any person obtaining a
5//	copy of this software and associated documentation files (the "Software"),
6//	to deal in the Software without restriction, including without limitation
7//	the rights to use, copy, modify, merge, publish, distribute, sublicense,
8//	and/or sell copies of the Software, and to permit persons to whom the
9//	Software is furnished to do so, subject to the following conditions:
10//
11//	The above copyright notice and this permission notice shall be included in
12//	all copies or substantial portions of the Software.
13//
14//	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15//	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16//	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17//	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18//	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19//	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20//	DEALINGS IN THE SOFTWARE.
21//
22//	File Name:		AutoDeleter.h
23//	Author(s):		Ingo Weinhold (bonefish@users.sf.net)
24//	Description:	Scope-based automatic deletion of objects/arrays.
25//					ObjectDeleter - deletes an object
26//					ArrayDeleter  - deletes an array
27//					MemoryDeleter - free()s malloc()ed memory
28//------------------------------------------------------------------------------
29
30#ifndef _AUTO_DELETER_H
31#define _AUTO_DELETER_H
32
33#include <stdlib.h>
34
35namespace BPrivate {
36
37// AutoDeleter
38
39template<typename C, typename Delete>
40class AutoDeleter {
41public:
42	inline AutoDeleter()
43		: fObject(NULL)
44	{
45	}
46
47	inline AutoDeleter(C *object)
48		: fObject(object)
49	{
50	}
51
52	inline ~AutoDeleter()
53	{
54		fDelete(fObject);
55	}
56
57	inline void SetTo(C *object)
58	{
59		fDelete(fObject);
60		fObject = object;
61	}
62
63	inline C *Detach()
64	{
65		C *object = fObject;
66		fObject = NULL;
67		return object;
68	}
69
70private:
71	C		*fObject;
72	Delete	fDelete;
73};
74
75
76// ObjectDeleter
77
78template<typename C>
79struct ObjectDelete
80{
81	inline void operator()(C *object)
82	{
83		delete object;
84	}
85};
86
87template<typename C>
88struct ObjectDeleter : AutoDeleter<C, ObjectDelete<C> >
89{
90	ObjectDeleter() : AutoDeleter<C, ObjectDelete<C> >() {}
91	ObjectDeleter(C *object) : AutoDeleter<C, ObjectDelete<C> >(object) {}
92};
93
94
95// ArrayDeleter
96
97template<typename C>
98struct ArrayDelete
99{
100	inline void operator()(C *array)
101	{
102		delete[] array;
103	}
104};
105
106template<typename C>
107struct ArrayDeleter : AutoDeleter<C, ArrayDelete<C> >
108{
109	ArrayDeleter() : AutoDeleter<C, ArrayDelete<C> >() {}
110	ArrayDeleter(C *array) : AutoDeleter<C, ArrayDelete<C> >(array) {}
111};
112
113
114// MemoryDeleter
115
116struct MemoryDelete
117{
118	inline void operator()(void *memory)
119	{
120		free(memory);
121	}
122};
123
124struct MemoryDeleter : AutoDeleter<void, MemoryDelete >
125{
126	MemoryDeleter() : AutoDeleter<void, MemoryDelete >() {}
127	MemoryDeleter(void *memory) : AutoDeleter<void, MemoryDelete >(memory) {}
128};
129
130}	// namespace BPrivate
131
132using BPrivate::ObjectDeleter;
133using BPrivate::ArrayDeleter;
134using BPrivate::MemoryDeleter;
135
136#endif	// _AUTO_DELETER_H
137