| Index: frog/leg/util/link_implementation.dart
|
| ===================================================================
|
| --- frog/leg/util/link_implementation.dart (revision 5925)
|
| +++ frog/leg/util/link_implementation.dart (working copy)
|
| @@ -1,165 +0,0 @@
|
| -// Copyright (c) 2011, 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.
|
| -
|
| -class LinkIterator<T> implements Iterator<T> {
|
| - Link<T> current;
|
| - LinkIterator(Link<T> this.current);
|
| - bool hasNext() => !current.isEmpty();
|
| - T next() {
|
| - T result = current.head;
|
| - current = current.tail;
|
| - return result;
|
| - }
|
| -}
|
| -
|
| -class LinkFactory<T> {
|
| - factory Link(T head, [Link<T> tail]) {
|
| - if (tail === null) {
|
| - tail = new LinkTail<T>();
|
| - }
|
| - return new LinkEntry<T>(head, tail);
|
| - }
|
| -
|
| - factory Link.fromList(List<T> list) {
|
| - switch (list.length) {
|
| - case 0:
|
| - return new LinkTail<T>();
|
| - case 1:
|
| - return new Link<T>(list[0]);
|
| - case 2:
|
| - return new Link<T>(list[0], new Link<T>(list[1]));
|
| - case 3:
|
| - return new Link<T>(list[0], new Link<T>(list[1], new Link<T>(list[2])));
|
| - }
|
| - Link link = new Link<T>(list.last());
|
| - for (int i = list.length - 1; i > 0; i--) {
|
| - link = link.prepend(list[i - 1]);
|
| - }
|
| - return link;
|
| - }
|
| -}
|
| -
|
| -class LinkTail<T> implements EmptyLink<T> {
|
| - T get head() => null;
|
| - Link<T> get tail() => null;
|
| -
|
| - const LinkTail();
|
| -
|
| - Link<T> prepend(T element) {
|
| - // TODO(ahe): Use new Link<T>, but this cost 8% performance on VM.
|
| - return new LinkEntry<T>(element, this);
|
| - }
|
| -
|
| - Iterator<T> iterator() => new LinkIterator<T>(this);
|
| -
|
| - void printOn(StringBuffer buffer, [separatedBy]) {
|
| - }
|
| -
|
| - String toString() => "[]";
|
| -
|
| - Link<T> reverse() => this;
|
| -
|
| - Link<T> reversePrependAll(Link<T> from) {
|
| - if (from.isEmpty()) return this;
|
| - return from.head.reversePrependAll(from.tail);
|
| - }
|
| -
|
| - List toList() => const [];
|
| -
|
| - bool isEmpty() => true;
|
| -
|
| - void forEach(void f(T element)) {}
|
| -}
|
| -
|
| -class LinkEntry<T> implements Link<T> {
|
| - final T head;
|
| - Link<T> tail;
|
| -
|
| - LinkEntry(T this.head, Link<T> this.tail);
|
| -
|
| - Link<T> prepend(T element) {
|
| - // TODO(ahe): Use new Link<T>, but this cost 8% performance on VM.
|
| - return new LinkEntry<T>(element, this);
|
| - }
|
| -
|
| - Iterator<T> iterator() => new LinkIterator<T>(this);
|
| -
|
| - void printOn(StringBuffer buffer, [separatedBy]) {
|
| - buffer.add(head);
|
| - if (separatedBy === null) separatedBy = '';
|
| - for (Link link = tail; !link.isEmpty(); link = link.tail) {
|
| - buffer.add(separatedBy);
|
| - buffer.add(link.head);
|
| - }
|
| - }
|
| -
|
| - String toString() {
|
| - StringBuffer buffer = new StringBuffer();
|
| - buffer.add('[ ');
|
| - printOn(buffer, ', ');
|
| - buffer.add(' ]');
|
| - return buffer.toString();
|
| - }
|
| -
|
| - Link<T> reverse() {
|
| - Link<T> result = const LinkTail();
|
| - for (Link<T> link = this; !link.isEmpty(); link = link.tail) {
|
| - result = result.prepend(link.head);
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - Link<T> reversePrependAll(Link<T> from) {
|
| - Link<T> result;
|
| - for (result = this; !from.isEmpty(); from = from.tail) {
|
| - result = result.prepend(from.head);
|
| - }
|
| - return result;
|
| - }
|
| -
|
| -
|
| - bool isEmpty() => false;
|
| -
|
| - List<T> toList() {
|
| - List<T> list = new List<T>();
|
| - for (Link<T> link = this; !link.isEmpty(); link = link.tail) {
|
| - list.addLast(link.head);
|
| - }
|
| - return list;
|
| - }
|
| -
|
| - void forEach(void f(T element)) {
|
| - for (Link<T> link = this; !link.isEmpty(); link = link.tail) {
|
| - f(link.head);
|
| - }
|
| - }
|
| -}
|
| -
|
| -class LinkBuilderImplementation<T> implements LinkBuilder<T> {
|
| - LinkEntry<T> head = null;
|
| - LinkEntry<T> lastLink = null;
|
| - int length = 0;
|
| -
|
| - LinkBuilderImplementation();
|
| -
|
| - Link<T> toLink() {
|
| - if (head === null) return const LinkTail();
|
| - lastLink.tail = const LinkTail();
|
| - Link<T> link = head;
|
| - lastLink = null;
|
| - head = null;
|
| - return link;
|
| - }
|
| -
|
| - void addLast(T t) {
|
| - length++;
|
| - LinkEntry<T> entry = new LinkEntry<T>(t, null);
|
| - if (head === null) {
|
| - head = entry;
|
| - } else {
|
| - lastLink.tail = entry;
|
| - }
|
| - lastLink = entry;
|
| - }
|
| -}
|
|
|