Style tweaks.
diff --git a/lib/src/empty_unmodifiable_set.dart b/lib/src/empty_unmodifiable_set.dart
new file mode 100644
index 0000000..581532f
--- /dev/null
+++ b/lib/src/empty_unmodifiable_set.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'unmodifiable_wrappers.dart';
+
+// Unfortunately, we can't use UnmodifiableSetMixin here, since const classes
+// can't use mixins.
+/// An unmodifiable, empty set that can have a const constructor.
+class EmptyUnmodifiableSet<E> extends IterableBase<E>
+ implements UnmodifiableSetView<E> {
+ static /*=T*/ _throw/*<T>*/() {
+ throw new UnsupportedError("Cannot modify an unmodifiable Set");
+ }
+
+ Iterator<E> get iterator => new Iterable<E>.empty().iterator;
+ int get length => 0;
+
+ const EmptyUnmodifiableSet();
+
+ bool contains(Object element) => false;
+ bool containsAll(Iterable<Object> other) => other.isEmpty;
+ E lookup(Object element) => null;
+ Set<E> toSet() => new Set();
+ Set<E> union(Set<E> other) => new Set.from(other);
+ Set<E> intersection(Set<Object> other) => new Set();
+ Set<E> difference(Set<Object> other) => new Set();
+
+ bool add(E value) => _throw();
+ void addAll(Iterable<E> elements) => _throw();
+ void clear() => _throw();
+ bool remove(Object element) => _throw();
+ void removeAll(Iterable<Object> elements) => _throw();
+ void removeWhere(bool test(E element)) => _throw();
+ void retainWhere(bool test(E element)) => _throw();
+ void retainAll(Iterable<Object> elements) => _throw();
+}
+
diff --git a/lib/src/unmodifiable_wrappers.dart b/lib/src/unmodifiable_wrappers.dart
index 5dc1107..5efbee4 100644
--- a/lib/src/unmodifiable_wrappers.dart
+++ b/lib/src/unmodifiable_wrappers.dart
@@ -2,11 +2,10 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'dart:collection' show IterableBase;
+export "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
import 'wrappers.dart';
-
-export "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
+import 'empty_unmodifiable_set.dart';
/// A fixed-length list.
///
@@ -96,113 +95,13 @@
with UnmodifiableSetMixin<E> {
UnmodifiableSetView(Set<E> setBase) : super(setBase);
- /// Returns an unmodifiable empty set.
- const factory UnmodifiableSetView.empty() = _EmptyUnmodifiableSet<E>;
+ /// An unmodifiable empty set.
+ ///
+ /// This is the same as `new UnmodifiableSetView(new Set())`, except that it
+ /// can be used in const contexts.
+ const factory UnmodifiableSetView.empty() = EmptyUnmodifiableSet<E>;
}
-/// An unmodifiable empty set that doesn't allow adding-operations.
-/// Removing-operations are ok, because the don't modify the contents of an
-/// empty set.
-// A super class with const constructor is needed, so IterableBase<E> fits.
-class _EmptyUnmodifiableSet<E> extends IterableBase<E>
- implements UnmodifiableSetView<E> {
- static /*=T*/ _throw/*<T>*/() {
- throw new UnsupportedError(
- "Cannot call modifying operations on an unmodifiable Set");
- }
-
- /// Returns an empty Iterator.
- // new Iterabel.generate(0).iterator reduces to
- // new EmptyIterable().iterator so this should be efficient.
- Iterator<E> get _emptyIterator => new Iterable<E>.generate(0).iterator;
-
- /// Returns always an empty Iterator;
- @override
- Iterator<E> get iterator => _emptyIterator;
-
- /// Returns always 0;
- /// The length of en empty Set fixed to 0.
- @override
- int get length => 0;
-
- const _EmptyUnmodifiableSet();
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- bool add(E value) => _throw();
-
- /// Throws an [UnsupportedError];
- /// operations that add to the set are disallowed.
- @override
- void addAll(Iterable<E> elements) => _throw();
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- void clear() => _throw();
-
- /// Returns always false;
- /// The empty set doesn't contain any elements.
- @override
- bool contains(Object element) => false;
-
- /// Returns true if other is empty, else false:
- @override
- bool containsAll(Iterable<Object> other) => other.isEmpty;
-
- /// Returns always null;
- /// The empty set doesn't contain any elements and therefore returns null.
- @override
- E lookup(Object element) => null;
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- bool remove(Object element) => _throw();
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- void removeAll(Iterable<Object> elements) => _throw();
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- void removeWhere(bool test(E element)) => _throw();
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- void retainWhere(bool test(E element)) => _throw();
-
- /// Throws an [UnsupportedError];
- /// modifying operations are disallowed on unmodifiable sets.
- @override
- void retainAll(Iterable<Object> elements) => _throw();
-
- /// Returns itself because the behaviour (in regards to add(), remove())
- /// of the returning Set<E> should be the same.
- @override
- Set<E> toSet() => this;
-
- /// Returns a copy of other;
- /// union with an empty set leads to a copy.
- @override
- Set<E> union(Set<E> other) => new Set.from(other);
-
- /// Returns an empty set;
- /// there are no elements in this (empty) set that are also in other.
- @override
- Set<E> intersection(Set<Object> other) => new Set();
-
- /// Returns an empty set;
- /// there are no elements in this (empty) set that aren't in other.
- @override
- Set<E> difference(Set<Object> other) => new Set();
-}
-
-
/// Mixin class that implements a throwing version of all set operations that
/// change the Set.
abstract class UnmodifiableSetMixin<E> implements Set<E> {