| Index: pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart
|
| diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart
|
| deleted file mode 100644
|
| index 481f04dde02fd599b8d9ac36d131cb1e360c221b..0000000000000000000000000000000000000000
|
| --- a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart
|
| +++ /dev/null
|
| @@ -1,301 +0,0 @@
|
| -// Copyright (c) 2013, 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.
|
| -
|
| -part of dart.collection;
|
| -
|
| -
|
| -/**
|
| - * A specialized double-linked list of elements that extends [LinkedListEntry].
|
| - *
|
| - * This is not a generic data structure. It only accepts elements that extend
|
| - * the [LinkedListEntry] class. See the [Queue] implementations for
|
| - * generic collections that allow constant time adding and removing at the ends.
|
| - *
|
| - * This is not a [List] implementation. Despite its name, this class does not
|
| - * implement the [List] interface. It does not allow constant time lookup by
|
| - * index.
|
| - *
|
| - * Because the elements themselves contain the links of this linked list,
|
| - * each element can be in only one list at a time. To add an element to another
|
| - * list, it must first be removed from its current list (if any).
|
| - *
|
| - * In return, each element knows its own place in the linked list, as well as
|
| - * which list it is in. This allows constant time [LinkedListEntry.addAfter],
|
| - * [LinkedListEntry.addBefore] and [LinkedListEntry.unlink] operations
|
| - * when all you have is the element.
|
| - *
|
| - * A `LinkedList` also allows constant time adding and removing at either end,
|
| - * and a constant time length getter.
|
| - */
|
| -class LinkedList<E extends LinkedListEntry<E>>
|
| - extends Iterable<E> {
|
| -
|
| - int _modificationCount = 0;
|
| - int _length = 0;
|
| - E _first;
|
| -
|
| - /**
|
| - * Construct a new empty linked list.
|
| - */
|
| - LinkedList();
|
| -
|
| - /**
|
| - * Add [entry] to the beginning of the linked list.
|
| - */
|
| - void addFirst(E entry) {
|
| - _insertBefore(_first, entry, updateFirst: true);
|
| - _first = entry;
|
| - }
|
| -
|
| - /**
|
| - * Add [entry] to the end of the linked list.
|
| - */
|
| - void add(E entry) {
|
| - _insertBefore(_first, entry, updateFirst: false);
|
| - }
|
| -
|
| - /**
|
| - * Add [entries] to the end of the linked list.
|
| - */
|
| - void addAll(Iterable<E> entries) {
|
| - entries.forEach(add);
|
| - }
|
| -
|
| - /**
|
| - * Remove [entry] from the linked list.
|
| - *
|
| - * Returns false and does nothing if [entry] is not in this linked list.
|
| - *
|
| - * This is equivalent to calling `entry.unlink()` if the entry is in this
|
| - * list.
|
| - */
|
| - bool remove(E entry) {
|
| - if (entry._list != this) return false;
|
| - _unlink(entry); // Unlink will decrement length.
|
| - return true;
|
| - }
|
| -
|
| - Iterator<E> get iterator => new _LinkedListIterator<E>(this);
|
| -
|
| - int get length => _length;
|
| -
|
| - /**
|
| - * Remove all elements from this linked list.
|
| - */
|
| - void clear() {
|
| - _modificationCount++;
|
| - if (isEmpty) return;
|
| -
|
| - E next = _first;
|
| - do {
|
| - E entry = next;
|
| - next = entry._next;
|
| - entry._next = entry._previous = entry._list = null;
|
| - } while (!identical(next, _first));
|
| -
|
| - _first = null;
|
| - _length = 0;
|
| - }
|
| -
|
| - E get first {
|
| - if (isEmpty) {
|
| - throw new StateError('No such element');
|
| - }
|
| - return _first;
|
| - }
|
| -
|
| - E get last {
|
| - if (isEmpty) {
|
| - throw new StateError('No such element');
|
| - }
|
| - return _first._previous;
|
| - }
|
| -
|
| - E get single {
|
| - if (isEmpty) {
|
| - throw new StateError('No such element');
|
| - }
|
| - if (_length > 1) {
|
| - throw new StateError('Too many elements');
|
| - }
|
| - return _first;
|
| - }
|
| -
|
| - /**
|
| - * Call [action] with each entry in this linked list.
|
| - *
|
| - * It's an error if [action] modify the linked list.
|
| - */
|
| - void forEach(void action(E entry)) {
|
| - int modificationCount = _modificationCount;
|
| - if (isEmpty) return;
|
| -
|
| - E current = _first;
|
| - do {
|
| - action(current);
|
| - if (modificationCount != _modificationCount) {
|
| - throw new ConcurrentModificationError(this);
|
| - }
|
| - current = current._next;
|
| - } while (!identical(current, _first));
|
| - }
|
| -
|
| - bool get isEmpty => _length == 0;
|
| -
|
| - /// Inserts [newEntry] as last entry of the list.
|
| - ///
|
| - /// If [updateFirst] is true and [entry] is the first entry in the list,
|
| - /// updates the [_first] field to point to the [newEntry] as first entry.
|
| - void _insertBefore(E entry, E newEntry, {bool updateFirst}) {
|
| - if (newEntry.list != null) {
|
| - throw new StateError(
|
| - 'LinkedListEntry is already in a LinkedList');
|
| - }
|
| - _modificationCount++;
|
| -
|
| - newEntry._list = this;
|
| - if (isEmpty) {
|
| - assert(entry == null);
|
| - newEntry._previous = newEntry._next = newEntry;
|
| - _first = newEntry;
|
| - _length++;
|
| - return;
|
| - }
|
| - E predecessor = entry._previous;
|
| - E successor = entry;
|
| - newEntry._previous = predecessor;
|
| - newEntry._next = successor;
|
| - predecessor._next = newEntry;
|
| - successor._previous = newEntry;
|
| - if (updateFirst && identical(entry, _first)) {
|
| - _first = newEntry;
|
| - }
|
| - _length++;
|
| - }
|
| -
|
| - void _unlink(E entry) {
|
| - _modificationCount++;
|
| - entry._next._previous = entry._previous;
|
| - E next = entry._previous._next = entry._next;
|
| - _length--;
|
| - entry._list = entry._next = entry._previous = null;
|
| - if (isEmpty) {
|
| - _first = null;
|
| - } else if (identical(entry, _first)) {
|
| - _first = next;
|
| - }
|
| - }
|
| -}
|
| -
|
| -
|
| -class _LinkedListIterator<E extends LinkedListEntry<E>>
|
| - implements Iterator<E> {
|
| - final LinkedList<E> _list;
|
| - final int _modificationCount;
|
| - E _current;
|
| - LinkedListEntry<E> _next;
|
| - bool _visitedFirst;
|
| -
|
| - _LinkedListIterator(LinkedList<E> list)
|
| - : _list = list,
|
| - _modificationCount = list._modificationCount,
|
| - _next = list._first,
|
| - _visitedFirst = false;
|
| -
|
| - E get current => _current;
|
| -
|
| - bool moveNext() {
|
| - if (_modificationCount != _list._modificationCount) {
|
| - throw new ConcurrentModificationError(this);
|
| - }
|
| - if (_list.isEmpty ||
|
| - (_visitedFirst && identical(_next, _list.first))) {
|
| - _current = null;
|
| - return false;
|
| - }
|
| - _visitedFirst = true;
|
| - _current = _next;
|
| - _next = _next._next;
|
| - return true;
|
| - }
|
| -}
|
| -
|
| -
|
| -/**
|
| - * An object that can be an element in a [LinkedList].
|
| - *
|
| - * All elements of a `LinkedList` must extend this class.
|
| - * The class provides the internal links that link elements together
|
| - * in the `LinkedList`, and a reference to the linked list itself
|
| - * that an element is currently part of.
|
| - *
|
| - * An entry can be in at most one linked list at a time.
|
| - * While an entry is in a linked list, the [list] property points to that
|
| - * linked list, and otherwise the `list` property is `null`.
|
| - *
|
| - * When created, an entry is not in any linked list.
|
| - */
|
| -abstract class LinkedListEntry<E extends LinkedListEntry<E>> {
|
| - LinkedList<E> _list;
|
| - E _next;
|
| - E _previous;
|
| -
|
| - /**
|
| - * Get the linked list containing this element.
|
| - *
|
| - * Returns `null` if this entry is not currently in any list.
|
| - */
|
| - LinkedList<E> get list => _list;
|
| -
|
| - /**
|
| - * Unlink the element from its linked list.
|
| - *
|
| - * The entry must currently be in a linked list when this method is called.
|
| - */
|
| - void unlink() {
|
| - _list._unlink(this);
|
| - }
|
| -
|
| - /**
|
| - * Return the succeessor of this element in its linked list.
|
| - *
|
| - * Returns `null` if there is no successor in the linked list, or if this
|
| - * entry is not currently in any list.
|
| - */
|
| - E get next {
|
| - if (identical(this, _next)) return null;
|
| - return _next;
|
| - }
|
| -
|
| - /**
|
| - * Return the predecessor of this element in its linked list.
|
| - *
|
| - * Returns `null` if there is no predecessor in the linked list, or if this
|
| - * entry is not currently in any list.
|
| - */
|
| - E get previous {
|
| - if (identical(this, _previous)) return null;
|
| - return _previous;
|
| - }
|
| -
|
| - /**
|
| - * Insert an element after this element in this element's linked list.
|
| - *
|
| - * This entry must be in a linked list when this method is called.
|
| - * The [entry] must not be in a linked list.
|
| - */
|
| - void insertAfter(E entry) {
|
| - _list._insertBefore(_next, entry, updateFirst: false);
|
| - }
|
| -
|
| - /**
|
| - * Insert an element before this element in this element's linked list.
|
| - *
|
| - * This entry must be in a linked list when this method is called.
|
| - * The [entry] must not be in a linked list.
|
| - */
|
| - void insertBefore(E entry) {
|
| - _list._insertBefore(this as dynamic/*=E*/, entry, updateFirst: true);
|
| - }
|
| -}
|
|
|