summaryrefslogtreecommitdiffstats
path: root/knights/knightsmap.h
blob: f49198fec5199edebc3fc8bba39313f69cca8d69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/***************************************************************************
                          knightsmap.h  -  description
                             -------------------
    begin                : Sun Aug 25 2002
    copyright            : (C) 2003 by Troy Corbin Jr.
    email                : tcorbin@users.sf.net
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include <tqvaluelist.h>

#ifndef KNIGHTSMAP_H
#define KNIGHTSMAP_H

/**
  *@author Troy Corbin Jr.
  */

template<class Key, class T>
class KnightsMap
{
public:
	typedef Key			KeyType;
	typedef T				DataType;
	struct	Pair
									{
										KeyType		key;
										DataType	data;
									};

private:
	TQValueList<Pair>	pairList;

	Key								searchKey;
	unsigned int			searchIndex;
	T									nullValue;
	T									tempValue;

public:
								/*
										Constructor
								*/
								KnightsMap()
								{
									nullValue = 0;
									clear();
								}

								/*
										Destructor
								*/
								~KnightsMap()
								{ clear(); }

								/*
										Returns the number of items in the map
								*/
unsigned int		count( void )
								{ return pairList.count(); }

								/*
										Clears the map
								*/
void						clear( void )
								{
									searchIndex = 0;
									pairList.clear();
								}

								/*
										Add a Key/Value pair to the map
								*/
void						add( KeyType key, DataType data )
								{
									Pair newPair;
									newPair.key = key;
									newPair.data = data;
									pairList.append( newPair );
								}

								/*
										Return the next Value associated with the Key given
										in the last call to 'find'. If there are none, then
										NULL is returned.
								*/
T&							findNext( void )
								{
									unsigned int maxIndex( pairList.count() );
									for( ; searchIndex < maxIndex ; searchIndex++ )
									{
										if( searchKey != pairList[searchIndex].key )
										{
											continue;
										}
										return pairList[searchIndex++].data;
									}
									return nullValue;
								}

								/*
										Lookup a Value by it's key. This will always return
										the first Value that's associated with the given Key.
										If no Value has the given Key, NULL is returned.
								*/
T&							find( KeyType key )
								{
									searchKey = key;
									searchIndex = 0;
									return findNext();
								}

								/* Removes all Values that are associated with Key */
T&							remove( KeyType key )
								{
									TQValueListIterator<Pair> IT( pairList.begin() );
									while( IT != pairList.end() )
									{
										if( (*IT).key == key )
										{
											tempValue = (*IT).data;
											IT = pairList.remove( IT );
											return tempValue;
										}
										IT++;
									}
									return nullValue;
								}

								/* Return the Value stored at Index i */
T&							operator[]( unsigned int i )
								{ return pairList[i].data; }

								/* Return the Key stored at Index i */
Key&						keyAt( unsigned int i )
								{ return pairList[i].key; }

								/*
										Return the Value stored one Index position previous
										to the last returned search Value. If already at the
										begining of the Map, then NULL is returned.
								*/
T&							operator--( void )
								{
									if( searchIndex > 1 )
									{
										searchIndex -= 2;
									}
									else
									{
										return nullValue;
									}
									return pairList[searchIndex++].data;
								}

								/*
										Return the Value stored one Index position after
										the last returned search Value. If already at the
										end of the Map, then NULL is returned.
								*/
T&							operator++( void )
								{
									if( searchIndex >= count() )
									{
										return nullValue;
									}
									return pairList[searchIndex++].data;
								}
};

#endif