xref: /haiku/headers/private/media/TMap.h (revision 52a380120846174213ccce9c4aab0dda17c72083)
1*52a38012Sejakowatz 
2*52a38012Sejakowatz template<class key, class value> class Map
3*52a38012Sejakowatz {
4*52a38012Sejakowatz public:
5*52a38012Sejakowatz 	Map() : count(0) {}
6*52a38012Sejakowatz 
7*52a38012Sejakowatz 	void Insert(const key &k, const value &v)
8*52a38012Sejakowatz 	{
9*52a38012Sejakowatz 		value temp;
10*52a38012Sejakowatz 		if (count == MAXENT) debugger("template Map out of memory");
11*52a38012Sejakowatz 		if (Get(k, &temp)) debugger("template Map inserting duplicate key");
12*52a38012Sejakowatz 		list[count].k = k;
13*52a38012Sejakowatz 		list[count].v = v;
14*52a38012Sejakowatz 		count++;
15*52a38012Sejakowatz 	}
16*52a38012Sejakowatz 
17*52a38012Sejakowatz 	bool Get(const key &k, value *v)
18*52a38012Sejakowatz 	{
19*52a38012Sejakowatz 		for (int i = 0; i < count; i++)
20*52a38012Sejakowatz 			if (list[i].k == k) {
21*52a38012Sejakowatz 				*v = list[i].v;
22*52a38012Sejakowatz 				return true;
23*52a38012Sejakowatz 			}
24*52a38012Sejakowatz 		return false;
25*52a38012Sejakowatz 	}
26*52a38012Sejakowatz 
27*52a38012Sejakowatz 	// you can't Remove() while iterating through the map using GetAt()
28*52a38012Sejakowatz 	bool GetAt(int32 index, value *v)
29*52a38012Sejakowatz 	{
30*52a38012Sejakowatz 		if (index < 0 || index >= count)
31*52a38012Sejakowatz 			return false;
32*52a38012Sejakowatz 		*v = list[index].v;
33*52a38012Sejakowatz 		return true;
34*52a38012Sejakowatz 	}
35*52a38012Sejakowatz 
36*52a38012Sejakowatz 	// you can't Remove() while iterating through the map using GetAt()
37*52a38012Sejakowatz 	bool Remove(const key &k)
38*52a38012Sejakowatz 	{
39*52a38012Sejakowatz 		for (int i = 0; i < count; i++)
40*52a38012Sejakowatz 			if (list[i].k == k) {
41*52a38012Sejakowatz 				count--;
42*52a38012Sejakowatz 				if (count > 0) {
43*52a38012Sejakowatz 					list[i].v = list[count].v;
44*52a38012Sejakowatz 					list[i].k = list[count].k;
45*52a38012Sejakowatz 				}
46*52a38012Sejakowatz 				return true;
47*52a38012Sejakowatz 			}
48*52a38012Sejakowatz 		return false;
49*52a38012Sejakowatz 	}
50*52a38012Sejakowatz 
51*52a38012Sejakowatz private:
52*52a38012Sejakowatz 	enum { MAXENT = 64 };
53*52a38012Sejakowatz 	struct ent {
54*52a38012Sejakowatz 		key k;
55*52a38012Sejakowatz 		value v;
56*52a38012Sejakowatz 	};
57*52a38012Sejakowatz 	ent list[MAXENT];
58*52a38012Sejakowatz 	int count;
59*52a38012Sejakowatz };
60*52a38012Sejakowatz 
61