1//------------------------------------------------------------------------------
2//	Helpers.h
3//
4//------------------------------------------------------------------------------
5
6#ifndef HELPERS_H
7#define HELPERS_H
8
9// Standard Includes -----------------------------------------------------------
10
11// System Includes -------------------------------------------------------------
12#include <Looper.h>
13
14// Project Includes ------------------------------------------------------------
15
16// Local Includes --------------------------------------------------------------
17
18// Local Defines ---------------------------------------------------------------
19
20// Globals ---------------------------------------------------------------------
21
22
23// helper class: quits a BLooper on destruction
24class LooperQuitter {
25public:
26	inline LooperQuitter(BLooper *looper) : fLooper(looper) {}
27	inline ~LooperQuitter()
28	{
29		fLooper->Lock();
30		fLooper->Quit();
31	}
32
33private:
34	BLooper	*fLooper;
35};
36
37// helper class: deletes an object on destruction
38template<typename T>
39class AutoDeleter {
40public:
41	inline AutoDeleter(T *object, bool array = false)
42		: fObject(object), fArray(array) {}
43	inline ~AutoDeleter()
44	{
45		if (fArray)
46			delete[] fObject;
47		else
48			delete fObject;
49	}
50
51protected:
52	T		*fObject;
53	bool	fArray;
54};
55
56// helper class: deletes an BHandler on destruction
57class HandlerDeleter : AutoDeleter<BHandler> {
58public:
59	inline HandlerDeleter(BHandler *handler)
60		: AutoDeleter<BHandler>(handler) {}
61	inline ~HandlerDeleter()
62	{
63		if (fObject) {
64			if (BLooper *looper = fObject->Looper()) {
65				looper->Lock();
66				looper->RemoveHandler(fObject);
67				looper->Unlock();
68			}
69		}
70	}
71};
72
73// helper function: return the this team's ID
74static inline
75team_id
76get_this_team()
77{
78	thread_info info;
79	get_thread_info(find_thread(NULL), &info);
80	return info.team;
81}
82
83#endif	// HELPERS_H
84