| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.utilities.collection; | 8 library engine.utilities.collection; |
| 9 | 9 |
| 10 import "dart:math" as math; |
| 10 import 'dart:collection'; | 11 import 'dart:collection'; |
| 11 import "dart:math" as math; | |
| 12 | 12 |
| 13 import 'java_core.dart'; | 13 import 'java_core.dart'; |
| 14 import 'scanner.dart' show Token; | 14 import 'scanner.dart' show Token; |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * The class `BooleanArray` defines methods for operating on integers as if they
were arrays | 17 * The class `BooleanArray` defines methods for operating on integers as if they
were arrays |
| 18 * of booleans. These arrays can be indexed by either integers or by enumeration
constants. | 18 * of booleans. These arrays can be indexed by either integers or by enumeration
constants. |
| 19 */ | 19 */ |
| 20 class BooleanArray { | 20 class BooleanArray { |
| 21 /** | 21 /** |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 61 |
| 62 /** | 62 /** |
| 63 * Set the value of the element at the given index to the given value. | 63 * Set the value of the element at the given index to the given value. |
| 64 * | 64 * |
| 65 * @param array the array being modified | 65 * @param array the array being modified |
| 66 * @param index the index of the element being set | 66 * @param index the index of the element being set |
| 67 * @param value the value to be assigned to the element | 67 * @param value the value to be assigned to the element |
| 68 * @return the updated value of the array | 68 * @return the updated value of the array |
| 69 * @throws IndexOutOfBoundsException if the index is not between zero (0) and
31, inclusive | 69 * @throws IndexOutOfBoundsException if the index is not between zero (0) and
31, inclusive |
| 70 */ | 70 */ |
| 71 static int setEnum(int array, Enum index, bool value) => set(array, index.ordi
nal, value); | 71 static int setEnum(int array, Enum index, bool value) => |
| 72 set(array, index.ordinal, value); |
| 72 | 73 |
| 73 /** | 74 /** |
| 74 * Throw an exception if the index is not within the bounds allowed for an int
eger-encoded array | 75 * Throw an exception if the index is not within the bounds allowed for an int
eger-encoded array |
| 75 * of boolean values. | 76 * of boolean values. |
| 76 * | 77 * |
| 77 * @throws IndexOutOfBoundsException if the index is not between zero (0) and
31, inclusive | 78 * @throws IndexOutOfBoundsException if the index is not between zero (0) and
31, inclusive |
| 78 */ | 79 */ |
| 79 static void _checkIndex(int index) { | 80 static void _checkIndex(int index) { |
| 80 if (index < 0 || index > 30) { | 81 if (index < 0 || index > 30) { |
| 81 throw new RangeError("Index not between 0 and 30: $index"); | 82 throw new RangeError("Index not between 0 and 30: $index"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 93 */ | 94 */ |
| 94 class DirectedGraph<N> { | 95 class DirectedGraph<N> { |
| 95 /** | 96 /** |
| 96 * The table encoding the edges in the graph. An edge is represented by an ent
ry mapping the head | 97 * The table encoding the edges in the graph. An edge is represented by an ent
ry mapping the head |
| 97 * to a set of tails. Nodes that are not the head of any edge are represented
by an entry mapping | 98 * to a set of tails. Nodes that are not the head of any edge are represented
by an entry mapping |
| 98 * the node to an empty set of tails. | 99 * the node to an empty set of tails. |
| 99 */ | 100 */ |
| 100 HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>(); | 101 HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>(); |
| 101 | 102 |
| 102 /** | 103 /** |
| 104 * Return `true` if this graph is empty. |
| 105 * |
| 106 * @return `true` if this graph is empty |
| 107 */ |
| 108 bool get isEmpty => _edges.isEmpty; |
| 109 |
| 110 /** |
| 111 * Return the number of nodes in this graph. |
| 112 * |
| 113 * @return the number of nodes in this graph |
| 114 */ |
| 115 int get nodeCount => _edges.length; |
| 116 |
| 117 /** |
| 118 * Return a set of all nodes in the graph. |
| 119 */ |
| 120 Set<N> get nodes => _edges.keys.toSet(); |
| 121 |
| 122 /** |
| 103 * Add an edge from the given head node to the given tail node. Both nodes wil
l be a part of the | 123 * Add an edge from the given head node to the given tail node. Both nodes wil
l be a part of the |
| 104 * graph after this method is invoked, whether or not they were before. | 124 * graph after this method is invoked, whether or not they were before. |
| 105 * | 125 * |
| 106 * @param head the node at the head of the edge | 126 * @param head the node at the head of the edge |
| 107 * @param tail the node at the tail of the edge | 127 * @param tail the node at the tail of the edge |
| 108 */ | 128 */ |
| 109 void addEdge(N head, N tail) { | 129 void addEdge(N head, N tail) { |
| 110 // | 130 // |
| 111 // First, ensure that the tail is a node known to the graph. | 131 // First, ensure that the tail is a node known to the graph. |
| 112 // | 132 // |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 */ | 183 */ |
| 164 List<N> findCycleContaining(N node) { | 184 List<N> findCycleContaining(N node) { |
| 165 if (node == null) { | 185 if (node == null) { |
| 166 throw new IllegalArgumentException(); | 186 throw new IllegalArgumentException(); |
| 167 } | 187 } |
| 168 DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this); | 188 DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this); |
| 169 return finder.componentContaining(node); | 189 return finder.componentContaining(node); |
| 170 } | 190 } |
| 171 | 191 |
| 172 /** | 192 /** |
| 173 * Return the number of nodes in this graph. | |
| 174 * | |
| 175 * @return the number of nodes in this graph | |
| 176 */ | |
| 177 int get nodeCount => _edges.length; | |
| 178 | |
| 179 /** | |
| 180 * Return a set of all nodes in the graph. | |
| 181 */ | |
| 182 Set<N> get nodes => _edges.keys.toSet(); | |
| 183 | |
| 184 /** | |
| 185 * Return a set containing the tails of edges that have the given node as thei
r head. The set will | 193 * Return a set containing the tails of edges that have the given node as thei
r head. The set will |
| 186 * be empty if there are no such edges or if the node is not part of the graph
. Clients must not | 194 * be empty if there are no such edges or if the node is not part of the graph
. Clients must not |
| 187 * modify the returned set. | 195 * modify the returned set. |
| 188 * | 196 * |
| 189 * @param head the node at the head of all of the edges whose tails are to be
returned | 197 * @param head the node at the head of all of the edges whose tails are to be
returned |
| 190 * @return a set containing the tails of edges that have the given node as the
ir head | 198 * @return a set containing the tails of edges that have the given node as the
ir head |
| 191 */ | 199 */ |
| 192 Set<N> getTails(N head) { | 200 Set<N> getTails(N head) { |
| 193 HashSet<N> tails = _edges[head]; | 201 HashSet<N> tails = _edges[head]; |
| 194 if (tails == null) { | 202 if (tails == null) { |
| 195 return new HashSet<N>(); | 203 return new HashSet<N>(); |
| 196 } | 204 } |
| 197 return tails; | 205 return tails; |
| 198 } | 206 } |
| 199 | 207 |
| 200 /** | 208 /** |
| 201 * Return `true` if this graph is empty. | |
| 202 * | |
| 203 * @return `true` if this graph is empty | |
| 204 */ | |
| 205 bool get isEmpty => _edges.isEmpty; | |
| 206 | |
| 207 /** | |
| 208 * Remove all of the given nodes from this graph. As a consequence, any edges
for which those | 209 * Remove all of the given nodes from this graph. As a consequence, any edges
for which those |
| 209 * nodes were either a head or a tail will also be removed. | 210 * nodes were either a head or a tail will also be removed. |
| 210 * | 211 * |
| 211 * @param nodes the nodes to be removed | 212 * @param nodes the nodes to be removed |
| 212 */ | 213 */ |
| 213 void removeAllNodes(List<N> nodes) { | 214 void removeAllNodes(List<N> nodes) { |
| 214 for (N node in nodes) { | 215 for (N node in nodes) { |
| 215 removeNode(node); | 216 removeNode(node); |
| 216 } | 217 } |
| 217 } | 218 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 int _index = 0; | 352 int _index = 0; |
| 352 | 353 |
| 353 /** | 354 /** |
| 354 * The stack of nodes that are being visited in order to identify components. | 355 * The stack of nodes that are being visited in order to identify components. |
| 355 */ | 356 */ |
| 356 List<N> _stack = new List<N>(); | 357 List<N> _stack = new List<N>(); |
| 357 | 358 |
| 358 /** | 359 /** |
| 359 * A table mapping nodes to information about the nodes that is used by this a
lgorithm. | 360 * A table mapping nodes to information about the nodes that is used by this a
lgorithm. |
| 360 */ | 361 */ |
| 361 HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap = new HashMap<N, DirectedGraph_
NodeInfo<N>>(); | 362 HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap = |
| 363 new HashMap<N, DirectedGraph_NodeInfo<N>>(); |
| 362 | 364 |
| 363 /** | 365 /** |
| 364 * A list of all strongly connected components found, in topological sort orde
r (each node in a | 366 * A list of all strongly connected components found, in topological sort orde
r (each node in a |
| 365 * strongly connected component only has edges that point to nodes in the same
component or | 367 * strongly connected component only has edges that point to nodes in the same
component or |
| 366 * earlier components). | 368 * earlier components). |
| 367 */ | 369 */ |
| 368 List<List<N>> _allComponents = new List<List<N>>(); | 370 List<List<N>> _allComponents = new List<List<N>>(); |
| 369 | 371 |
| 370 /** | 372 /** |
| 371 * Initialize a newly created finder. | 373 * Initialize a newly created finder. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 | 509 |
| 508 /** | 510 /** |
| 509 * Return the value associated with the current element. | 511 * Return the value associated with the current element. |
| 510 * | 512 * |
| 511 * @return the value associated with the current element | 513 * @return the value associated with the current element |
| 512 * @throws NoSuchElementException if there is no current element | 514 * @throws NoSuchElementException if there is no current element |
| 513 */ | 515 */ |
| 514 V get value; | 516 V get value; |
| 515 | 517 |
| 516 /** | 518 /** |
| 519 * Set the value associated with the current element to the given value. |
| 520 * |
| 521 * @param newValue the new value to be associated with the current element |
| 522 * @throws NoSuchElementException if there is no current element |
| 523 */ |
| 524 void set value(V newValue); |
| 525 |
| 526 /** |
| 517 * Advance to the next entry in the map. Return `true` if there is a current e
lement that | 527 * Advance to the next entry in the map. Return `true` if there is a current e
lement that |
| 518 * can be accessed after this method returns. It is safe to invoke this method
even if the | 528 * can be accessed after this method returns. It is safe to invoke this method
even if the |
| 519 * previous invocation returned `false`. | 529 * previous invocation returned `false`. |
| 520 * | 530 * |
| 521 * @return `true` if there is a current element that can be accessed | 531 * @return `true` if there is a current element that can be accessed |
| 522 */ | 532 */ |
| 523 bool moveNext(); | 533 bool moveNext(); |
| 524 | |
| 525 /** | |
| 526 * Set the value associated with the current element to the given value. | |
| 527 * | |
| 528 * @param newValue the new value to be associated with the current element | |
| 529 * @throws NoSuchElementException if there is no current element | |
| 530 */ | |
| 531 void set value(V newValue); | |
| 532 } | 534 } |
| 533 | 535 |
| 534 /** | 536 /** |
| 535 * Instances of the class `MultipleMapIterator` implement an iterator that can b
e used to | 537 * Instances of the class `MultipleMapIterator` implement an iterator that can b
e used to |
| 536 * sequentially access the entries in multiple maps. | 538 * sequentially access the entries in multiple maps. |
| 537 */ | 539 */ |
| 538 class MultipleMapIterator<K, V> implements MapIterator<K, V> { | 540 class MultipleMapIterator<K, V> implements MapIterator<K, V> { |
| 539 /** | 541 /** |
| 540 * The iterators used to access the entries. | 542 * The iterators used to access the entries. |
| 541 */ | 543 */ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 | 576 |
| 575 @override | 577 @override |
| 576 V get value { | 578 V get value { |
| 577 if (_currentIterator == null) { | 579 if (_currentIterator == null) { |
| 578 throw new NoSuchElementException(); | 580 throw new NoSuchElementException(); |
| 579 } | 581 } |
| 580 return _currentIterator.value; | 582 return _currentIterator.value; |
| 581 } | 583 } |
| 582 | 584 |
| 583 @override | 585 @override |
| 586 void set value(V newValue) { |
| 587 if (_currentIterator == null) { |
| 588 throw new NoSuchElementException(); |
| 589 } |
| 590 _currentIterator.value = newValue; |
| 591 } |
| 592 |
| 593 @override |
| 584 bool moveNext() { | 594 bool moveNext() { |
| 585 if (_iteratorIndex < 0) { | 595 if (_iteratorIndex < 0) { |
| 586 if (_iterators.length == 0) { | 596 if (_iterators.length == 0) { |
| 587 _currentIterator = null; | 597 _currentIterator = null; |
| 588 return false; | 598 return false; |
| 589 } | 599 } |
| 590 if (_advanceToNextIterator()) { | 600 if (_advanceToNextIterator()) { |
| 591 return true; | 601 return true; |
| 592 } else { | 602 } else { |
| 593 _currentIterator = null; | 603 _currentIterator = null; |
| 594 return false; | 604 return false; |
| 595 } | 605 } |
| 596 } | 606 } |
| 597 if (_currentIterator.moveNext()) { | 607 if (_currentIterator.moveNext()) { |
| 598 return true; | 608 return true; |
| 599 } else if (_advanceToNextIterator()) { | 609 } else if (_advanceToNextIterator()) { |
| 600 return true; | 610 return true; |
| 601 } else { | 611 } else { |
| 602 _currentIterator = null; | 612 _currentIterator = null; |
| 603 return false; | 613 return false; |
| 604 } | 614 } |
| 605 } | 615 } |
| 606 | 616 |
| 607 @override | |
| 608 void set value(V newValue) { | |
| 609 if (_currentIterator == null) { | |
| 610 throw new NoSuchElementException(); | |
| 611 } | |
| 612 _currentIterator.value = newValue; | |
| 613 } | |
| 614 | |
| 615 /** | 617 /** |
| 616 * Under the assumption that there are no more entries that can be returned us
ing the current | 618 * Under the assumption that there are no more entries that can be returned us
ing the current |
| 617 * iterator, advance to the next iterator that has entries. | 619 * iterator, advance to the next iterator that has entries. |
| 618 * | 620 * |
| 619 * @return `true` if there is a current iterator that has entries | 621 * @return `true` if there is a current iterator that has entries |
| 620 */ | 622 */ |
| 621 bool _advanceToNextIterator() { | 623 bool _advanceToNextIterator() { |
| 622 _iteratorIndex++; | 624 _iteratorIndex++; |
| 623 while (_iteratorIndex < _iterators.length) { | 625 while (_iteratorIndex < _iterators.length) { |
| 624 MapIterator<K, V> iterator = _iterators[_iteratorIndex]; | 626 MapIterator<K, V> iterator = _iterators[_iteratorIndex]; |
| 625 if (iterator.moveNext()) { | 627 if (iterator.moveNext()) { |
| 626 _currentIterator = iterator; | 628 _currentIterator = iterator; |
| 627 return true; | 629 return true; |
| 628 } | 630 } |
| 629 _iteratorIndex++; | 631 _iteratorIndex++; |
| 630 } | 632 } |
| 631 return false; | 633 return false; |
| 632 } | 634 } |
| 633 } | 635 } |
| 634 | 636 |
| 635 /** | 637 /** |
| 636 * Instances of the class `TokenMap` map one set of tokens to another set of tok
ens. | |
| 637 */ | |
| 638 class TokenMap { | |
| 639 /** | |
| 640 * A table mapping tokens to tokens. This should be replaced by a more perform
ant implementation. | |
| 641 * One possibility is a pair of parallel arrays, with keys being sorted by the
ir offset and a | |
| 642 * cursor indicating where to start searching. | |
| 643 */ | |
| 644 HashMap<Token, Token> _map = new HashMap<Token, Token>(); | |
| 645 | |
| 646 /** | |
| 647 * Return the token that is mapped to the given token, or `null` if there is n
o token | |
| 648 * corresponding to the given token. | |
| 649 * | |
| 650 * @param key the token being mapped to another token | |
| 651 * @return the token that is mapped to the given token | |
| 652 */ | |
| 653 Token get(Token key) => _map[key]; | |
| 654 | |
| 655 /** | |
| 656 * Map the key to the value. | |
| 657 * | |
| 658 * @param key the token being mapped to the value | |
| 659 * @param value the token to which the key will be mapped | |
| 660 */ | |
| 661 void put(Token key, Token value) { | |
| 662 _map[key] = value; | |
| 663 } | |
| 664 } | |
| 665 | |
| 666 /** | |
| 667 * Instances of the class `SingleMapIterator` implement an iterator that can be
used to access | 638 * Instances of the class `SingleMapIterator` implement an iterator that can be
used to access |
| 668 * the entries in a single map. | 639 * the entries in a single map. |
| 669 */ | 640 */ |
| 670 class SingleMapIterator<K, V> implements MapIterator<K, V> { | 641 class SingleMapIterator<K, V> implements MapIterator<K, V> { |
| 671 /** | 642 /** |
| 672 * Returns a new [SingleMapIterator] instance for the given [Map]. | |
| 673 */ | |
| 674 static SingleMapIterator forMap(Map map) => new SingleMapIterator(map); | |
| 675 | |
| 676 /** | |
| 677 * The [Map] containing the entries to be iterated over. | 643 * The [Map] containing the entries to be iterated over. |
| 678 */ | 644 */ |
| 679 final Map<K, V> _map; | 645 final Map<K, V> _map; |
| 680 | 646 |
| 681 /** | 647 /** |
| 682 * The iterator used to access the entries. | 648 * The iterator used to access the entries. |
| 683 */ | 649 */ |
| 684 Iterator<K> _keyIterator; | 650 Iterator<K> _keyIterator; |
| 685 | 651 |
| 686 /** | 652 /** |
| (...skipping 25 matching lines...) Expand all Loading... |
| 712 | 678 |
| 713 @override | 679 @override |
| 714 V get value { | 680 V get value { |
| 715 if (_currentKey == null) { | 681 if (_currentKey == null) { |
| 716 throw new NoSuchElementException(); | 682 throw new NoSuchElementException(); |
| 717 } | 683 } |
| 718 return _currentValue; | 684 return _currentValue; |
| 719 } | 685 } |
| 720 | 686 |
| 721 @override | 687 @override |
| 688 void set value(V newValue) { |
| 689 if (_currentKey == null) { |
| 690 throw new NoSuchElementException(); |
| 691 } |
| 692 _currentValue = newValue; |
| 693 _map[_currentKey] = newValue; |
| 694 } |
| 695 |
| 696 @override |
| 722 bool moveNext() { | 697 bool moveNext() { |
| 723 if (_keyIterator.moveNext()) { | 698 if (_keyIterator.moveNext()) { |
| 724 _currentKey = _keyIterator.current; | 699 _currentKey = _keyIterator.current; |
| 725 _currentValue = _map[_currentKey]; | 700 _currentValue = _map[_currentKey]; |
| 726 return true; | 701 return true; |
| 727 } else { | 702 } else { |
| 728 _currentKey = null; | 703 _currentKey = null; |
| 729 return false; | 704 return false; |
| 730 } | 705 } |
| 731 } | 706 } |
| 732 | 707 |
| 733 @override | 708 /** |
| 734 void set value(V newValue) { | 709 * Returns a new [SingleMapIterator] instance for the given [Map]. |
| 735 if (_currentKey == null) { | 710 */ |
| 736 throw new NoSuchElementException(); | 711 static SingleMapIterator forMap(Map map) => new SingleMapIterator(map); |
| 737 } | 712 } |
| 738 _currentValue = newValue; | 713 |
| 739 _map[_currentKey] = newValue; | 714 /** |
| 715 * Instances of the class `TokenMap` map one set of tokens to another set of tok
ens. |
| 716 */ |
| 717 class TokenMap { |
| 718 /** |
| 719 * A table mapping tokens to tokens. This should be replaced by a more perform
ant implementation. |
| 720 * One possibility is a pair of parallel arrays, with keys being sorted by the
ir offset and a |
| 721 * cursor indicating where to start searching. |
| 722 */ |
| 723 HashMap<Token, Token> _map = new HashMap<Token, Token>(); |
| 724 |
| 725 /** |
| 726 * Return the token that is mapped to the given token, or `null` if there is n
o token |
| 727 * corresponding to the given token. |
| 728 * |
| 729 * @param key the token being mapped to another token |
| 730 * @return the token that is mapped to the given token |
| 731 */ |
| 732 Token get(Token key) => _map[key]; |
| 733 |
| 734 /** |
| 735 * Map the key to the value. |
| 736 * |
| 737 * @param key the token being mapped to the value |
| 738 * @param value the token to which the key will be mapped |
| 739 */ |
| 740 void put(Token key, Token value) { |
| 741 _map[key] = value; |
| 740 } | 742 } |
| 741 } | 743 } |
| OLD | NEW |