Index: sdk/lib/core/set.dart |
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart |
index 95a633a447ca6b9c5165e0475d6cb8e9145e5948..33e65b9851d68da3f85c1fe6deda95c3b5868a7f 100644 |
--- a/sdk/lib/core/set.dart |
+++ b/sdk/lib/core/set.dart |
@@ -78,21 +78,16 @@ abstract class HashSet<E> extends Set<E> { |
factory HashSet.from(Iterable<E> other) => new _HashSetImpl<E>.from(other); |
} |
+abstract class _MapBackedSet<E> extends Iterable<E> implements HashSet<E> { |
Lasse Reichstein Nielsen
2013/01/04 09:39:06
Why implement HashSet? Being a HashSet is an imple
|
+ _MapBackedSet(this._backingMap); |
-class _HashSetImpl<E> extends Iterable<E> implements HashSet<E> { |
- |
- _HashSetImpl() { |
- _backingMap = new _HashMapImpl<E, E>(); |
- } |
- |
- factory _HashSetImpl.from(Iterable<E> other) { |
- Set<E> set = new _HashSetImpl<E>(); |
- for (final e in other) { |
- set.add(e); |
+ _MapBackedSet.from(this._backingMap, Iterable<E> iterable) { |
+ for (final e in iterable) { |
+ add(e); |
} |
- return set; |
} |
+ |
void clear() { |
_backingMap.clear(); |
} |
@@ -155,7 +150,7 @@ class _HashSetImpl<E> extends Iterable<E> implements HashSet<E> { |
return _backingMap.length; |
} |
- Iterator<E> get iterator => new _HashSetIterator<E>(this); |
+ Iterator<E> get iterator => _backingMap.keys.iterator; |
String toString() { |
return Collections.collectionToString(this); |
@@ -164,32 +159,19 @@ class _HashSetImpl<E> extends Iterable<E> implements HashSet<E> { |
// The map backing this set. The associations in this map are all |
// of the form element -> element. If a value is not in the map, |
// then it is not in the set. |
- _HashMapImpl<E, E> _backingMap; |
+ Map<E, E> _backingMap; |
} |
-class _HashSetIterator<E> implements Iterator<E> { |
- |
- _HashSetIterator(_HashSetImpl<E> set) |
- : _keysIterator = set._backingMap._keys.iterator; |
+class _HashSetImpl<E> extends _MapBackedSet<E> implements HashSet<E> { |
+ _HashSetImpl.from(Iterable<E> iterable) |
+ : super.from(new _HashMapImpl<E, E>(), iterable); |
- E get current { |
- var result = _keysIterator.current; |
- if (identical(result, _HashMapImpl._DELETED_KEY)) { |
- // TODO(floitsch): improve the error reporting. |
- throw new StateError("Concurrent modification."); |
- } |
- return result; |
- } |
+ _HashSetImpl() : super(new _HashMapImpl<E, E>()); |
+} |
- bool moveNext() { |
- bool result; |
- do { |
- result = _keysIterator.moveNext(); |
- } while (result && |
- (_keysIterator.current == null || |
- identical(_keysIterator.current, _HashMapImpl._DELETED_KEY))); |
- return result; |
- } |
+class OrderedSet<E> extends _MapBackedSet<E> implements Set<E> { |
Lasse Reichstein Nielsen
2013/01/04 09:39:06
I don't like "OrderedSet" as a name. It doesn't sa
sra1
2013/01/04 09:56:15
+1. From the CL title I thought at last we had a
sra1
2013/01/04 10:02:43
+1. From the CL title I thought at last we had a
|
+ OrderedSet.from(Iterable<E> iterable) |
+ : super.from(new _LinkedHashMapImpl<E, E>(), iterable); |
- Iterator _keysIterator; |
+ OrderedSet() : super(new _LinkedHashMapImpl<E, E>()); |
Lasse Reichstein Nielsen
2013/01/04 09:39:06
I still think it's silly to have a HashMap interfa
|
} |