TemplateList.h revision 49c2f687
149c2f687SWaldemar Kornewald// TemplateList.h
2de2f76e1SWaldemar Kornewald//
3de2f76e1SWaldemar Kornewald// Copyright (c) 2003, Ingo Weinhold (bonefish@cs.tu-berlin.de)
4de2f76e1SWaldemar Kornewald//
5de2f76e1SWaldemar Kornewald// Permission is hereby granted, free of charge, to any person obtaining a
6de2f76e1SWaldemar Kornewald// copy of this software and associated documentation files (the "Software"),
7de2f76e1SWaldemar Kornewald// to deal in the Software without restriction, including without limitation
8de2f76e1SWaldemar Kornewald// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9de2f76e1SWaldemar Kornewald// and/or sell copies of the Software, and to permit persons to whom the
10de2f76e1SWaldemar Kornewald// Software is furnished to do so, subject to the following conditions:
11de2f76e1SWaldemar Kornewald//
12de2f76e1SWaldemar Kornewald// The above copyright notice and this permission notice shall be included in
13de2f76e1SWaldemar Kornewald// all copies or substantial portions of the Software.
14de2f76e1SWaldemar Kornewald//
15de2f76e1SWaldemar Kornewald// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16de2f76e1SWaldemar Kornewald// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17de2f76e1SWaldemar Kornewald// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18de2f76e1SWaldemar Kornewald// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19de2f76e1SWaldemar Kornewald// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20de2f76e1SWaldemar Kornewald// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21de2f76e1SWaldemar Kornewald// DEALINGS IN THE SOFTWARE.
22de2f76e1SWaldemar Kornewald//
23de2f76e1SWaldemar Kornewald// Except as contained in this notice, the name of a copyright holder shall
24de2f76e1SWaldemar Kornewald// not be used in advertising or otherwise to promote the sale, use or other
25de2f76e1SWaldemar Kornewald// dealings in this Software without prior written authorization of the
26de2f76e1SWaldemar Kornewald// copyright holder.
27de2f76e1SWaldemar Kornewald
2849c2f687SWaldemar Kornewald#ifndef TEMPLATE_LIST_H
2949c2f687SWaldemar Kornewald#define TEMPLATE_LIST_H
30de2f76e1SWaldemar Kornewald
31e7452421SWaldemar Kornewald#ifdef _KERNEL_MODE
32e7452421SWaldemar Kornewald	#include <kernel_cpp.h>
33ad0928ebSWaldemar Kornewald#else
34ad0928ebSWaldemar Kornewald	#include <new.h>
35e7452421SWaldemar Kornewald#endif
36e7452421SWaldemar Kornewald
37de2f76e1SWaldemar Kornewald#include <stdlib.h>
38de2f76e1SWaldemar Kornewald#include <string.h>
39de2f76e1SWaldemar Kornewald
40de2f76e1SWaldemar Kornewald#include <SupportDefs.h>
41de2f76e1SWaldemar Kornewald
42de2f76e1SWaldemar Kornewaldtemplate<typename ITEM>
43de2f76e1SWaldemar Kornewaldclass DefaultDefaultItemCreator {
44de2f76e1SWaldemar Kornewaldpublic:
45de2f76e1SWaldemar Kornewald	static inline ITEM GetItem() { return ITEM(0); }
46de2f76e1SWaldemar Kornewald};
47de2f76e1SWaldemar Kornewald
48de2f76e1SWaldemar Kornewald/*!
4949c2f687SWaldemar Kornewald	\class TemplateList
50de2f76e1SWaldemar Kornewald	\brief A generic list implementation.
51de2f76e1SWaldemar Kornewald*/
52de2f76e1SWaldemar Kornewaldtemplate<typename ITEM,
53de2f76e1SWaldemar Kornewald		 typename DEFAULT_ITEM_SUPPLIER = DefaultDefaultItemCreator<ITEM> >
5449c2f687SWaldemar Kornewaldclass TemplateList {
55de2f76e1SWaldemar Kornewaldpublic:
56de2f76e1SWaldemar Kornewald	typedef ITEM					item_t;
5749c2f687SWaldemar Kornewald	typedef TemplateList			list_t;
58de2f76e1SWaldemar Kornewald
59de2f76e1SWaldemar Kornewaldprivate:
60de2f76e1SWaldemar Kornewald	static item_t					sDefaultItem;
61de2f76e1SWaldemar Kornewald	static const size_t				kDefaultChunkSize = 10;
62de2f76e1SWaldemar Kornewald	static const size_t				kMaximalChunkSize = 1024 * 1024;
63de2f76e1SWaldemar Kornewald
64de2f76e1SWaldemar Kornewaldpublic:
6549c2f687SWaldemar Kornewald	TemplateList(size_t chunkSize = kDefaultChunkSize);
6649c2f687SWaldemar Kornewald	~TemplateList();
67de2f76e1SWaldemar Kornewald
68de2f76e1SWaldemar Kornewald	inline const item_t &GetDefaultItem() const;
69de2f76e1SWaldemar Kornewald	inline item_t &GetDefaultItem();
70de2f76e1SWaldemar Kornewald
71de2f76e1SWaldemar Kornewald	bool AddItem(const item_t &item, int32 index);
72de2f76e1SWaldemar Kornewald	bool AddItem(const item_t &item);
73de2f76e1SWaldemar Kornewald//	bool AddList(list_t *list, int32 index);
74de2f76e1SWaldemar Kornewald//	bool AddList(list_t *list);
75de2f76e1SWaldemar Kornewald
76de2f76e1SWaldemar Kornewald	bool RemoveItem(const item_t &item);
77de2f76e1SWaldemar Kornewald	bool RemoveItem(int32 index);
78de2f76e1SWaldemar Kornewald
79de2f76e1SWaldemar Kornewald	bool ReplaceItem(int32 index, const item_t &item);
80de2f76e1SWaldemar Kornewald
81de2f76e1SWaldemar Kornewald	bool MoveItem(int32 oldIndex, int32 newIndex);
82de2f76e1SWaldemar Kornewald
83de2f76e1SWaldemar Kornewald	void MakeEmpty();
84de2f76e1SWaldemar Kornewald
85de2f76e1SWaldemar Kornewald	int32 CountItems() const;
86de2f76e1SWaldemar Kornewald	bool IsEmpty() const;
87de2f76e1SWaldemar Kornewald	const item_t &ItemAt(int32 index) const;
88de2f76e1SWaldemar Kornewald	item_t &ItemAt(int32 index);
89de2f76e1SWaldemar Kornewald	const item_t *Items() const;
90de2f76e1SWaldemar Kornewald	int32 IndexOf(const item_t &item) const;
91de2f76e1SWaldemar Kornewald	bool HasItem(const item_t &item) const;
92de2f76e1SWaldemar Kornewald
93de2f76e1SWaldemar Kornewald	// debugging
94de2f76e1SWaldemar Kornewald	int32 GetCapacity() const	{ return fCapacity; }
95de2f76e1SWaldemar Kornewald
96de2f76e1SWaldemar Kornewaldprivate:
97de2f76e1SWaldemar Kornewald	inline static void _MoveItems(item_t* items, int32 offset, int32 count);
98de2f76e1SWaldemar Kornewald	bool _Resize(size_t count);
99de2f76e1SWaldemar Kornewald
100de2f76e1SWaldemar Kornewaldprivate:
101de2f76e1SWaldemar Kornewald	size_t	fCapacity;
102de2f76e1SWaldemar Kornewald	size_t	fChunkSize;
103de2f76e1SWaldemar Kornewald	int32	fItemCount;
104de2f76e1SWaldemar Kornewald	item_t	*fItems;
105de2f76e1SWaldemar Kornewald};
106de2f76e1SWaldemar Kornewald
107de2f76e1SWaldemar Kornewald// sDefaultItem
108de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
10949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t
11049c2f687SWaldemar Kornewald	TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::sDefaultItem(
111de2f76e1SWaldemar Kornewald		DEFAULT_ITEM_SUPPLIER::GetItem());
112de2f76e1SWaldemar Kornewald
113de2f76e1SWaldemar Kornewald// constructor
114de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
11549c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::TemplateList(size_t chunkSize)
116de2f76e1SWaldemar Kornewald	: fCapacity(0),
117de2f76e1SWaldemar Kornewald	  fChunkSize(chunkSize),
118de2f76e1SWaldemar Kornewald	  fItemCount(0),
119de2f76e1SWaldemar Kornewald	  fItems(NULL)
120de2f76e1SWaldemar Kornewald{
121de2f76e1SWaldemar Kornewald	if (fChunkSize == 0 || fChunkSize > kMaximalChunkSize)
122de2f76e1SWaldemar Kornewald		fChunkSize = kDefaultChunkSize;
123de2f76e1SWaldemar Kornewald	_Resize(0);
124de2f76e1SWaldemar Kornewald}
125de2f76e1SWaldemar Kornewald
126de2f76e1SWaldemar Kornewald// destructor
127de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
12849c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::~TemplateList()
129de2f76e1SWaldemar Kornewald{
130de2f76e1SWaldemar Kornewald	MakeEmpty();
131de2f76e1SWaldemar Kornewald	free(fItems);
132de2f76e1SWaldemar Kornewald}
133de2f76e1SWaldemar Kornewald
134de2f76e1SWaldemar Kornewald// GetDefaultItem
135de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
136de2f76e1SWaldemar Kornewaldinline
13749c2f687SWaldemar Kornewaldconst TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
13849c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::GetDefaultItem() const
139de2f76e1SWaldemar Kornewald{
140de2f76e1SWaldemar Kornewald	return sDefaultItem;
141de2f76e1SWaldemar Kornewald}
142de2f76e1SWaldemar Kornewald
143de2f76e1SWaldemar Kornewald// GetDefaultItem
144de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
145de2f76e1SWaldemar Kornewaldinline
14649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
14749c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::GetDefaultItem()
148de2f76e1SWaldemar Kornewald{
149de2f76e1SWaldemar Kornewald	return sDefaultItem;
150de2f76e1SWaldemar Kornewald}
151de2f76e1SWaldemar Kornewald
152de2f76e1SWaldemar Kornewald// _MoveItems
153de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
154de2f76e1SWaldemar Kornewaldinline
155de2f76e1SWaldemar Kornewaldvoid
15649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::_MoveItems(item_t* items, int32 offset, int32 count)
157de2f76e1SWaldemar Kornewald{
158de2f76e1SWaldemar Kornewald	if (count > 0 && offset != 0)
159de2f76e1SWaldemar Kornewald		memmove(items + offset, items, count * sizeof(item_t));
160de2f76e1SWaldemar Kornewald}
161de2f76e1SWaldemar Kornewald
162de2f76e1SWaldemar Kornewald// AddItem
163de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
164de2f76e1SWaldemar Kornewaldbool
16549c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddItem(const item_t &item, int32 index)
166de2f76e1SWaldemar Kornewald{
167de2f76e1SWaldemar Kornewald	bool result = (index >= 0 && index <= fItemCount
168de2f76e1SWaldemar Kornewald				   && _Resize(fItemCount + 1));
169de2f76e1SWaldemar Kornewald	if (result) {
170de2f76e1SWaldemar Kornewald		_MoveItems(fItems + index, 1, fItemCount - index - 1);
171de2f76e1SWaldemar Kornewald		new(fItems + index) item_t(item);
172de2f76e1SWaldemar Kornewald	}
173de2f76e1SWaldemar Kornewald	return result;
174de2f76e1SWaldemar Kornewald}
175de2f76e1SWaldemar Kornewald
176de2f76e1SWaldemar Kornewald// AddItem
177de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
178de2f76e1SWaldemar Kornewaldbool
17949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddItem(const item_t &item)
180de2f76e1SWaldemar Kornewald{
181de2f76e1SWaldemar Kornewald	bool result = true;
182de2f76e1SWaldemar Kornewald	if ((int32)fCapacity > fItemCount) {
183de2f76e1SWaldemar Kornewald		new(fItems + fItemCount) item_t(item);
184de2f76e1SWaldemar Kornewald		fItemCount++;
185de2f76e1SWaldemar Kornewald	} else {
186de2f76e1SWaldemar Kornewald		if ((result = _Resize(fItemCount + 1)))
187de2f76e1SWaldemar Kornewald			new(fItems + (fItemCount - 1)) item_t(item);
188de2f76e1SWaldemar Kornewald	}
189de2f76e1SWaldemar Kornewald	return result;
190de2f76e1SWaldemar Kornewald}
191de2f76e1SWaldemar Kornewald
192de2f76e1SWaldemar Kornewald// These don't use the copy constructor!
193de2f76e1SWaldemar Kornewald/*
194de2f76e1SWaldemar Kornewald// AddList
195de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
196de2f76e1SWaldemar Kornewaldbool
19749c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddList(list_t *list, int32 index)
198de2f76e1SWaldemar Kornewald{
199de2f76e1SWaldemar Kornewald	bool result = (list && index >= 0 && index <= fItemCount);
200de2f76e1SWaldemar Kornewald	if (result && list->fItemCount > 0) {
201de2f76e1SWaldemar Kornewald		int32 count = list->fItemCount;
202de2f76e1SWaldemar Kornewald		result = _Resize(fItemCount + count);
203de2f76e1SWaldemar Kornewald		if (result) {
204de2f76e1SWaldemar Kornewald			_MoveItems(fItems + index, count, fItemCount - index - count);
205de2f76e1SWaldemar Kornewald			memcpy(fItems + index, list->fItems,
206de2f76e1SWaldemar Kornewald				   list->fItemCount * sizeof(item_t));
207de2f76e1SWaldemar Kornewald		}
208de2f76e1SWaldemar Kornewald	}
209de2f76e1SWaldemar Kornewald	return result;
210de2f76e1SWaldemar Kornewald}
211de2f76e1SWaldemar Kornewald
212de2f76e1SWaldemar Kornewald// AddList
213de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
214de2f76e1SWaldemar Kornewaldbool
21549c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::AddList(list_t *list)
216de2f76e1SWaldemar Kornewald{
217de2f76e1SWaldemar Kornewald	bool result = (list);
218de2f76e1SWaldemar Kornewald	if (result && list->fItemCount > 0) {
219de2f76e1SWaldemar Kornewald		int32 index = fItemCount;
220de2f76e1SWaldemar Kornewald		int32 count = list->fItemCount;
221de2f76e1SWaldemar Kornewald		result = _Resize(fItemCount + count);
222de2f76e1SWaldemar Kornewald		if (result) {
223de2f76e1SWaldemar Kornewald			memcpy(fItems + index, list->fItems,
224de2f76e1SWaldemar Kornewald				   list->fItemCount * sizeof(item_t));
225de2f76e1SWaldemar Kornewald		}
226de2f76e1SWaldemar Kornewald	}
227de2f76e1SWaldemar Kornewald	return result;
228de2f76e1SWaldemar Kornewald}
229de2f76e1SWaldemar Kornewald*/
230de2f76e1SWaldemar Kornewald
231de2f76e1SWaldemar Kornewald// RemoveItem
232de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
233de2f76e1SWaldemar Kornewaldbool
23449c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::RemoveItem(const item_t &item)
235de2f76e1SWaldemar Kornewald{
236de2f76e1SWaldemar Kornewald	int32 index = IndexOf(item);
237de2f76e1SWaldemar Kornewald	bool result = (index >= 0);
238de2f76e1SWaldemar Kornewald	if (result)
239de2f76e1SWaldemar Kornewald		RemoveItem(index);
240de2f76e1SWaldemar Kornewald	return result;
241de2f76e1SWaldemar Kornewald}
242de2f76e1SWaldemar Kornewald
243de2f76e1SWaldemar Kornewald// RemoveItem
244de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
245de2f76e1SWaldemar Kornewaldbool
24649c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::RemoveItem(int32 index)
247de2f76e1SWaldemar Kornewald{
248de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount) {
249de2f76e1SWaldemar Kornewald		fItems[index].~item_t();
250de2f76e1SWaldemar Kornewald		_MoveItems(fItems + index + 1, -1, fItemCount - index - 1);
251de2f76e1SWaldemar Kornewald		_Resize(fItemCount - 1);
252de2f76e1SWaldemar Kornewald		return true;
253de2f76e1SWaldemar Kornewald	}
254de2f76e1SWaldemar Kornewald	return false;
255de2f76e1SWaldemar Kornewald}
256de2f76e1SWaldemar Kornewald
257de2f76e1SWaldemar Kornewald// ReplaceItem
258de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
259de2f76e1SWaldemar Kornewaldbool
26049c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::ReplaceItem(int32 index, const item_t &item)
261de2f76e1SWaldemar Kornewald{
262de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount) {
263de2f76e1SWaldemar Kornewald		fItems[index] = item;
264de2f76e1SWaldemar Kornewald		return true;
265de2f76e1SWaldemar Kornewald	}
266de2f76e1SWaldemar Kornewald	return false;
267de2f76e1SWaldemar Kornewald}
268de2f76e1SWaldemar Kornewald
269de2f76e1SWaldemar Kornewald// MoveItem
270de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
271de2f76e1SWaldemar Kornewaldbool
27249c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::MoveItem(int32 oldIndex, int32 newIndex)
273de2f76e1SWaldemar Kornewald{
274de2f76e1SWaldemar Kornewald	if (oldIndex >= 0 && oldIndex < fItemCount
275de2f76e1SWaldemar Kornewald		&& newIndex >= 0 && newIndex <= fItemCount) {
276de2f76e1SWaldemar Kornewald		if (oldIndex < newIndex - 1) {
277de2f76e1SWaldemar Kornewald			item_t item = fItems[oldIndex];
278de2f76e1SWaldemar Kornewald			_MoveItems(fItems + oldIndex + 1, -1, newIndex - oldIndex - 1);
279de2f76e1SWaldemar Kornewald			fItems[newIndex] = item;
280de2f76e1SWaldemar Kornewald		} else if (oldIndex > newIndex) {
281de2f76e1SWaldemar Kornewald			item_t item = fItems[oldIndex];
282de2f76e1SWaldemar Kornewald			_MoveItems(fItems + newIndex, 1, oldIndex - newIndex);
283de2f76e1SWaldemar Kornewald			fItems[newIndex] = item;
284de2f76e1SWaldemar Kornewald		}
285de2f76e1SWaldemar Kornewald		return true;
286de2f76e1SWaldemar Kornewald	}
287de2f76e1SWaldemar Kornewald	return false;
288de2f76e1SWaldemar Kornewald}
289de2f76e1SWaldemar Kornewald
290de2f76e1SWaldemar Kornewald// MakeEmpty
291de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
292de2f76e1SWaldemar Kornewaldvoid
29349c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::MakeEmpty()
294de2f76e1SWaldemar Kornewald{
295de2f76e1SWaldemar Kornewald	for (int32 i = 0; i < fItemCount; i++)
296de2f76e1SWaldemar Kornewald		fItems[i].~item_t();
297de2f76e1SWaldemar Kornewald	_Resize(0);
298de2f76e1SWaldemar Kornewald}
299de2f76e1SWaldemar Kornewald
300de2f76e1SWaldemar Kornewald// CountItems
301de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
302de2f76e1SWaldemar Kornewaldint32
30349c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::CountItems() const
304de2f76e1SWaldemar Kornewald{
305de2f76e1SWaldemar Kornewald	return fItemCount;
306de2f76e1SWaldemar Kornewald}
307de2f76e1SWaldemar Kornewald
308de2f76e1SWaldemar Kornewald// IsEmpty
309de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
310de2f76e1SWaldemar Kornewaldbool
31149c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::IsEmpty() const
312de2f76e1SWaldemar Kornewald{
313de2f76e1SWaldemar Kornewald	return (fItemCount == 0);
314de2f76e1SWaldemar Kornewald}
315de2f76e1SWaldemar Kornewald
316de2f76e1SWaldemar Kornewald// ItemAt
317de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
31849c2f687SWaldemar Kornewaldconst TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
31949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::ItemAt(int32 index) const
320de2f76e1SWaldemar Kornewald{
321de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount)
322de2f76e1SWaldemar Kornewald		return fItems[index];
323de2f76e1SWaldemar Kornewald	return sDefaultItem;
324de2f76e1SWaldemar Kornewald}
325de2f76e1SWaldemar Kornewald
326de2f76e1SWaldemar Kornewald// ItemAt
327de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
32849c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t &
32949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::ItemAt(int32 index)
330de2f76e1SWaldemar Kornewald{
331de2f76e1SWaldemar Kornewald	if (index >= 0 && index < fItemCount)
332de2f76e1SWaldemar Kornewald		return fItems[index];
333de2f76e1SWaldemar Kornewald	return sDefaultItem;
334de2f76e1SWaldemar Kornewald}
335de2f76e1SWaldemar Kornewald
336de2f76e1SWaldemar Kornewald// Items
337de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
33849c2f687SWaldemar Kornewaldconst TemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::item_t *
33949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::Items() const
340de2f76e1SWaldemar Kornewald{
341de2f76e1SWaldemar Kornewald	return fItems;
342de2f76e1SWaldemar Kornewald}
343de2f76e1SWaldemar Kornewald
344de2f76e1SWaldemar Kornewald// IndexOf
345de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
346de2f76e1SWaldemar Kornewaldint32
34749c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::IndexOf(const item_t &item) const
348de2f76e1SWaldemar Kornewald{
349de2f76e1SWaldemar Kornewald	for (int32 i = 0; i < fItemCount; i++) {
350de2f76e1SWaldemar Kornewald		if (fItems[i] == item)
351de2f76e1SWaldemar Kornewald			return i;
352de2f76e1SWaldemar Kornewald	}
353de2f76e1SWaldemar Kornewald	return -1;
354de2f76e1SWaldemar Kornewald}
355de2f76e1SWaldemar Kornewald
356de2f76e1SWaldemar Kornewald// HasItem
357de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
358de2f76e1SWaldemar Kornewaldbool
35949c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::HasItem(const item_t &item) const
360de2f76e1SWaldemar Kornewald{
361de2f76e1SWaldemar Kornewald	return (IndexOf(item) >= 0);
362de2f76e1SWaldemar Kornewald}
363de2f76e1SWaldemar Kornewald
364de2f76e1SWaldemar Kornewald// _Resize
365de2f76e1SWaldemar Kornewaldtemplate<typename ITEM, typename DEFAULT_ITEM_SUPPLIER>
366de2f76e1SWaldemar Kornewaldbool
36749c2f687SWaldemar KornewaldTemplateList<ITEM, DEFAULT_ITEM_SUPPLIER>::_Resize(size_t count)
368de2f76e1SWaldemar Kornewald{
369de2f76e1SWaldemar Kornewald	bool result = true;
370de2f76e1SWaldemar Kornewald	// calculate the new capacity
371de2f76e1SWaldemar Kornewald	int32 newSize = count;
372de2f76e1SWaldemar Kornewald	if (newSize <= 0)
373de2f76e1SWaldemar Kornewald		newSize = 1;
374de2f76e1SWaldemar Kornewald	newSize = ((newSize - 1) / fChunkSize + 1) * fChunkSize;
375de2f76e1SWaldemar Kornewald	// resize if necessary
376de2f76e1SWaldemar Kornewald	if ((size_t)newSize != fCapacity) {
377de2f76e1SWaldemar Kornewald		item_t* newItems
378de2f76e1SWaldemar Kornewald			= (item_t*)realloc(fItems, newSize * sizeof(item_t));
379de2f76e1SWaldemar Kornewald		if (newItems) {
380de2f76e1SWaldemar Kornewald			fItems = newItems;
381de2f76e1SWaldemar Kornewald			fCapacity = newSize;
382de2f76e1SWaldemar Kornewald		} else
383de2f76e1SWaldemar Kornewald			result = false;
384de2f76e1SWaldemar Kornewald	}
385de2f76e1SWaldemar Kornewald	if (result)
386de2f76e1SWaldemar Kornewald		fItemCount = count;
387de2f76e1SWaldemar Kornewald	return result;
388de2f76e1SWaldemar Kornewald}
389de2f76e1SWaldemar Kornewald
390de2f76e1SWaldemar Kornewald#endif	// LIST_H
391