VR-Forces 4.3.1 Class Documentation
Home
Modules
Namespaces
Classes
Files
Examples
Behavior Models
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
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 Wed Jul 29 00:55:00 EDT 2015 from SVN revision 155257
Copyright © 2005-2015 VT MÄK. All Rights Reserved (
www.mak.com
)