Mercurial > projects > ldc
comparison tango/tango/util/collection/impl/MapCollection.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 | |
3 File: MapCollection.d | |
4 | |
5 Originally written by Doug Lea and released into the public domain. | |
6 Thanks for the assistance and support of Sun Microsystems Labs, Agorics | |
7 Inc, Loral, and everyone contributing, testing, and using this code. | |
8 | |
9 History: | |
10 Date Who What | |
11 13Oct95 dl Create | |
12 28jan97 dl make class public | |
13 14Dec06 kb adapted for Tango usage | |
14 | |
15 ********************************************************************************/ | |
16 | |
17 module tango.util.collection.impl.MapCollection; | |
18 | |
19 private import tango.core.Exception; | |
20 | |
21 private import tango.util.collection.impl.Collection; | |
22 | |
23 private import tango.util.collection.model.Map, | |
24 tango.util.collection.model.View, | |
25 tango.util.collection.model.MapView, | |
26 tango.util.collection.model.Iterator, | |
27 tango.util.collection.model.SortedKeys; | |
28 | |
29 | |
30 /******************************************************************************* | |
31 | |
32 MapCollection extends Collection to provide default implementations of | |
33 some Map operations. | |
34 | |
35 author: Doug Lea | |
36 @version 0.93 | |
37 | |
38 <P> For an introduction to this package see <A HREF="index.html" | |
39 > Overview </A>. | |
40 | |
41 ********************************************************************************/ | |
42 | |
43 public abstract class MapCollection(K, T) : Collection!(T), Map!(K, T) | |
44 { | |
45 alias MapView!(K, T) MapViewT; | |
46 alias Collection!(T).remove remove; | |
47 alias Collection!(T).removeAll removeAll; | |
48 | |
49 | |
50 /*********************************************************************** | |
51 | |
52 Initialize at version 0, an empty count, and null screener | |
53 | |
54 ************************************************************************/ | |
55 | |
56 protected this () | |
57 { | |
58 super(); | |
59 } | |
60 | |
61 /*********************************************************************** | |
62 | |
63 Initialize at version 0, an empty count, and supplied screener | |
64 | |
65 ************************************************************************/ | |
66 | |
67 protected this (Predicate screener) | |
68 { | |
69 super(screener); | |
70 } | |
71 | |
72 /*********************************************************************** | |
73 | |
74 Implements tango.util.collection.Map.allowsKey. | |
75 Default key-screen. Just checks for null. | |
76 | |
77 See_Also: tango.util.collection.Map.allowsKey | |
78 | |
79 ************************************************************************/ | |
80 | |
81 public final bool allowsKey(K key) | |
82 { | |
83 return (key !is K.init); | |
84 } | |
85 | |
86 protected final bool isValidKey(K key) | |
87 { | |
88 static if (is (K : Object)) | |
89 { | |
90 if (key is null) | |
91 return false; | |
92 } | |
93 return true; | |
94 } | |
95 | |
96 /*********************************************************************** | |
97 | |
98 Principal method to throw a IllegalElementException for keys | |
99 | |
100 ************************************************************************/ | |
101 | |
102 protected final void checkKey(K key) | |
103 { | |
104 if (!isValidKey(key)) | |
105 { | |
106 throw new IllegalElementException("Attempt to include invalid key _in Collection"); | |
107 } | |
108 } | |
109 | |
110 /*********************************************************************** | |
111 | |
112 Implements tango.util.collection.impl.MapCollection.MapCollection.opIndexAssign | |
113 Just calls add(key, element). | |
114 | |
115 See_Also: tango.util.collection.impl.MapCollection.MapCollection.add | |
116 | |
117 ************************************************************************/ | |
118 | |
119 public final void opIndexAssign (T element, K key) | |
120 { | |
121 add (key, element); | |
122 } | |
123 | |
124 /*********************************************************************** | |
125 | |
126 Implements tango.util.collection.impl.Collection.Collection.matches | |
127 Time complexity: O(n). | |
128 Default implementation. Fairly sleazy approach. | |
129 (Defensible only when you remember that it is just a default impl.) | |
130 It tries to cast to one of the known collection interface types | |
131 and then applies the corresponding comparison rules. | |
132 This suffices for all currently supported collection types, | |
133 but must be overridden if you define new Collection subinterfaces | |
134 and/or implementations. | |
135 | |
136 See_Also: tango.util.collection.impl.Collection.Collection.matches | |
137 | |
138 ************************************************************************/ | |
139 | |
140 public override bool matches(View!(T) other) | |
141 { | |
142 if (other is null) | |
143 {} | |
144 else | |
145 if (other is this) | |
146 return true; | |
147 else | |
148 { | |
149 auto tmp = cast (MapViewT) other; | |
150 if (tmp) | |
151 if (cast(SortedKeys!(K, T)) this) | |
152 return sameOrderedPairs(this, tmp); | |
153 else | |
154 return samePairs(this, tmp); | |
155 } | |
156 return false; | |
157 } | |
158 | |
159 | |
160 public final static bool samePairs(MapViewT s, MapViewT t) | |
161 { | |
162 if (s.size !is t.size) | |
163 return false; | |
164 | |
165 try { // set up to return false on collection exceptions | |
166 foreach (key, value; t.keys) | |
167 if (! s.containsPair (key, value)) | |
168 return false; | |
169 } catch (NoSuchElementException ex) | |
170 { | |
171 return false; | |
172 } | |
173 return true; | |
174 } | |
175 | |
176 public final static bool sameOrderedPairs(MapViewT s, MapViewT t) | |
177 { | |
178 if (s.size !is t.size) | |
179 return false; | |
180 | |
181 auto ss = s.keys(); | |
182 try { // set up to return false on collection exceptions | |
183 foreach (key, value; t.keys) | |
184 { | |
185 K sk; | |
186 auto sv = ss.get (sk); | |
187 if (sk != key || sv != value) | |
188 return false; | |
189 } | |
190 } catch (NoSuchElementException ex) | |
191 { | |
192 return false; | |
193 } | |
194 return true; | |
195 } | |
196 | |
197 | |
198 // Object methods | |
199 | |
200 /*********************************************************************** | |
201 | |
202 Implements tango.util.collection.impl.Collection.Collection.removeAll | |
203 See_Also: tango.util.collection.impl.Collection.Collection.removeAll | |
204 | |
205 Has to be here rather than in the superclass to satisfy | |
206 D interface idioms | |
207 | |
208 ************************************************************************/ | |
209 | |
210 public void removeAll (Iterator!(T) e) | |
211 { | |
212 while (e.more) | |
213 removeAll (e.get); | |
214 } | |
215 | |
216 /*********************************************************************** | |
217 | |
218 Implements tango.util.collection.impl.Collection.Collection.removeElements | |
219 See_Also: tango.util.collection.impl.Collection.Collection.removeElements | |
220 | |
221 Has to be here rather than in the superclass to satisfy | |
222 D interface idioms | |
223 | |
224 ************************************************************************/ | |
225 | |
226 public void remove (Iterator!(T) e) | |
227 { | |
228 while (e.more) | |
229 remove (e.get); | |
230 } | |
231 } | |
232 |