blob: b27614e892dc91ba14f41d3fc5717ebd43d3c609 [file] [log] [blame]
// Copyright (c) 2015, Google Inc. 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.
typedef Set<E> _SetFactory<E>();
class CopyOnWriteSet<E> implements Set<E> {
final _SetFactory<E> _setFactory;
bool _copyBeforeWrite;
Set<E> _set;
CopyOnWriteSet(this._set, [this._setFactory]) : _copyBeforeWrite = true;
// Read-only methods: just forward.
@override
int get length => _set.length;
@override
E lookup(Object object) => _set.lookup(object);
@override
Set<E> intersection(Set<Object> other) => _set.intersection(other);
@override
Set<E> union(Set<E> other) => _set.union(other);
@override
Set<E> difference(Set<Object> other) => _set.difference(other);
@override
bool containsAll(Iterable<Object> other) => _set.containsAll(other);
@override
bool any(bool test(E element)) => _set.any(test);
@override
Set<T> cast<T>() => new CopyOnWriteSet<T>(_set.cast<T>());
@override
bool contains(Object element) => _set.contains(element);
@override
E elementAt(int index) => _set.elementAt(index);
@override
bool every(bool test(E element)) => _set.every(test);
@override
Iterable<T> expand<T>(Iterable<T> f(E e)) => _set.expand(f);
@override
E get first => _set.first;
@override
E firstWhere(bool test(E element), {E orElse()}) =>
_set.firstWhere(test, orElse: orElse);
@override
T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
_set.fold(initialValue, combine);
@override
Iterable<E> followedBy(Iterable<E> other) => _set.followedBy(other);
@override
void forEach(void f(E element)) => _set.forEach(f);
@override
bool get isEmpty => _set.isEmpty;
@override
bool get isNotEmpty => _set.isNotEmpty;
@override
Iterator<E> get iterator => _set.iterator;
@override
String join([String separator = ""]) => _set.join(separator);
@override
E get last => _set.last;
@override
E lastWhere(bool test(E element), {E orElse()}) =>
_set.lastWhere(test, orElse: orElse);
@override
Iterable<T> map<T>(T f(E e)) => _set.map(f);
@override
E reduce(E combine(E value, E element)) => _set.reduce(combine);
@override
E get single => _set.single;
@override
E singleWhere(bool test(E element), {E orElse()}) =>
_set.singleWhere(test, orElse: orElse);
@override
Iterable<E> skip(int count) => _set.skip(count);
@override
Iterable<E> skipWhile(bool test(E value)) => _set.skipWhile(test);
@override
Iterable<E> take(int count) => _set.take(count);
@override
Iterable<E> takeWhile(bool test(E value)) => _set.takeWhile(test);
@override
List<E> toList({bool growable: true}) => _set.toList(growable: growable);
@override
Set<E> toSet() => _set.toSet();
@override
Iterable<E> where(bool test(E element)) => _set.where(test);
@override
Iterable<T> whereType<T>() => _set.whereType<T>();
// Mutating methods: copy first if needed.
@override
bool add(E value) {
_maybeCopyBeforeWrite();
return _set.add(value);
}
@override
void addAll(Iterable<E> iterable) {
_maybeCopyBeforeWrite();
_set.addAll(iterable);
}
@override
void clear() {
_maybeCopyBeforeWrite();
_set.clear();
}
@override
bool remove(Object value) {
_maybeCopyBeforeWrite();
return _set.remove(value);
}
@override
void removeWhere(bool test(E element)) {
_maybeCopyBeforeWrite();
_set.removeWhere(test);
}
@override
void retainWhere(bool test(E element)) {
_maybeCopyBeforeWrite();
_set.retainWhere(test);
}
@override
void removeAll(Iterable<Object> elements) {
_maybeCopyBeforeWrite();
_set.removeAll(elements);
}
@override
void retainAll(Iterable<Object> elements) {
_maybeCopyBeforeWrite();
_set.retainAll(elements);
}
@override
String toString() => _set.toString();
// Internal.
void _maybeCopyBeforeWrite() {
if (!_copyBeforeWrite) return;
_copyBeforeWrite = false;
_set = _setFactory != null
? (_setFactory()..addAll(_set))
: new Set<E>.from(_set);
}
}