1/*
2 * Copyright 2008, Haiku.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Michael Pfeiffer <laplace@users.sourceforge.net>
7 */
8
9#ifndef _AUTO_DELETE_H
10#define _AUTO_DELETE_H
11
12#include <stdlib.h>
13
14/*
15Typical usage of this class:
16
17AClass* Klass::Method(int arg) {
18	AutoDelete<AClass> variable(new AClass());
19
20	if (!IsValid(arg)) {
21		...
22		// AutoDelete automatically deletes the AClass object.
23		return NULL;
24	}
25
26	variable.Get()->MethodOfAClass();
27
28	// Use Release() to prevent deletion of AClass object.
29	return variable.Release();
30}
31*/
32
33template <class Tp>
34class AutoDelete {
35private:
36	Tp*  fObject;
37	bool fOwnsObject;
38
39	// Deletes the object if it owns it
40	void Delete()
41	{
42		if (fOwnsObject) {
43			delete fObject; fObject = NULL;
44		}
45	}
46
47public:
48
49	// Sets the object the class owns
50	AutoDelete(Tp* object = NULL) : fObject(object), fOwnsObject(true) { }
51
52	// Deletes the object if it owns it
53	virtual ~AutoDelete()
54	{
55		Delete();
56	}
57
58	// Sets the object the class owns.
59	// Deletes a previously owned object and
60	// sets the owning flag for the new object.
61	void Set(Tp* object)
62	{
63		if (fObject == object) return;
64
65		Delete();
66		fOwnsObject = true;
67		fObject = object;
68	}
69
70	// Returns the object
71	Tp* Get()
72	{
73		return fObject;
74	}
75
76	// Returns the object and sets owning to false
77	// The Get method can still be used to retrieve the object.
78	Tp* Release()
79	{
80		fOwnsObject = false;
81		return fObject;
82	}
83
84	// Sets the owning flag
85	void SetOwnsObject(bool ownsObject)
86	{
87		fOwnsObject = ownsObject;
88	}
89};
90
91
92#endif
93