part of dart.collection; abstract class Queue implements Iterable, EfficientLength {factory Queue() = ListQueue; factory Queue.from(Iterable elements) = ListQueue.from; E removeFirst(); E removeLast(); void addFirst(E value); void addLast(E value); void add(E value); bool remove(Object object); void addAll(Iterable iterable); void removeWhere(bool test(E element)); void retainWhere(bool test(E element)); void clear(); } class DoubleLinkedQueueEntry {DoubleLinkedQueueEntry _previous; DoubleLinkedQueueEntry _next; E _element; DoubleLinkedQueueEntry(E e) : _element = e; void _link(DoubleLinkedQueueEntry previous, DoubleLinkedQueueEntry next) { _next = next; _previous = previous; previous._next = this; next._previous = this; } void append(E e) { new DoubleLinkedQueueEntry(e)._link(this, _next); } void prepend(E e) { new DoubleLinkedQueueEntry(e)._link(_previous, this); } E remove() { _previous._next = _next; _next._previous = _previous; _next = null; _previous = null; return _element; } DoubleLinkedQueueEntry _asNonSentinelEntry() { return this; } DoubleLinkedQueueEntry previousEntry() { return _previous._asNonSentinelEntry(); } DoubleLinkedQueueEntry nextEntry() { return _next._asNonSentinelEntry(); } E get element { return _element; } void set element(E e) { _element = e; } } class _DoubleLinkedQueueEntrySentinel extends DoubleLinkedQueueEntry {_DoubleLinkedQueueEntrySentinel() : super(null) { _link(this, this); } E remove() { throw IterableElementError.noElement(); } DoubleLinkedQueueEntry _asNonSentinelEntry() { return null; } void set element(E e) { assert (false);} E get element { throw IterableElementError.noElement(); } } class DoubleLinkedQueue extends IterableBase implements Queue {_DoubleLinkedQueueEntrySentinel _sentinel; int _elementCount = 0; DoubleLinkedQueue() { _sentinel = new _DoubleLinkedQueueEntrySentinel(); } factory DoubleLinkedQueue.from(Iterable elements) { Queue list = new DoubleLinkedQueue(); for (final E e in DEVC$RT.cast(elements, DEVC$RT.type((Iterable _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 208, column 23 of dart:collection/queue.dart: """, elements is Iterable, false)) { list.addLast(e); } return DEVC$RT.cast(list, DEVC$RT.type((Queue _) { } ), DEVC$RT.type((DoubleLinkedQueue _) { } ), "CompositeCast", """line 211, column 12 of dart:collection/queue.dart: """, list is DoubleLinkedQueue, false); } int get length => _elementCount; void addLast(E value) { _sentinel.prepend(value); _elementCount++; } void addFirst(E value) { _sentinel.append(value); _elementCount++; } void add(E value) { _sentinel.prepend(value); _elementCount++; } void addAll(Iterable iterable) { for (final E value in iterable) { _sentinel.prepend(value); _elementCount++; } } E removeLast() { E result = _sentinel._previous.remove(); _elementCount--; return result; } E removeFirst() { E result = _sentinel._next.remove(); _elementCount--; return result; } bool remove(Object o) { DoubleLinkedQueueEntry entry = _sentinel._next; while (!identical(entry, _sentinel)) { if (entry.element == o) { entry.remove(); _elementCount--; return true; } entry = entry._next; } return false; } void _filter(bool test(E element), bool removeMatching) { DoubleLinkedQueueEntry entry = _sentinel._next; while (!identical(entry, _sentinel)) { DoubleLinkedQueueEntry next = entry._next; if (identical(removeMatching, test(entry.element))) { entry.remove(); _elementCount--; } entry = next; } } void removeWhere(bool test(E element)) { _filter(test, true); } void retainWhere(bool test(E element)) { _filter(test, false); } E get first { return _sentinel._next.element; } E get last { return _sentinel._previous.element; } E get single { if (identical(_sentinel._next, _sentinel._previous)) { return _sentinel._next.element; } throw IterableElementError.tooMany(); } DoubleLinkedQueueEntry lastEntry() { return _sentinel.previousEntry(); } DoubleLinkedQueueEntry firstEntry() { return _sentinel.nextEntry(); } bool get isEmpty { return (identical(_sentinel._next, _sentinel)); } void clear() { _sentinel._next = _sentinel; _sentinel._previous = _sentinel; _elementCount = 0; } void forEachEntry(void f(DoubleLinkedQueueEntry element)) { DoubleLinkedQueueEntry entry = _sentinel._next; while (!identical(entry, _sentinel)) { DoubleLinkedQueueEntry nextEntry = entry._next; f(entry); entry = nextEntry; } } _DoubleLinkedQueueIterator get iterator { return new _DoubleLinkedQueueIterator(_sentinel); } String toString() => IterableBase.iterableToFullString(this, '{', '}'); } class _DoubleLinkedQueueIterator implements Iterator {_DoubleLinkedQueueEntrySentinel _sentinel; DoubleLinkedQueueEntry _nextEntry = null; E _current; _DoubleLinkedQueueIterator(_DoubleLinkedQueueEntrySentinel sentinel) : _sentinel = sentinel, _nextEntry = sentinel._next; bool moveNext() { if (!identical(_nextEntry, _sentinel)) { _current = _nextEntry._element; _nextEntry = _nextEntry._next; return true; } _current = null; _nextEntry = _sentinel = null; return false; } E get current => _current; } class ListQueue extends IterableBase implements Queue {static const int _INITIAL_CAPACITY = 8; List _table; int _head; int _tail; int _modificationCount = 0; ListQueue([int initialCapacity]) : _head = 0, _tail = 0 { if (initialCapacity == null || initialCapacity < _INITIAL_CAPACITY) { initialCapacity = _INITIAL_CAPACITY; } else if (!_isPowerOf2(initialCapacity)) { initialCapacity = _nextPowerOf2(initialCapacity); } assert (_isPowerOf2(initialCapacity)); _table = new List(initialCapacity); } factory ListQueue.from(Iterable elements) { if (elements is List) { int length = elements.length; ListQueue queue = new ListQueue(length + 1); assert (queue._table.length > length); List sourceList = elements; queue._table.setRange(0, length, DEVC$RT.cast(sourceList, DEVC$RT.type((List _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 402, column 40 of dart:collection/queue.dart: """, sourceList is Iterable, false), 0); queue._tail = length; return queue; } else { int capacity = _INITIAL_CAPACITY; if (elements is EfficientLength) { capacity = elements.length; } ListQueue result = new ListQueue(capacity); for (final E element in DEVC$RT.cast(elements, DEVC$RT.type((Iterable _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 411, column 31 of dart:collection/queue.dart: """, elements is Iterable, false)) { result.addLast(element); } return result; } } Iterator get iterator => new _ListQueueIterator(this); void forEach(void action(E element)) { int modificationCount = _modificationCount; for (int i = _head; i != _tail; i = (i + 1) & (_table.length - 1)) { action(_table[i]); _checkModification(modificationCount); } } bool get isEmpty => _head == _tail; int get length => (_tail - _head) & (_table.length - 1); E get first { if (_head == _tail) throw IterableElementError.noElement(); return _table[_head]; } E get last { if (_head == _tail) throw IterableElementError.noElement(); return _table[(_tail - 1) & (_table.length - 1)]; } E get single { if (_head == _tail) throw IterableElementError.noElement(); if (length > 1) throw IterableElementError.tooMany(); return _table[_head]; } E elementAt(int index) { RangeError.checkValidIndex(index, this); return _table[(_head + index) & (_table.length - 1)]; } List toList({ bool growable : true} ) { List list; if (growable) { list = new List()..length = length; } else { list = new List(length); } _writeToList(list); return list; } void add(E element) { _add(element); } void addAll(Iterable elements) { if (elements is List) { List list = DEVC$RT.cast(elements, DEVC$RT.type((Iterable _) { } ), DEVC$RT.type((List _) { } ), "AssignmentCast", """line 474, column 19 of dart:collection/queue.dart: """, elements is List, true); int addCount = list.length; int length = this.length; if (length + addCount >= _table.length) { _preGrow(length + addCount); _table.setRange(length, length + addCount, DEVC$RT.cast(list, DEVC$RT.type((List _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 480, column 52 of dart:collection/queue.dart: """, list is Iterable, false), 0); _tail += addCount; } else { int endSpace = _table.length - _tail; if (addCount < endSpace) { _table.setRange(_tail, _tail + addCount, DEVC$RT.cast(list, DEVC$RT.type((List _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 486, column 52 of dart:collection/queue.dart: """, list is Iterable, false), 0); _tail += addCount; } else { int preSpace = addCount - endSpace; _table.setRange(_tail, _tail + endSpace, DEVC$RT.cast(list, DEVC$RT.type((List _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 490, column 52 of dart:collection/queue.dart: """, list is Iterable, false), 0); _table.setRange(0, preSpace, DEVC$RT.cast(list, DEVC$RT.type((List _) { } ), DEVC$RT.type((Iterable _) { } ), "CompositeCast", """line 491, column 40 of dart:collection/queue.dart: """, list is Iterable, false), endSpace); _tail = preSpace; } } _modificationCount++; } else { for (E element in elements) _add(element); } } bool remove(Object object) { for (int i = _head; i != _tail; i = (i + 1) & (_table.length - 1)) { E element = _table[i]; if (element == object) { _remove(i); _modificationCount++; return true; } } return false; } void _filterWhere(bool test(E element), bool removeMatching) { int index = _head; int modificationCount = _modificationCount; int i = _head; while (i != _tail) { E element = _table[i]; bool remove = identical(removeMatching, test(element)); _checkModification(modificationCount); if (remove) { i = _remove(i); modificationCount = ++_modificationCount; } else { i = (i + 1) & (_table.length - 1); } } } void removeWhere(bool test(E element)) { _filterWhere(test, true); } void retainWhere(bool test(E element)) { _filterWhere(test, false); } void clear() { if (_head != _tail) { for (int i = _head; i != _tail; i = (i + 1) & (_table.length - 1)) { _table[i] = null; } _head = _tail = 0; _modificationCount++; } } String toString() => IterableBase.iterableToFullString(this, "{", "}"); void addLast(E element) { _add(element); } void addFirst(E element) { _head = (_head - 1) & (_table.length - 1); _table[_head] = element; if (_head == _tail) _grow(); _modificationCount++; } E removeFirst() { if (_head == _tail) throw IterableElementError.noElement(); _modificationCount++; E result = _table[_head]; _table[_head] = null; _head = (_head + 1) & (_table.length - 1); return result; } E removeLast() { if (_head == _tail) throw IterableElementError.noElement(); _modificationCount++; _tail = (_tail - 1) & (_table.length - 1); E result = _table[_tail]; _table[_tail] = null; return result; } static bool _isPowerOf2(int number) => (number & (number - 1)) == 0; static int _nextPowerOf2(int number) { assert (number > 0); number = (number << 1) - 1; for (;;) { int nextNumber = number & (number - 1); if (nextNumber == 0) return number; number = nextNumber; } } void _checkModification(int expectedModificationCount) { if (expectedModificationCount != _modificationCount) { throw new ConcurrentModificationError(this); } } void _add(E element) { _table[_tail] = element; _tail = (_tail + 1) & (_table.length - 1); if (_head == _tail) _grow(); _modificationCount++; } int _remove(int offset) { int mask = _table.length - 1; int startDistance = (offset - _head) & mask; int endDistance = (_tail - offset) & mask; if (startDistance < endDistance) { int i = offset; while (i != _head) { int prevOffset = (i - 1) & mask; _table[i] = _table[prevOffset]; i = prevOffset; } _table[_head] = null; _head = (_head + 1) & mask; return (offset + 1) & mask; } else { _tail = (_tail - 1) & mask; int i = offset; while (i != _tail) { int nextOffset = (i + 1) & mask; _table[i] = _table[nextOffset]; i = nextOffset; } _table[_tail] = null; return offset; } } void _grow() { List newTable = new List(_table.length * 2); int split = _table.length - _head; newTable.setRange(0, split, _table, _head); newTable.setRange(split, split + _head, _table, 0); _head = 0; _tail = _table.length; _table = newTable; } int _writeToList(List target) { assert (target.length >= length); if (_head <= _tail) { int length = _tail - _head; target.setRange(0, length, _table, _head); return length; } else { int firstPartSize = _table.length - _head; target.setRange(0, firstPartSize, _table, _head); target.setRange(firstPartSize, firstPartSize + _tail, _table, 0); return _tail + firstPartSize; } } void _preGrow(int newElementCount) { assert (newElementCount >= length); newElementCount += newElementCount >> 1; int newCapacity = _nextPowerOf2(newElementCount); List newTable = new List(newCapacity); _tail = _writeToList(newTable); _table = newTable; _head = 0; } } class _ListQueueIterator implements Iterator {final ListQueue _queue; final int _end; final int _modificationCount; int _position; E _current; _ListQueueIterator(ListQueue queue) : _queue = queue, _end = queue._tail, _modificationCount = queue._modificationCount, _position = queue._head; E get current => _current; bool moveNext() { _queue._checkModification(_modificationCount); if (_position == _end) { _current = null; return false; } _current = ((__x11) => DEVC$RT.cast(__x11, dynamic, E, "CompositeCast", """line 738, column 16 of dart:collection/queue.dart: """, __x11 is E, false))(_queue._table[_position]); _position = (_position + 1) & (_queue._table.length - 1); return true; } }