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 |