Mercurial > projects > ldc
comparison tango/tango/util/collection/impl/CLCell.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: CLCell.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 | |
13 */ | |
14 | |
15 | |
16 module tango.util.collection.impl.CLCell; | |
17 | |
18 private import tango.util.collection.impl.Cell; | |
19 | |
20 | |
21 /** | |
22 * | |
23 * | |
24 * CLCells are cells that are always arranged in circular lists | |
25 * They are pure implementation tools | |
26 * | |
27 author: Doug Lea | |
28 * @version 0.93 | |
29 * | |
30 * <P> For an introduction to this package see <A HREF="index.html"> Overview </A>. | |
31 **/ | |
32 | |
33 public class CLCell(T) : Cell!(T) | |
34 { | |
35 // instance variables | |
36 | |
37 private CLCell next_; | |
38 private CLCell prev_; | |
39 | |
40 // constructors | |
41 | |
42 /** | |
43 * Make a cell with contents v, previous cell p, next cell n | |
44 **/ | |
45 | |
46 public this (T v, CLCell p, CLCell n) | |
47 { | |
48 super(v); | |
49 prev_ = p; | |
50 next_ = n; | |
51 } | |
52 | |
53 /** | |
54 * Make a singular cell | |
55 **/ | |
56 | |
57 public this (T v) | |
58 { | |
59 super(v); | |
60 prev_ = this; | |
61 next_ = this; | |
62 } | |
63 | |
64 /** | |
65 * Make a singular cell with null contents | |
66 **/ | |
67 | |
68 public this () | |
69 { | |
70 super(T.init); | |
71 prev_ = this; | |
72 next_ = this; | |
73 } | |
74 | |
75 /** | |
76 * return next cell | |
77 **/ | |
78 | |
79 public final CLCell next() | |
80 { | |
81 return next_; | |
82 } | |
83 | |
84 /** | |
85 * Set next cell. You probably don't want to call this | |
86 **/ | |
87 | |
88 public final void next(CLCell n) | |
89 { | |
90 next_ = n; | |
91 } | |
92 | |
93 | |
94 /** | |
95 * return previous cell | |
96 **/ | |
97 public final CLCell prev() | |
98 { | |
99 return prev_; | |
100 } | |
101 | |
102 /** | |
103 * Set previous cell. You probably don't want to call this | |
104 **/ | |
105 public final void prev(CLCell n) | |
106 { | |
107 prev_ = n; | |
108 } | |
109 | |
110 | |
111 /** | |
112 * Return true if current cell is the only one on the list | |
113 **/ | |
114 | |
115 public final bool isSingleton() | |
116 { | |
117 return next_ is this; | |
118 } | |
119 | |
120 public final void linkNext(CLCell p) | |
121 { | |
122 if (p !is null) | |
123 { | |
124 next_.prev_ = p; | |
125 p.next_ = next_; | |
126 p.prev_ = this; | |
127 next_ = p; | |
128 } | |
129 } | |
130 | |
131 /** | |
132 * Make a cell holding v and link it immediately after current cell | |
133 **/ | |
134 | |
135 public final void addNext(T v) | |
136 { | |
137 CLCell p = new CLCell(v, this, next_); | |
138 next_.prev_ = p; | |
139 next_ = p; | |
140 } | |
141 | |
142 /** | |
143 * make a node holding v, link it before the current cell, and return it | |
144 **/ | |
145 | |
146 public final CLCell addPrev(T v) | |
147 { | |
148 CLCell p = prev_; | |
149 CLCell c = new CLCell(v, p, this); | |
150 p.next_ = c; | |
151 prev_ = c; | |
152 return c; | |
153 } | |
154 | |
155 /** | |
156 * link p before current cell | |
157 **/ | |
158 | |
159 public final void linkPrev(CLCell p) | |
160 { | |
161 if (p !is null) | |
162 { | |
163 prev_.next_ = p; | |
164 p.prev_ = prev_; | |
165 p.next_ = this; | |
166 prev_ = p; | |
167 } | |
168 } | |
169 | |
170 /** | |
171 * return the number of cells in the list | |
172 **/ | |
173 | |
174 public final int _length() | |
175 { | |
176 int c = 0; | |
177 CLCell p = this; | |
178 do { | |
179 ++c; | |
180 p = p.next(); | |
181 } while (p !is this); | |
182 return c; | |
183 } | |
184 | |
185 /** | |
186 * return the first cell holding element found in a circular traversal starting | |
187 * at current cell, or null if no such | |
188 **/ | |
189 | |
190 public final CLCell find(T element) | |
191 { | |
192 CLCell p = this; | |
193 do { | |
194 if (p.element() == (element)) | |
195 return p; | |
196 p = p.next(); | |
197 } while (p !is this); | |
198 return null; | |
199 } | |
200 | |
201 /** | |
202 * return the number of cells holding element found in a circular | |
203 * traversal | |
204 **/ | |
205 | |
206 public final int count(T element) | |
207 { | |
208 int c = 0; | |
209 CLCell p = this; | |
210 do { | |
211 if (p.element() == (element)) | |
212 ++c; | |
213 p = p.next(); | |
214 } while (p !is this); | |
215 return c; | |
216 } | |
217 | |
218 /** | |
219 * return the nth cell traversed from here. It may wrap around. | |
220 **/ | |
221 | |
222 public final CLCell nth(int n) | |
223 { | |
224 CLCell p = this; | |
225 for (int i = 0; i < n; ++i) | |
226 p = p.next_; | |
227 return p; | |
228 } | |
229 | |
230 | |
231 /** | |
232 * Unlink the next cell. | |
233 * This has no effect on the list if isSingleton() | |
234 **/ | |
235 | |
236 public final void unlinkNext() | |
237 { | |
238 CLCell nn = next_.next_; | |
239 nn.prev_ = this; | |
240 next_ = nn; | |
241 } | |
242 | |
243 /** | |
244 * Unlink the previous cell. | |
245 * This has no effect on the list if isSingleton() | |
246 **/ | |
247 | |
248 public final void unlinkPrev() | |
249 { | |
250 CLCell pp = prev_.prev_; | |
251 pp.next_ = this; | |
252 prev_ = pp; | |
253 } | |
254 | |
255 | |
256 /** | |
257 * Unlink self from list it is in. | |
258 * Causes it to be a singleton | |
259 **/ | |
260 | |
261 public final void unlink() | |
262 { | |
263 CLCell p = prev_; | |
264 CLCell n = next_; | |
265 p.next_ = n; | |
266 n.prev_ = p; | |
267 prev_ = this; | |
268 next_ = this; | |
269 } | |
270 | |
271 /** | |
272 * Make a copy of the list and return new head. | |
273 **/ | |
274 | |
275 public final CLCell copyList() | |
276 { | |
277 CLCell hd = this; | |
278 | |
279 CLCell newlist = new CLCell(hd.element(), null, null); | |
280 CLCell current = newlist; | |
281 | |
282 for (CLCell p = next_; p !is hd; p = p.next_) | |
283 { | |
284 current.next_ = new CLCell(p.element(), current, null); | |
285 current = current.next_; | |
286 } | |
287 newlist.prev_ = current; | |
288 current.next_ = newlist; | |
289 return newlist; | |
290 } | |
291 } | |
292 |