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

Side by Side Diff: sdk/lib/internal/iterable.dart

Issue 2845933002: SkipIterable - ensure field is only initialized to a known int. (Closed)
Patch Set: fix .skip(-1) bug Created 3 years, 7 months 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
« no previous file with comments | « no previous file | tests/corelib/iterable_skip_test.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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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._internal; 5 part of dart._internal;
6 6
7 /** 7 /**
8 * Marker interface for [Iterable] subclasses that have an efficient 8 * Marker interface for [Iterable] subclasses that have an efficient
9 * [length] implementation. 9 * [length] implementation.
10 */ 10 */
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 } 577 }
578 578
579 class SkipIterable<E> extends Iterable<E> { 579 class SkipIterable<E> extends Iterable<E> {
580 final Iterable<E> _iterable; 580 final Iterable<E> _iterable;
581 final int _skipCount; 581 final int _skipCount;
582 582
583 factory SkipIterable(Iterable<E> iterable, int count) { 583 factory SkipIterable(Iterable<E> iterable, int count) {
584 if (iterable is EfficientLengthIterable) { 584 if (iterable is EfficientLengthIterable) {
585 return new EfficientLengthSkipIterable<E>(iterable, count); 585 return new EfficientLengthSkipIterable<E>(iterable, count);
586 } 586 }
587 return new SkipIterable<E>._(iterable, count); 587 return new SkipIterable<E>._(iterable, _checkCount(count));
588 } 588 }
589 589
590 SkipIterable._(this._iterable, this._skipCount) { 590 SkipIterable._(this._iterable, this._skipCount);
591 if (_skipCount is! int) {
592 throw new ArgumentError.value(_skipCount, "count is not an integer");
593 }
594 RangeError.checkNotNegative(_skipCount, "count");
595 }
596 591
597 Iterable<E> skip(int count) { 592 Iterable<E> skip(int count) {
598 if (_skipCount is! int) { 593 return new SkipIterable<E>._(_iterable, _skipCount + _checkCount(count));
599 throw new ArgumentError.value(_skipCount, "count is not an integer");
600 }
601 RangeError.checkNotNegative(_skipCount, "count");
602 return new SkipIterable<E>._(_iterable, _skipCount + count);
603 } 594 }
604 595
605 Iterator<E> get iterator { 596 Iterator<E> get iterator {
606 return new SkipIterator<E>(_iterable.iterator, _skipCount); 597 return new SkipIterator<E>(_iterable.iterator, _skipCount);
607 } 598 }
608 } 599 }
609 600
610 class EfficientLengthSkipIterable<E> extends SkipIterable<E> 601 class EfficientLengthSkipIterable<E> extends SkipIterable<E>
611 implements EfficientLengthIterable<E> { 602 implements EfficientLengthIterable<E> {
612 EfficientLengthSkipIterable(Iterable<E> iterable, int skipCount) 603 factory EfficientLengthSkipIterable(Iterable<E> iterable, int count) {
613 : super._(iterable, skipCount); 604 return new EfficientLengthSkipIterable<E>._(iterable, _checkCount(count));
605 }
606
607 EfficientLengthSkipIterable._(Iterable<E> iterable, int count)
608 : super._(iterable, count);
614 609
615 int get length { 610 int get length {
616 int length = _iterable.length - _skipCount; 611 int length = _iterable.length - _skipCount;
617 if (length >= 0) return length; 612 if (length >= 0) return length;
618 return 0; 613 return 0;
619 } 614 }
615
616 Iterable<E> skip(int count) {
617 return new EfficientLengthSkipIterable<E>._(
618 _iterable, _skipCount + _checkCount(count));
619 }
620 }
621
622 int _checkCount(int count) {
623 if (count is! int) {
624 throw new ArgumentError.value(count, "count", "is not an integer");
625 }
626 RangeError.checkNotNegative(count, "count");
627 return count;
620 } 628 }
621 629
622 class SkipIterator<E> extends Iterator<E> { 630 class SkipIterator<E> extends Iterator<E> {
623 final Iterator<E> _iterator; 631 final Iterator<E> _iterator;
624 int _skipCount; 632 int _skipCount;
625 633
626 SkipIterator(this._iterator, this._skipCount) { 634 SkipIterator(this._iterator, this._skipCount) {
627 assert(_skipCount is int && _skipCount >= 0); 635 assert(_skipCount is int && _skipCount >= 0);
628 } 636 }
629 637
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 * Creates errors throw by [Iterable] when the element count is wrong. 770 * Creates errors throw by [Iterable] when the element count is wrong.
763 */ 771 */
764 abstract class IterableElementError { 772 abstract class IterableElementError {
765 /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */ 773 /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */
766 static StateError noElement() => new StateError("No element"); 774 static StateError noElement() => new StateError("No element");
767 /** Error thrown by, e.g., [Iterable.single] if there are too many results. */ 775 /** Error thrown by, e.g., [Iterable.single] if there are too many results. */
768 static StateError tooMany() => new StateError("Too many elements"); 776 static StateError tooMany() => new StateError("Too many elements");
769 /** Error thrown by, e.g., [List.setRange] if there are too few elements. */ 777 /** Error thrown by, e.g., [List.setRange] if there are too few elements. */
770 static StateError tooFew() => new StateError("Too few elements"); 778 static StateError tooFew() => new StateError("Too few elements");
771 } 779 }
OLDNEW
« no previous file with comments | « no previous file | tests/corelib/iterable_skip_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698