… | |
… | |
242 | // fully recursive iterator |
242 | // fully recursive iterator |
243 | struct iterator_base |
243 | struct iterator_base |
244 | { |
244 | { |
245 | object *item; |
245 | object *item; |
246 | |
246 | |
247 | iterator_base (object *item) |
247 | iterator_base (object *container) |
248 | : item(item) |
248 | : item (container) |
249 | { |
249 | { |
250 | } |
250 | } |
251 | |
251 | |
252 | operator object *() const { return item; } |
252 | operator object *() const { return item; } |
253 | |
253 | |
254 | object *operator ->() const { return item; } |
254 | object *operator ->() const { return item; } |
255 | object &operator * () const { return *item; } |
255 | object &operator * () const { return *item; } |
256 | }; |
256 | }; |
257 | |
257 | |
|
|
258 | // depth-first recursive iterator |
258 | struct deep_iterator : iterator_base |
259 | struct depth_iterator : iterator_base |
259 | { |
260 | { |
260 | deep_iterator (object *op) : iterator_base (op) { } |
261 | depth_iterator (object *container); |
261 | |
|
|
262 | void next (); |
262 | void next (); |
263 | object *operator ++( ) { next (); return item; } |
263 | object *operator ++( ) { next (); return item; } |
264 | object *operator ++(int) { object *i = item; next (); return i; } |
264 | object *operator ++(int) { object *i = item; next (); return i; } |
265 | }; |
265 | }; |
266 | |
266 | |
267 | object *begin () |
267 | object *begin () |
268 | { |
268 | { |
269 | return this->inv ? this->inv : end (); |
269 | return this; |
270 | } |
270 | } |
271 | |
271 | |
272 | object *end () |
272 | object *end () |
273 | { |
273 | { |
274 | return this->below; |
274 | return this; |
275 | } |
275 | } |
276 | |
276 | |
277 | protected: |
277 | protected: |
278 | friend struct archetype; |
278 | friend struct archetype; |
279 | |
279 | |