1731be7ddSAugustin Cavalier/*
2731be7ddSAugustin Cavalier * Copyright 2003, Ingo Weinhold, ingo_weinhold@gmx.de.
3731be7ddSAugustin Cavalier * All rights reserved. Distributed under the terms of the MIT license.
4731be7ddSAugustin Cavalier */
549c2f687SWaldemar Kornewald#ifndef TEMPLATE_LIST_H
649c2f687SWaldemar Kornewald#define TEMPLATE_LIST_H
7de2f76e1SWaldemar Kornewald
8e7452421SWaldemar Kornewald#ifdef _KERNEL_MODE
9e7452421SWaldemar Kornewald	#include <kernel_cpp.h>
10ad0928ebSWaldemar Kornewald#else
11758b1d0eSIngo Weinhold	#include <new>
12e7452421SWaldemar Kornewald#endif
13e7452421SWaldemar Kornewald
14de2f76e1SWaldemar Kornewald#include <stdlib.h>
15de2f76e1SWaldemar Kornewald#include <string.h>
16de2f76e1SWaldemar Kornewald
17de2f76e1SWaldemar Kornewald#include <SupportDefs.h>
18de2f76e1SWaldemar Kornewald
19de2f76e1SWaldemar Kornewaldtemplate<typename ITEM>
20de2f76e1SWaldemar Kornewaldclass DefaultDefaultItemCreator {
21de2f76e1SWaldemar Kornewaldpublic:
22de2f76e1SWaldemar Kornewald	static inline ITEM GetItem() { return ITEM(0); }
23de2f76e1SWaldemar Kornewald};
24de2f76e1SWaldemar Kornewald
25de2f76e1SWaldemar Kornewald/*!
2649c2f687SWaldemar Kornewald	\class TemplateList
27de2f76e1SWaldemar Kornewald	\brief A generic list implementation.
28de2f76e1SWaldemar Kornewald*/
29de2f76e1SWaldemar Kornewaldtemplate<typename ITEM,
30de2f76e1SWaldemar Kornewald		 typename DEFAULT_ITEM_SUPPLIER = DefaultDefaultItemCreator<ITEM> >
3149c2f687SWaldemar Kornewaldclass TemplateList {
32de2f76e1SWaldemar Kornewaldpublic:
33de2f76e1SWaldemar Kornewald	typedef ITEM					item_t;
3449c2f687SWaldemar Kornewald	typedef TemplateList			list_t;
35de2f76e1SWaldemar Kornewald
36de2f76e1SWaldemar Kornewaldprivate:
37de2f76e1SWaldemar Kornewald	static item_t					sDefaultItem;
38de2f76e1SWaldemar Kornewald	static const size_t				kDefaultChunkSize = 10;
39de2f76e1SWaldemar Kornewald	static const size_t				kMaximalChunkSize = 1024 * 1024;
40de2f76e1SWaldemar Kornewald
41de2f76e1SWaldemar Kornewaldpublic:
4249c2f687SWaldemar Kornewald	TemplateList(size_t chunkSize = kDefaultChunkSize);
4349c2f687SWaldemar Kornewald	~TemplateList();
44de2f76e1SWaldemar Kornewald
45de2f76e1SWaldemar Kornewald	inline const item_t &GetDefaultItem() const;
46de2f76e1SWaldemar Kornewald	inline item_t &GetDefaultItem();
47de2f76e1SWaldemar Kornewald
48de2f76e1SWaldemar Kornewald	bool AddItem(const item_t &item, int32 index);
49de2f76e1SWaldemar Kornewald	bool AddItem(const item_t &item);
50de2f76e1SWaldemar Kornewald//	bool AddList(list_t *list, int32 index);
51de2f76e1SWaldemar Kornewald//	bool AddList(list_t *list);
52de2f76e1SWaldemar Kornewald
53de2f76e1SWaldemar Kornewald	bool RemoveItem(const item_t &item);
54de2f76e1SWaldemar Kornewald	bool RemoveItem(int32 index);
55de2f76e1SWaldemar Kornewald
56de2f76e1SWaldemar Kornewald	bool ReplaceItem(int32 index, const item_t &item);
57de2f76e1SWaldemar Kornewald
58de2f76e1SWaldemar Kornewald	bool MoveItem(int32 oldIndex, int32 newIndex);
59de2f76e1SWaldemar Kornewald
60de2f76e1SWaldemar Kornewald	void MakeEmpty();
61de2f76e1SWaldemar Kornewald
62de2f76e1SWaldemar Kornewald	int32 CountItems() const;
63de2f76e1SWaldemar Kornewald	bool IsEmpty() const;
64de2f76e1SWaldemar Kornewald	const item_t &ItemAt(int32 index) const;
65de2f76e1SWaldemar Kornewald	item_t &ItemAt(int32 index);
66de2f76e1SWaldemar Kornewald	const item_t *Items() const;
67de2f76e1SWaldemar Kornewald	int32 IndexOf(const item_t &item) const;
68de2f76e1SWaldemar Kornewald	bool HasItem(const item_t &item) const;
69de2f76e1SWaldemar Kornewald
70de2f76e1SWaldemar Kornewald	// debugging
71de2f76e1SWaldemar Kornewald	int32 GetCapacity() const	{ return fCapacity; }
72de2f76e1SWaldemar Kornewald
73de2f76e1SWaldemar Kornewaldprivate:
74de2f76e1SWaldemar Kornewald	inline static void _MoveItems(item_t* items, int32 offset, int32 count);
75de2f76e1SWaldemar Kornewald	bool _Resize(size_t count);
76de2f76e1SWaldemar Kornewald
77de2f76e1SWaldemar Kornewaldprivate:
78de2f76e1SWaldemar Kornewald	size_t	fCapacity;
79de2f76e1SWaldemar Kornewald	size_t	fChunkSize;
80de2f76e1SWaldemar Kornewald	int32	fItemCount;
81de2f76e1SWaldemar Kornewald	item_t	*fItems;
82de2f76e1SWaldemar Kornewald};
83de2f76e1SWaldemar Kornewald
84de2f76e1SWaldemar Kornewald// sDefaultItem
85de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
86758b1d0eSIngo Weinholdtypename TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t
8749c2f687SWaldemar Kornewald	TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::sDefaultItem(
88de2f76e1SWaldemar Kornewald		DEFAULT_ITEM_SUPPLIER::GetItem());
89de2f76e1SWaldemar Kornewald
90de2f76e1SWaldemar Kornewald// constructor
91de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
9249c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::TemplateList(size_t chunkSize)
93de2f76e1SWaldemar Kornewald	: fCapacity(0),
94de2f76e1SWaldemar Kornewald	  fChunkSize(chunkSize),
95de2f76e1SWaldemar Kornewald	  fItemCount(0),
96de2f76e1SWaldemar Kornewald	  fItems(NULL)
97de2f76e1SWaldemar Kornewald{
98de2f76e1SWaldemar Kornewald	if (fChunkSize == 0 || fChunkSize > kMaximalChunkSize)
99de2f76e1SWaldemar Kornewald		fChunkSize = kDefaultChunkSize;
100de2f76e1SWaldemar Kornewald	_Resize(0);
101de2f76e1SWaldemar Kornewald}
102de2f76e1SWaldemar Kornewald
103de2f76e1SWaldemar Kornewald// destructor
104de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
10549c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::~TemplateList()
106de2f76e1SWaldemar Kornewald{
107de2f76e1SWaldemar Kornewald	MakeEmpty();
108de2f76e1SWaldemar Kornewald	free(fItems);
109de2f76e1SWaldemar Kornewald}
110de2f76e1SWaldemar Kornewald
111de2f76e1SWaldemar Kornewald// GetDefaultItem
112de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
113de2f76e1SWaldemar Kornewaldinline
114758b1d0eSIngo Weinholdconst typename TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
11549c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::GetDefaultItem() const
116de2f76e1SWaldemar Kornewald{
117de2f76e1SWaldemar Kornewald	return sDefaultItem;
118de2f76e1SWaldemar Kornewald}
119de2f76e1SWaldemar Kornewald
120de2f76e1SWaldemar Kornewald// GetDefaultItem
121de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
122de2f76e1SWaldemar Kornewaldinline
123758b1d0eSIngo Weinholdtypename TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
12449c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::GetDefaultItem()
125de2f76e1SWaldemar Kornewald{
126de2f76e1SWaldemar Kornewald	return sDefaultItem;
127de2f76e1SWaldemar Kornewald}
128de2f76e1SWaldemar Kornewald
129de2f76e1SWaldemar Kornewald// _MoveItems
130de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
131de2f76e1SWaldemar Kornewaldinline
132de2f76e1SWaldemar Kornewaldvoid
13349c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::_MoveItems(item_t* items, int32 offset, int32 count)
134de2f76e1SWaldemar Kornewald{
135de2f76e1SWaldemar Kornewald	if (count > 0 && offset != 0)
136de2f76e1SWaldemar Kornewald		memmove(items + offset, items, count * sizeof(item_t));
137de2f76e1SWaldemar Kornewald}
138de2f76e1SWaldemar Kornewald
139de2f76e1SWaldemar Kornewald// AddItem
140de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
141de2f76e1SWaldemar Kornewaldbool
14249c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddItem(const item_t &item, int32 index)
143de2f76e1SWaldemar Kornewald{
144de2f76e1SWaldemar Kornewald	bool result = (index >= 0 && index <= fItemCount
145de2f76e1SWaldemar Kornewald				   && _Resize(fItemCount + 1));
146de2f76e1SWaldemar Kornewald	if (result) {
147de2f76e1SWaldemar Kornewald		_MoveItems(fItems + index, 1, fItemCount - index - 1);
148de2f76e1SWaldemar Kornewald		new(fItems + index) item_t(item);
149de2f76e1SWaldemar Kornewald	}
150de2f76e1SWaldemar Kornewald	return result;
151de2f76e1SWaldemar Kornewald}
152de2f76e1SWaldemar Kornewald
153de2f76e1SWaldemar Kornewald// AddItem
154de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
155de2f76e1SWaldemar Kornewaldbool
15649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddItem(const item_t &item)
157de2f76e1SWaldemar Kornewald{
158de2f76e1SWaldemar Kornewald	bool result = true;
159de2f76e1SWaldemar Kornewald	if ((int32)fCapacity > fItemCount) {
160de2f76e1SWaldemar Kornewald		new(fItems + fItemCount) item_t(item);
161de2f76e1SWaldemar Kornewald		fItemCount++;
162de2f76e1SWaldemar Kornewald	} else {
163de2f76e1SWaldemar Kornewald		if ((result = _Resize(fItemCount + 1)))
164de2f76e1SWaldemar Kornewald			new(fItems + (fItemCount - 1)) item_t(item);
165de2f76e1SWaldemar Kornewald	}
166de2f76e1SWaldemar Kornewald	return result;
167de2f76e1SWaldemar Kornewald}
168de2f76e1SWaldemar Kornewald
169de2f76e1SWaldemar Kornewald// These don't use the copy constructor!
170de2f76e1SWaldemar Kornewald/*
171de2f76e1SWaldemar Kornewald// AddList
172de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
173de2f76e1SWaldemar Kornewaldbool
17449c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddList(list_t *list, int32 index)
175de2f76e1SWaldemar Kornewald{
176de2f76e1SWaldemar Kornewald	bool result = (list && index >= 0 && index <= fItemCount);
177de2f76e1SWaldemar Kornewald	if (result && list->fItemCount > 0) {
178de2f76e1SWaldemar Kornewald		int32 count = list->fItemCount;
179de2f76e1SWaldemar Kornewald		result = _Resize(fItemCount + count);
180de2f76e1SWaldemar Kornewald		if (result) {
181de2f76e1SWaldemar Kornewald			_MoveItems(fItems + index, count, fItemCount - index - count);
182de2f76e1SWaldemar Kornewald			memcpy(fItems + index, list->fItems,
183de2f76e1SWaldemar Kornewald				   list->fItemCount * sizeof(item_t));
184de2f76e1SWaldemar Kornewald		}
185de2f76e1SWaldemar Kornewald	}
186de2f76e1SWaldemar Kornewald	return result;
187de2f76e1SWaldemar Kornewald}
188de2f76e1SWaldemar Kornewald
189de2f76e1SWaldemar Kornewald// AddList
190de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
191de2f76e1SWaldemar Kornewaldbool
19249c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddList(list_t *list)
193de2f76e1SWaldemar Kornewald{
194de2f76e1SWaldemar Kornewald	bool result = (list);
195de2f76e1SWaldemar Kornewald	if (result && list->fItemCount > 0) {
196de2f76e1SWaldemar Kornewald		int32 index = fItemCount;
197de2f76e1SWaldemar Kornewald		int32 count = list->fItemCount;
198de2f76e1SWaldemar Kornewald		result = _Resize(fItemCount + count);
199de2f76e1SWaldemar Kornewald		if (result) {
200de2f76e1SWaldemar Kornewald			memcpy(fItems + index, list->fItems,
201de2f76e1SWaldemar Kornewald				   list->fItemCount * sizeof(item_t));
202de2f76e1SWaldemar Kornewald		}
203de2f76e1SWaldemar Kornewald	}
204de2f76e1SWaldemar Kornewald	return result;
205de2f76e1SWaldemar Kornewald}
206de2f76e1SWaldemar Kornewald*/
207de2f76e1SWaldemar Kornewald
208de2f76e1SWaldemar Kornewald// RemoveItem
209de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
210de2f76e1SWaldemar Kornewaldbool
21149c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::RemoveItem(const item_t &item)
212de2f76e1SWaldemar Kornewald{
213de2f76e1SWaldemar Kornewald	int32 index = IndexOf(item);
214de2f76e1SWaldemar Kornewald	bool result = (index >= 0);
215de2f76e1SWaldemar Kornewald	if (result)
216de2f76e1SWaldemar Kornewald		RemoveItem(index);
217de2f76e1SWaldemar Kornewald	return result;
218de2f76e1SWaldemar Kornewald}
219de2f76e1SWaldemar Kornewald
220de2f76e1SWaldemar Kornewald// RemoveItem
221de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
222de2f76e1SWaldemar Kornewaldbool
22349c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::RemoveItem(int32 index)
224de2f76e1SWaldemar Kornewald{
225de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount) {
226de2f76e1SWaldemar Kornewald		fItems[index].~item_t();
227de2f76e1SWaldemar Kornewald		_MoveItems(fItems + index + 1, -1, fItemCount - index - 1);
228de2f76e1SWaldemar Kornewald		_Resize(fItemCount - 1);
229de2f76e1SWaldemar Kornewald		return true;
230de2f76e1SWaldemar Kornewald	}
231de2f76e1SWaldemar Kornewald	return false;
232de2f76e1SWaldemar Kornewald}
233de2f76e1SWaldemar Kornewald
234de2f76e1SWaldemar Kornewald// ReplaceItem
235de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
236de2f76e1SWaldemar Kornewaldbool
23749c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::ReplaceItem(int32 index, const item_t &item)
238de2f76e1SWaldemar Kornewald{
239de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount) {
240de2f76e1SWaldemar Kornewald		fItems[index] = item;
241de2f76e1SWaldemar Kornewald		return true;
242de2f76e1SWaldemar Kornewald	}
243de2f76e1SWaldemar Kornewald	return false;
244de2f76e1SWaldemar Kornewald}
245de2f76e1SWaldemar Kornewald
246de2f76e1SWaldemar Kornewald// MoveItem
247de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
248de2f76e1SWaldemar Kornewaldbool
24949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::MoveItem(int32 oldIndex, int32 newIndex)
250de2f76e1SWaldemar Kornewald{
251de2f76e1SWaldemar Kornewald	if (oldIndex >= 0 && oldIndex < fItemCount
252de2f76e1SWaldemar Kornewald		&& newIndex >= 0 && newIndex <= fItemCount) {
253de2f76e1SWaldemar Kornewald		if (oldIndex < newIndex - 1) {
254de2f76e1SWaldemar Kornewald			item_t item = fItems[oldIndex];
255de2f76e1SWaldemar Kornewald			_MoveItems(fItems + oldIndex + 1, -1, newIndex - oldIndex - 1);
256de2f76e1SWaldemar Kornewald			fItems[newIndex] = item;
257de2f76e1SWaldemar Kornewald		} else if (oldIndex > newIndex) {
258de2f76e1SWaldemar Kornewald			item_t item = fItems[oldIndex];
259de2f76e1SWaldemar Kornewald			_MoveItems(fItems + newIndex, 1, oldIndex - newIndex);
260de2f76e1SWaldemar Kornewald			fItems[newIndex] = item;
261de2f76e1SWaldemar Kornewald		}
262de2f76e1SWaldemar Kornewald		return true;
263de2f76e1SWaldemar Kornewald	}
264de2f76e1SWaldemar Kornewald	return false;
265de2f76e1SWaldemar Kornewald}
266de2f76e1SWaldemar Kornewald
267de2f76e1SWaldemar Kornewald// MakeEmpty
268de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
269de2f76e1SWaldemar Kornewaldvoid
27049c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::MakeEmpty()
271de2f76e1SWaldemar Kornewald{
272de2f76e1SWaldemar Kornewald	for (int32 i = 0; i < fItemCount; i++)
273de2f76e1SWaldemar Kornewald		fItems[i].~item_t();
274de2f76e1SWaldemar Kornewald	_Resize(0);
275de2f76e1SWaldemar Kornewald}
276de2f76e1SWaldemar Kornewald
277de2f76e1SWaldemar Kornewald// CountItems
278de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
279de2f76e1SWaldemar Kornewaldint32
28049c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::CountItems() const
281de2f76e1SWaldemar Kornewald{
282de2f76e1SWaldemar Kornewald	return fItemCount;
283de2f76e1SWaldemar Kornewald}
284de2f76e1SWaldemar Kornewald
285de2f76e1SWaldemar Kornewald// IsEmpty
286de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
287de2f76e1SWaldemar Kornewaldbool
28849c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::IsEmpty() const
289de2f76e1SWaldemar Kornewald{
290de2f76e1SWaldemar Kornewald	return (fItemCount == 0);
291de2f76e1SWaldemar Kornewald}
292de2f76e1SWaldemar Kornewald
293de2f76e1SWaldemar Kornewald// ItemAt
294de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
295758b1d0eSIngo Weinholdconst typename TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
29649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::ItemAt(int32 index) const
297de2f76e1SWaldemar Kornewald{
298de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount)
299de2f76e1SWaldemar Kornewald		return fItems[index];
300de2f76e1SWaldemar Kornewald	return sDefaultItem;
301de2f76e1SWaldemar Kornewald}
302de2f76e1SWaldemar Kornewald
303de2f76e1SWaldemar Kornewald// ItemAt
304de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
305758b1d0eSIngo Weinholdtypename TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
30649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::ItemAt(int32 index)
307de2f76e1SWaldemar Kornewald{
308de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount)
309de2f76e1SWaldemar Kornewald		return fItems[index];
310de2f76e1SWaldemar Kornewald	return sDefaultItem;
311de2f76e1SWaldemar Kornewald}
312de2f76e1SWaldemar Kornewald
313de2f76e1SWaldemar Kornewald// Items
314de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
315758b1d0eSIngo Weinholdconst typename TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t *
31649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::Items() const
317de2f76e1SWaldemar Kornewald{
318de2f76e1SWaldemar Kornewald	return fItems;
319de2f76e1SWaldemar Kornewald}
320de2f76e1SWaldemar Kornewald
321de2f76e1SWaldemar Kornewald// IndexOf
322de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
323de2f76e1SWaldemar Kornewaldint32
32449c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::IndexOf(const item_t &item) const
325de2f76e1SWaldemar Kornewald{
326de2f76e1SWaldemar Kornewald	for (int32 i = 0; i < fItemCount; i++) {
327de2f76e1SWaldemar Kornewald		if (fItems[i] == item)
328de2f76e1SWaldemar Kornewald			return i;
329de2f76e1SWaldemar Kornewald	}
330de2f76e1SWaldemar Kornewald	return -1;
331de2f76e1SWaldemar Kornewald}
332de2f76e1SWaldemar Kornewald
333de2f76e1SWaldemar Kornewald// HasItem
334de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
335de2f76e1SWaldemar Kornewaldbool
33649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::HasItem(const item_t &item) const
337de2f76e1SWaldemar Kornewald{
338de2f76e1SWaldemar Kornewald	return (IndexOf(item) >= 0);
339de2f76e1SWaldemar Kornewald}
340de2f76e1SWaldemar Kornewald
341de2f76e1SWaldemar Kornewald// _Resize
342de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
343de2f76e1SWaldemar Kornewaldbool
34449c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::_Resize(size_t count)
345de2f76e1SWaldemar Kornewald{
346de2f76e1SWaldemar Kornewald	bool result = true;
347de2f76e1SWaldemar Kornewald	// calculate the new capacity
348de2f76e1SWaldemar Kornewald	int32 newSize = count;
349de2f76e1SWaldemar Kornewald	if (newSize <= 0)
350de2f76e1SWaldemar Kornewald		newSize = 1;
351de2f76e1SWaldemar Kornewald	newSize = ((newSize - 1) / fChunkSize + 1) * fChunkSize;
352de2f76e1SWaldemar Kornewald	// resize if necessary
353de2f76e1SWaldemar Kornewald	if ((size_t)newSize != fCapacity) {
354de2f76e1SWaldemar Kornewald		item_t* newItems
355de2f76e1SWaldemar Kornewald			= (item_t*)realloc(fItems, newSize * sizeof(item_t));
356de2f76e1SWaldemar Kornewald		if (newItems) {
357de2f76e1SWaldemar Kornewald			fItems = newItems;
358de2f76e1SWaldemar Kornewald			fCapacity = newSize;
359de2f76e1SWaldemar Kornewald		} else
360de2f76e1SWaldemar Kornewald			result = false;
361de2f76e1SWaldemar Kornewald	}
362de2f76e1SWaldemar Kornewald	if (result)
363de2f76e1SWaldemar Kornewald		fItemCount = count;
364de2f76e1SWaldemar Kornewald	return result;
365de2f76e1SWaldemar Kornewald}
366de2f76e1SWaldemar Kornewald
367de2f76e1SWaldemar Kornewald#endif	// LIST_H
368