Mercurial > projects > ldc
comparison tango/tango/util/collection/impl/AbstractIterator.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 /* | |
2 File: AbstractIterator.d | |
3 | |
4 Originally written by Doug Lea and released into the public domain. | |
5 Thanks for the assistance and support of Sun Microsystems Labs, Agorics | |
6 Inc, Loral, and everyone contributing, testing, and using this code. | |
7 | |
8 History: | |
9 Date Who What | |
10 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file | |
11 13Oct95 dl Changed protection statuses | |
12 9Apr97 dl made class public | |
13 */ | |
14 | |
15 | |
16 module tango.util.collection.impl.AbstractIterator; | |
17 | |
18 private import tango.core.Exception; | |
19 | |
20 private import tango.util.collection.model.View, | |
21 tango.util.collection.model.GuardIterator; | |
22 | |
23 | |
24 | |
25 /** | |
26 * | |
27 * A convenient base class for implementations of GuardIterator | |
28 * | |
29 author: Doug Lea | |
30 * @version 0.93 | |
31 * | |
32 * <P> For an introduction to this package see <A HREF="index.html"> Overview </A>. | |
33 **/ | |
34 | |
35 public abstract class AbstractIterator(T) : GuardIterator!(T) | |
36 { | |
37 /** | |
38 * The collection being enumerated | |
39 **/ | |
40 | |
41 private View!(T) view; | |
42 | |
43 /** | |
44 * The version number of the collection we got upon construction | |
45 **/ | |
46 | |
47 private uint mutation; | |
48 | |
49 /** | |
50 * The number of elements we think we have left. | |
51 * Initialized to view.size() upon construction | |
52 **/ | |
53 | |
54 private uint togo; | |
55 | |
56 | |
57 protected this (View!(T) v) | |
58 { | |
59 view = v; | |
60 togo = v.size(); | |
61 mutation = v.mutation(); | |
62 } | |
63 | |
64 /** | |
65 * Implements tango.util.collection.impl.Collection.CollectionIterator.corrupted. | |
66 * Claim corruption if version numbers differ | |
67 * See_Also: tango.util.collection.impl.Collection.CollectionIterator.corrupted | |
68 **/ | |
69 | |
70 public final bool corrupted() | |
71 { | |
72 return mutation != view.mutation; | |
73 } | |
74 | |
75 /** | |
76 * Implements tango.util.collection.impl.Collection.CollectionIterator.numberOfRemaingingElements. | |
77 * See_Also: tango.util.collection.impl.Collection.CollectionIterator.remaining | |
78 **/ | |
79 public final uint remaining() | |
80 { | |
81 return togo; | |
82 } | |
83 | |
84 /** | |
85 * Implements tango.util.collection.model.Iterator.more. | |
86 * Return true if remaining > 0 and not corrupted | |
87 * See_Also: tango.util.collection.model.Iterator.more | |
88 **/ | |
89 public final bool more() | |
90 { | |
91 return togo > 0 && mutation is view.mutation; | |
92 } | |
93 | |
94 /** | |
95 * Subclass utility. | |
96 * Tries to decrement togo, raising exceptions | |
97 * if it is already zero or if corrupted() | |
98 * Always call as the first line of get. | |
99 **/ | |
100 protected final void decRemaining() | |
101 { | |
102 if (mutation != view.mutation) | |
103 throw new CorruptedIteratorException ("Collection modified during iteration"); | |
104 | |
105 if (togo is 0) | |
106 throw new NoSuchElementException ("exhausted enumeration"); | |
107 | |
108 --togo; | |
109 } | |
110 } | |
111 | |
112 | |
113 public abstract class AbstractMapIterator(K, V) : AbstractIterator!(V), PairIterator!(K, V) | |
114 { | |
115 abstract V get (inout K key); | |
116 | |
117 protected this (View!(V) c) | |
118 { | |
119 super (c); | |
120 } | |
121 } |