VR-Forces 4.1.1 Class Documentation
Home
Modules
Namespaces
Classes
Files
Examples
Behavior Models
File List
File Members
include
vrfutil
iteratorBase.h
Go to the documentation of this file.
1
/*******************************************************************************
2
** Copyright (c) 2001 MAK Technologies, Inc.
3
** All rights reserved.
4
*******************************************************************************/
5
/*******************************************************************************
6
** $RCSfile: iteratorBase.h,v $ $Revision: 1.13 $ $State: Exp $
7
*******************************************************************************/
8
#ifndef iteratorBase_H_
9
#define iteratorBase_H_
10
13
14
#include <vlutil/vlList.h>
15
#include <vlutil/vlPrint.h>
16
17
enum
DtIteratorLocation
18
{
19
DtIteratorBeginning
,
20
DtIteratorEnd
21
};
22
23
enum
DtIteratorDirection
24
{
25
DtIteratorForward
,
26
DtIteratorReverse
27
};
28
32
template
<
class
T>
class
DtIteratorBase
33
{
34
private
:
35
36
//default constructor is not allowed
37
DtIteratorBase
();
38
40
const
DtIteratorBase
&
operator=
(
const
DtIteratorBase
& orig);
41
42
public
:
43
45
DtIteratorBase
(
const
DtList&
list
) :
myList
(list),
myCursor
(0),
myDirection
(
DtIteratorForward
) {
first
(); };
46
48
DtIteratorBase
(
const
DtIteratorBase
& orig) :
myList
(orig.
myList
),
myCursor
(orig.
myCursor
),
myDirection
(orig.
myDirection
) {};
49
50
virtual
~DtIteratorBase
() {};
51
53
virtual
unsigned
int
size
()
const
{
return
myList
.count(); }
54
57
virtual
bool
empty
()
const
{
return
myList
.count() != 0; }
58
59
virtual
const
DtList&
list
() {
return
myList
; };
60
65
virtual
bool
reset
(
bool
reverse
=
false
)
66
{
67
return
reset
(
68
(
reverse
?
DtIteratorEnd
:
DtIteratorBeginning
),
69
(
reverse
?
DtIteratorReverse
:
DtIteratorForward
));
70
};
71
73
virtual
bool
reset
(
DtIteratorLocation
location,
74
DtIteratorDirection
direction
=
DtIteratorForward
)
75
{
76
switch
(location)
77
{
78
case
DtIteratorBeginning
:
79
myCursor
=
myList
.first();
80
break
;
81
82
case
DtIteratorEnd
:
83
myCursor
=
myList
.last();
84
break
;
85
86
default
:
87
DtWarn(
"DtIteratorBase::reset() unexpected location specified.\n"
);
88
}
89
90
myDirection
=
direction
;
91
92
return
(
myCursor
!= 0);
93
};
94
96
virtual
void
reverse
()
97
{
98
myDirection
=
99
((
myDirection
==
DtIteratorForward
) ?
100
DtIteratorReverse
:
101
DtIteratorForward
);
102
};
103
105
virtual
void
setDirection
(
DtIteratorDirection
direction
)
106
{
myDirection
=
direction
; };
107
109
virtual
DtIteratorDirection
direction
() {
return
myDirection
; };
110
112
virtual
int
cursorIndex
()
const
113
{
114
DtListItem* item =
myList
.first();
115
int
i = 0;
116
117
for
(;item; item = item->next(), i++)
118
{
119
if
(item ==
myCursor
)
120
{
121
return
i;
122
}
123
}
124
125
return
-1;
126
}
127
128
virtual
void
setCursorIndex
(
int
i)
129
{
130
myCursor
=
myList
.first();
131
132
if
(i != -1)
133
{
134
while
(i)
135
{
136
myCursor
=
myCursor
->next();
137
i--;
138
}
139
}
140
}
141
142
public
:
143
149
virtual
T*
internalFirst
(
bool
move =
true
)
150
{
151
if
(
myDirection
==
DtIteratorForward
)
152
{
153
if
(move)
154
{
155
reset
();
156
}
157
158
if
(
myList
.first())
159
{
160
return
(T*)(
myList
.first()->data());
161
}
162
else
163
{
164
return
0;
165
}
166
}
167
else
168
{
169
if
(move)
170
{
171
reset
(
true
);
172
}
173
174
if
(
myList
.last())
175
{
176
return
(T*)(
myList
.last()->data());
177
}
178
else
179
{
180
return
0;
181
}
182
}
183
};
184
186
virtual
T*
internalCurrent
()
const
{
return
(
myCursor
? (T*)
myCursor
->data() : 0); };
187
189
virtual
DtListItem*
cursor
()
const
{
return
myCursor
; };
190
191
virtual
T*
itemToObject
(DtListItem* item,
bool
move)
192
{
193
if
(move)
194
{
195
myCursor
= item;
196
}
197
198
if
(item)
199
{
200
return
(T*)item->data();
201
}
202
203
return
0;
204
};
205
206
virtual
T*
internalNext
(
bool
move =
true
)
207
{
208
if
(
myCursor
)
209
{
210
211
DtListItem* tmpCursor = 0;
212
213
tmpCursor = ((
myDirection
==
DtIteratorForward
) ?
214
myCursor
->next() :
myCursor
->prev());
215
216
return
itemToObject
(tmpCursor, move);
217
}
218
219
return
0;
220
};
221
227
virtual
T*
internalLast
(
bool
move =
true
)
228
{
229
if
(
myDirection
==
DtIteratorForward
)
230
{
231
if
(move)
232
{
233
reset
(
true
);
234
}
235
236
if
(
myList
.last())
237
{
238
return
(T*)(
myList
.last()->data());
239
}
240
else
241
{
242
return
0;
243
}
244
}
245
else
246
{
247
if
(move)
248
{
249
reset
();
250
}
251
252
if
(
myList
.first())
253
{
254
return
(T*)(
myList
.first()->data());
255
}
256
else
257
{
258
return
0;
259
}
260
}
261
};
262
263
267
virtual
T*
internalWrapNext
(
bool
move =
true
)
268
{
269
if
(!
myCursor
)
270
{
271
return
0;
272
}
273
274
DtListItem* tmpCursor = 0;
275
276
tmpCursor = ((
myDirection
==
DtIteratorForward
) ?
277
myCursor
->next() :
myCursor
->prev());
278
279
if
(! tmpCursor)
280
{
281
tmpCursor = ((
myDirection
==
DtIteratorForward
) ?
282
myList
.first() :
myList
.last());
283
}
284
285
return
itemToObject
(tmpCursor, move);
286
};
287
291
virtual
T*
internalPrev
(
bool
move =
true
)
292
{
293
if
(
myCursor
)
294
{
295
DtListItem* tmpCursor = 0;
296
297
tmpCursor = ((
myDirection
==
DtIteratorForward
) ?
298
myCursor
->prev() :
myCursor
->next());
299
300
return
itemToObject
(tmpCursor, move);
301
}
302
303
return
0;
304
};
305
306
virtual
T*
internalWrapPrev
(
bool
move =
true
)
307
{
308
if
(!
myCursor
)
309
{
310
return
0;
311
}
312
313
DtListItem* tmpCursor = 0;
314
315
tmpCursor = ((
myDirection
==
DtIteratorForward
) ?
316
myCursor
->prev() :
myCursor
->next());
317
318
if
(! tmpCursor)
319
{
320
tmpCursor = ((
myDirection
==
DtIteratorForward
) ?
321
myList
.last() :
myList
.first());
322
}
323
324
return
itemToObject
(tmpCursor, move);
325
};
326
327
virtual
T*
current
() {
return
internalCurrent
(); };
328
virtual
T*
first
(
bool
move =
true
) {
return
internalFirst
(move); };
329
virtual
T*
next
(
bool
move =
true
) {
return
internalNext
(move); };
330
virtual
T*
prev
(
bool
move =
true
) {
return
internalPrev
(move); };
331
virtual
T*
last
(
bool
move =
true
) {
return
internalLast
(move); };
332
virtual
T*
wrapNext
(
bool
move =
true
) {
return
internalWrapNext
(move); };
333
virtual
T*
wrapPrev
(
bool
move =
true
) {
return
internalWrapPrev
(move); };
334
335
T*
operator++
() {
return
next
(); };
336
T*
operator--
() {
return
prev
(); };
337
338
protected
:
339
340
const
DtList&
myList
;
341
DtListItem*
myCursor
;
342
DtIteratorDirection
myDirection
;
343
344
};
345
346
#endif
Document ID: Generated on Mon Apr 8 19:24:01 EDT 2013 from SVN revision 125877
Copyright © 2005-2013 VT MÄK. All Rights Reserved (
www.mak.com
)