xref: /haiku/headers/private/media/TMap.h (revision 1299bfb29f6155daaa6117fec04f9054e0dc24b6)
19b9d18dcSbeveloper #ifndef _MEDIA_T_MAP_H
29b9d18dcSbeveloper #define _MEDIA_T_MAP_H
352a38012Sejakowatz 
452a38012Sejakowatz template<class key, class value> class Map
552a38012Sejakowatz {
652a38012Sejakowatz public:
752a38012Sejakowatz 	Map() : count(0) {}
852a38012Sejakowatz 
9*1299bfb2Sbeveloper 	bool Insert(const key &k, const value &v)
1052a38012Sejakowatz 	{
1152a38012Sejakowatz 		value temp;
1252a38012Sejakowatz 		if (count == MAXENT) debugger("template Map out of memory");
1352a38012Sejakowatz 		if (Get(k, &temp)) debugger("template Map inserting duplicate key");
1452a38012Sejakowatz 		list[count].k = k;
1552a38012Sejakowatz 		list[count].v = v;
1652a38012Sejakowatz 		count++;
17*1299bfb2Sbeveloper 		return true;
1852a38012Sejakowatz 	}
1952a38012Sejakowatz 
2052a38012Sejakowatz 	bool Get(const key &k, value *v)
2152a38012Sejakowatz 	{
2252a38012Sejakowatz 		for (int i = 0; i < count; i++)
2352a38012Sejakowatz 			if (list[i].k == k) {
2452a38012Sejakowatz 				*v = list[i].v;
2552a38012Sejakowatz 				return true;
2652a38012Sejakowatz 			}
2752a38012Sejakowatz 		return false;
2852a38012Sejakowatz 	}
2952a38012Sejakowatz 
3052a38012Sejakowatz 	// you can't Remove() while iterating through the map using GetAt()
3152a38012Sejakowatz 	bool GetAt(int32 index, value *v)
3252a38012Sejakowatz 	{
3352a38012Sejakowatz 		if (index < 0 || index >= count)
3452a38012Sejakowatz 			return false;
3552a38012Sejakowatz 		*v = list[index].v;
3652a38012Sejakowatz 		return true;
3752a38012Sejakowatz 	}
3852a38012Sejakowatz 
399b9d18dcSbeveloper 	bool GetPointer(const key &k, value **v)
409b9d18dcSbeveloper 	{
419b9d18dcSbeveloper 		for (int i = 0; i < count; i++)
429b9d18dcSbeveloper 			if (list[i].k == k) {
439b9d18dcSbeveloper 				*v = &(list[i].v);
449b9d18dcSbeveloper 				return true;
459b9d18dcSbeveloper 			}
469b9d18dcSbeveloper 		return false;
479b9d18dcSbeveloper 	}
489b9d18dcSbeveloper 
499b9d18dcSbeveloper 	// you can't Remove() while iterating through the map using GetAt()
509b9d18dcSbeveloper 	bool GetPointerAt(int32 index, value **v)
519b9d18dcSbeveloper 	{
529b9d18dcSbeveloper 		if (index < 0 || index >= count)
539b9d18dcSbeveloper 			return false;
549b9d18dcSbeveloper 		*v = &(list[index].v);
559b9d18dcSbeveloper 		return true;
569b9d18dcSbeveloper 	}
579b9d18dcSbeveloper 
5852a38012Sejakowatz 	// you can't Remove() while iterating through the map using GetAt()
5952a38012Sejakowatz 	bool Remove(const key &k)
6052a38012Sejakowatz 	{
6152a38012Sejakowatz 		for (int i = 0; i < count; i++)
6252a38012Sejakowatz 			if (list[i].k == k) {
6352a38012Sejakowatz 				count--;
6452a38012Sejakowatz 				if (count > 0) {
6552a38012Sejakowatz 					list[i].v = list[count].v;
6652a38012Sejakowatz 					list[i].k = list[count].k;
6752a38012Sejakowatz 				}
6852a38012Sejakowatz 				return true;
6952a38012Sejakowatz 			}
7052a38012Sejakowatz 		return false;
7152a38012Sejakowatz 	}
7252a38012Sejakowatz 
7352a38012Sejakowatz private:
7452a38012Sejakowatz 	enum { MAXENT = 64 };
7552a38012Sejakowatz 	struct ent {
7652a38012Sejakowatz 		key k;
7752a38012Sejakowatz 		value v;
7852a38012Sejakowatz 	};
7952a38012Sejakowatz 	ent list[MAXENT];
8052a38012Sejakowatz 	int count;
8152a38012Sejakowatz };
8252a38012Sejakowatz 
839b9d18dcSbeveloper #endif // _MEDIA_T_MAP_H
84