Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: sdk/lib/core/string.dart

Issue 745573002: Create generic check methods for RangeError causing checks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix long line Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/core/iterable.dart ('k') | sdk/lib/internal/iterable.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of dart.core; 5 part of dart.core;
6 6
7 /** 7 /**
8 * A sequence of characters. 8 * A sequence of characters.
9 * 9 *
10 * A string can be either single or multiline. Single line strings are 10 * A string can be either single or multiline. Single line strings are
(...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 : this.string = string, _position = 0, _nextPosition = 0; 633 : this.string = string, _position = 0, _nextPosition = 0;
634 634
635 /** 635 /**
636 * Create an iterator positioned before the [index]th code unit of the string. 636 * Create an iterator positioned before the [index]th code unit of the string.
637 * 637 *
638 * When created, there is no [current] value. 638 * When created, there is no [current] value.
639 * A [moveNext] will use the rune starting at [index] the current value, 639 * A [moveNext] will use the rune starting at [index] the current value,
640 * and a [movePrevious] will use the rune ending just before [index] as the 640 * and a [movePrevious] will use the rune ending just before [index] as the
641 * the current value. 641 * the current value.
642 * 642 *
643 * It is an error if the [index] position is in the middle of a surrogate 643 * The [index] position must not be in the middle of a surrogate pair.
644 * pair.
645 */ 644 */
646 RuneIterator.at(String string, int index) 645 RuneIterator.at(String string, int index)
647 : string = string, _position = index, _nextPosition = index { 646 : string = string, _position = index, _nextPosition = index {
648 if (index < 0 || index > string.length) { 647 RangeError.checkValueInInterval(index, 0, string.length);
649 throw new RangeError.range(index, 0, string.length);
650 }
651 _checkSplitSurrogate(index); 648 _checkSplitSurrogate(index);
652 } 649 }
653 650
654 /** Throw an error if the index is in the middle of a surrogate pair. */ 651 /** Throw an error if the index is in the middle of a surrogate pair. */
655 void _checkSplitSurrogate(int index) { 652 void _checkSplitSurrogate(int index) {
656 if (index > 0 && index < string.length && 653 if (index > 0 && index < string.length &&
657 _isLeadSurrogate(string.codeUnitAt(index - 1)) && 654 _isLeadSurrogate(string.codeUnitAt(index - 1)) &&
658 _isTrailSurrogate(string.codeUnitAt(index))) { 655 _isTrailSurrogate(string.codeUnitAt(index))) {
659 throw new ArgumentError('Index inside surrogate pair: $index'); 656 throw new ArgumentError('Index inside surrogate pair: $index');
660 } 657 }
661 } 658 }
662 659
663 /** 660 /**
664 * Returns the starting position of the current rune in the string. 661 * Returns the starting position of the current rune in the string.
665 * 662 *
666 * Returns null if the [current] rune is null. 663 * Returns null if the [current] rune is null.
667 */ 664 */
668 int get rawIndex => (_position != _nextPosition) ? _position : null; 665 int get rawIndex => (_position != _nextPosition) ? _position : null;
669 666
670 /** 667 /**
671 * Resets the iterator to the rune at the specified index of the string. 668 * Resets the iterator to the rune at the specified index of the string.
672 * 669 *
673 * Setting a negative [rawIndex], or one greater than or equal to 670 * Setting a negative [rawIndex], or one greater than or equal to
674 * [:string.length:], 671 * [:string.length:],
675 * is an error. So is setting it in the middle of a surrogate pair. 672 * is an error. So is setting it in the middle of a surrogate pair.
676 * 673 *
677 * Setting the position to the end of then string will set [current] to null. 674 * Setting the position to the end of then string will set [current] to null.
678 */ 675 */
679 void set rawIndex(int rawIndex) { 676 void set rawIndex(int rawIndex) {
680 if (rawIndex >= string.length) { 677 RangeError.checkValidIndex(rawIndex, string, "rawIndex");
681 throw new RangeError.index(rawIndex, string);
682 }
683 reset(rawIndex); 678 reset(rawIndex);
684 moveNext(); 679 moveNext();
685 } 680 }
686 681
687 /** 682 /**
688 * Resets the iterator to the given index into the string. 683 * Resets the iterator to the given index into the string.
689 * 684 *
690 * After this the [current] value is unset. 685 * After this the [current] value is unset.
691 * You must call [moveNext] make the rune at the position current, 686 * You must call [moveNext] make the rune at the position current,
692 * or [movePrevious] for the last rune before the position. 687 * or [movePrevious] for the last rune before the position.
693 * 688 *
694 * Setting a negative [rawIndex], or one greater than [:string.length:], 689 * Setting a negative [rawIndex], or one greater than [:string.length:],
695 * is an error. So is setting it in the middle of a surrogate pair. 690 * is an error. So is setting it in the middle of a surrogate pair.
696 */ 691 */
697 void reset([int rawIndex = 0]) { 692 void reset([int rawIndex = 0]) {
698 if (rawIndex < 0 || rawIndex > string.length) { 693 RangeError.checkValueInInterval(rawIndex, 0, string.length, "rawIndex");
699 throw new RangeError.range(rawIndex, 0, string.length);
700 }
701 _checkSplitSurrogate(rawIndex); 694 _checkSplitSurrogate(rawIndex);
702 _position = _nextPosition = rawIndex; 695 _position = _nextPosition = rawIndex;
703 _currentCodePoint = null; 696 _currentCodePoint = null;
704 } 697 }
705 698
706 /** The rune (integer Unicode code point) starting at the current position in 699 /** The rune (integer Unicode code point) starting at the current position in
707 * the string. 700 * the string.
708 */ 701 */
709 int get current => _currentCodePoint; 702 int get current => _currentCodePoint;
710 703
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 _position = position - 1; 757 _position = position - 1;
765 _currentCodePoint = _combineSurrogatePair(prevCodeUnit, codeUnit); 758 _currentCodePoint = _combineSurrogatePair(prevCodeUnit, codeUnit);
766 return true; 759 return true;
767 } 760 }
768 } 761 }
769 _position = position; 762 _position = position;
770 _currentCodePoint = codeUnit; 763 _currentCodePoint = codeUnit;
771 return true; 764 return true;
772 } 765 }
773 } 766 }
OLDNEW
« no previous file with comments | « sdk/lib/core/iterable.dart ('k') | sdk/lib/internal/iterable.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698