Index: sdk/lib/collection/queue.dart |
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart |
index 975939a9da58f105a51a8fd877b86eda9c75a5cd..fab19e9225df8d250b8f8094ca008f5e78589f13 100644 |
--- a/sdk/lib/collection/queue.dart |
+++ b/sdk/lib/collection/queue.dart |
@@ -162,6 +162,7 @@ class _DoubleLinkedQueueEntrySentinel<E> extends DoubleLinkedQueueEntry<E> { |
*/ |
class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> { |
_DoubleLinkedQueueEntrySentinel<E> _sentinel; |
+ int _elementCount = 0; |
DoubleLinkedQueue() { |
_sentinel = new _DoubleLinkedQueueEntrySentinel<E>(); |
@@ -175,30 +176,40 @@ class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> { |
return list; |
} |
+ int get length => _elementCount; |
+ |
void addLast(E value) { |
_sentinel.prepend(value); |
+ _elementCount++; |
} |
void addFirst(E value) { |
_sentinel.append(value); |
+ _elementCount++; |
} |
void add(E value) { |
- addLast(value); |
+ _sentinel.prepend(value); |
+ _elementCount++; |
} |
void addAll(Iterable<E> iterable) { |
- for (final e in iterable) { |
- add(e); |
+ for (final E value in iterable) { |
+ _sentinel.prepend(value); |
+ _elementCount++; |
} |
} |
E removeLast() { |
- return _sentinel._previous.remove(); |
+ E result = _sentinel._previous.remove(); |
+ _elementCount--; |
+ return result; |
} |
E removeFirst() { |
- return _sentinel._next.remove(); |
+ E result = _sentinel._next.remove(); |
+ _elementCount--; |
+ return result; |
} |
void remove(Object o) { |
@@ -206,6 +217,7 @@ class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> { |
while (!identical(entry, _sentinel)) { |
if (entry.element == o) { |
entry.remove(); |
+ _elementCount--; |
return; |
} |
entry = entry._next; |
@@ -223,6 +235,7 @@ class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> { |
DoubleLinkedQueueEntry<E> next = entry._next; |
if (test(entry.element)) { |
entry.remove(); |
+ _elementCount--; |
} |
entry = next; |
} |
@@ -234,6 +247,7 @@ class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> { |
DoubleLinkedQueueEntry<E> next = entry._next; |
if (!test(entry.element)) { |
entry.remove(); |
+ _elementCount--; |
} |
entry = next; |
} |
@@ -270,6 +284,7 @@ class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> { |
void clear() { |
_sentinel._next = _sentinel; |
_sentinel._previous = _sentinel; |
+ _elementCount = 0; |
} |
void forEachEntry(void f(DoubleLinkedQueueEntry<E> element)) { |