| Index: sdk/lib/collection/queue.dart
|
| diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
|
| index db7160d0fe1557f01425bf088aa48f307483f0c0..816f62e78c4b59bb8187c658952229db169893f3 100644
|
| --- a/sdk/lib/collection/queue.dart
|
| +++ b/sdk/lib/collection/queue.dart
|
| @@ -96,11 +96,11 @@ abstract class Queue<E> implements Iterable<E>, EfficientLength {
|
| }
|
|
|
|
|
| -class _DoubleLink<E extends _DoubleLink> {
|
| - E _previousLink;
|
| - E _nextLink;
|
| +class _DoubleLink<Link extends _DoubleLink> {
|
| + Link _previousLink;
|
| + Link _nextLink;
|
|
|
| - void _link(E previous, E next) {
|
| + void _link(Link previous, Link next) {
|
| _nextLink = next;
|
| _previousLink = previous;
|
| if (previous != null) previous._nextLink = this;
|
| @@ -119,43 +119,20 @@ class _DoubleLink<E extends _DoubleLink> {
|
| * An entry in a doubly linked list. It contains a pointer to the next
|
| * entry, the previous entry, and the boxed element.
|
| */
|
| -abstract class DoubleLinkedQueueEntry<E> {
|
| - factory DoubleLinkedQueueEntry(E element) = _UserDoubleLinkedQueueEntry<E>;
|
| -
|
| +class DoubleLinkedQueueEntry<E> extends _DoubleLink<DoubleLinkedQueueEntry<E>> {
|
| /// The element in the queue.
|
| - E get element;
|
| -
|
| - /// Appends the given [e] as entry just after this entry.
|
| - void append(E e);
|
| -
|
| - /// Prepends the given [e] as entry just before this entry.
|
| - void prepend(E e);
|
| -
|
| - /// Returns the previous entry or `null` if there is none.
|
| - DoubleLinkedQueueEntry<E> previousEntry();
|
| -
|
| - /// Returns the next entry or `null` if there is none.
|
| - DoubleLinkedQueueEntry<E> nextEntry();
|
| -}
|
| -
|
| -/// Default implementation of a doubly linked queue entry.
|
| -///
|
| -/// This implementation is only used if a user instantiates a
|
| -/// [DoubleLinkedQueueEntry] directly. The internal implementations don't use
|
| -/// this class.
|
| -class _UserDoubleLinkedQueueEntry<E>
|
| - extends _DoubleLink<_UserDoubleLinkedQueueEntry<E>>
|
| - implements DoubleLinkedQueueEntry<E> {
|
| E element;
|
|
|
| - _UserDoubleLinkedQueueEntry(this.element);
|
| + DoubleLinkedQueueEntry(this.element);
|
|
|
| + /// Appends the given [e] as entry just after this entry.
|
| void append(E e) {
|
| - new _UserDoubleLinkedQueueEntry<E>(e)._link(this, _nextLink);
|
| + new DoubleLinkedQueueEntry<E>(e)._link(this, _nextLink);
|
| }
|
|
|
| + /// Prepends the given [e] as entry just before this entry.
|
| void prepend(E e) {
|
| - new _UserDoubleLinkedQueueEntry<E>(e)._link(_previousLink, this);
|
| + new DoubleLinkedQueueEntry<E>(e)._link(_previousLink, this);
|
| }
|
|
|
| E remove() {
|
| @@ -163,8 +140,10 @@ class _UserDoubleLinkedQueueEntry<E>
|
| return element;
|
| }
|
|
|
| + /// Returns the previous entry or `null` if there is none.
|
| DoubleLinkedQueueEntry<E> previousEntry() => _previousLink;
|
|
|
| + /// Returns the next entry or `null` if there is none.
|
| DoubleLinkedQueueEntry<E> nextEntry() => _nextLink;
|
| }
|
|
|
| @@ -177,9 +156,9 @@ class _UserDoubleLinkedQueueEntry<E>
|
| * or `prepend` can correctly update the element count.
|
| */
|
| abstract class _DoubleLinkedQueueEntry<E>
|
| - extends _DoubleLink<_DoubleLinkedQueueEntry<E>> {
|
| + extends DoubleLinkedQueueEntry<E> {
|
| DoubleLinkedQueue<E> _queue;
|
| - _DoubleLinkedQueueEntry(this._queue);
|
| + _DoubleLinkedQueueEntry(E element, this._queue) : super(element);
|
|
|
| DoubleLinkedQueueEntry<E> _asNonSentinelEntry();
|
|
|
| @@ -193,14 +172,18 @@ abstract class _DoubleLinkedQueueEntry<E>
|
|
|
| E _remove();
|
|
|
| - E get element;
|
| + E get _element => element;
|
|
|
| DoubleLinkedQueueEntry<E> nextEntry() {
|
| - return _nextLink._asNonSentinelEntry();
|
| + _DoubleLinkedQueueEntry<E> entry =
|
| + _nextLink as dynamic/*=DoubleLinkedQueueEntry<E>*/;
|
| + return entry._asNonSentinelEntry();
|
| }
|
|
|
| DoubleLinkedQueueEntry<E> previousEntry() {
|
| - return _previousLink._asNonSentinelEntry();
|
| + _DoubleLinkedQueueEntry<E> entry =
|
| + _previousLink as dynamic/*=DoubleLinkedQueueEntry<E>*/;
|
| + return entry._asNonSentinelEntry();
|
| }
|
| }
|
|
|
| @@ -210,11 +193,9 @@ abstract class _DoubleLinkedQueueEntry<E>
|
| * The entry contains a reference to the queue, allowing
|
| * [append]/[prepend] to update the list length.
|
| */
|
| -class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E>
|
| - implements DoubleLinkedQueueEntry<E> {
|
| - E element;
|
| - _DoubleLinkedQueueElement(this.element, DoubleLinkedQueue<E> queue)
|
| - : super(queue);
|
| +class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E> {
|
| + _DoubleLinkedQueueElement(E element, DoubleLinkedQueue<E> queue)
|
| + : super(element, queue);
|
|
|
| void append(E e) {
|
| _append(e);
|
| @@ -251,7 +232,8 @@ class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E>
|
| * A sentinel does not box any user element.
|
| */
|
| class _DoubleLinkedQueueSentinel<E> extends _DoubleLinkedQueueEntry<E> {
|
| - _DoubleLinkedQueueSentinel(DoubleLinkedQueue<E> queue) : super(queue) {
|
| + _DoubleLinkedQueueSentinel(DoubleLinkedQueue<E> queue)
|
| + : super(null, queue) {
|
| _previousLink = this;
|
| _nextLink = this;
|
| }
|
| @@ -266,7 +248,7 @@ class _DoubleLinkedQueueSentinel<E> extends _DoubleLinkedQueueEntry<E> {
|
| }
|
|
|
| /** Hit by, e.g., [DoubleLinkedQueue.first] if the queue is empty. */
|
| - E get element {
|
| + E get _element {
|
| throw IterableElementError.noElement();
|
| }
|
| }
|
| @@ -340,7 +322,7 @@ class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
|
| bool remove(Object o) {
|
| _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
|
| while (!identical(entry, _sentinel)) {
|
| - if (entry.element == o) {
|
| + if (entry._element == o) {
|
| entry._remove();
|
| _elementCount--;
|
| return true;
|
| @@ -354,7 +336,7 @@ class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
|
| _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
|
| while (!identical(entry, _sentinel)) {
|
| _DoubleLinkedQueueEntry<E> next = entry._nextLink;
|
| - if (identical(removeMatching, test(entry.element))) {
|
| + if (identical(removeMatching, test(entry._element))) {
|
| entry._remove();
|
| _elementCount--;
|
| }
|
| @@ -372,12 +354,12 @@ class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
|
|
|
| E get first {
|
| _DoubleLinkedQueueEntry<E> firstEntry = _sentinel._nextLink;
|
| - return firstEntry.element;
|
| + return firstEntry._element;
|
| }
|
|
|
| E get last {
|
| _DoubleLinkedQueueEntry<E> lastEntry = _sentinel._previousLink;
|
| - return lastEntry.element;
|
| + return lastEntry._element;
|
| }
|
|
|
| E get single {
|
| @@ -385,7 +367,7 @@ class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
|
| // because reading element on the sentinel throws.
|
| if (identical(_sentinel._nextLink, _sentinel._previousLink)) {
|
| _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
|
| - return entry.element;
|
| + return entry._element;
|
| }
|
| throw IterableElementError.tooMany();
|
| }
|
| @@ -445,7 +427,7 @@ class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
|
| if (elementEntry._queue == null) {
|
| throw new ConcurrentModificationError(_sentinel._queue);
|
| }
|
| - _current = elementEntry.element;
|
| + _current = elementEntry._element;
|
| _nextEntry = elementEntry._nextLink;
|
| return true;
|
| }
|
|
|