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

Unified Diff: sdk/lib/collection/list.dart

Issue 2960783002: Revert "special-case ListMixin.setRange from same list" (Closed)
Patch Set: Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/collection/list.dart
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index 92b1110b192500795207b14ccb9491d57c7b696c..7f476dc9aa2023de4b9aceb1a924dc3584eee15c 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -256,27 +256,14 @@ abstract class ListMixin<E> implements List<E> {
bool remove(Object element) {
for (int i = 0; i < this.length; i++) {
if (this[i] == element) {
- this._closeGap(i, i + 1);
+ this.setRange(i, this.length - 1, this, i + 1);
+ this.length -= 1;
return true;
}
}
return false;
}
- /// Removes elements from the list starting at [start] up to but not including
- /// [end]. Arguments are pre-validated.
- void _closeGap(int start, int end) {
- int length = this.length;
- assert(0 <= start);
- assert(start < end);
- assert(end <= length);
- int size = end - start;
- for (int i = end; i < length; i++) {
- this[i - size] = this[i];
- }
- this.length = length - size;
- }
-
void removeWhere(bool test(E element)) {
_filter(test, false);
}
@@ -363,9 +350,9 @@ abstract class ListMixin<E> implements List<E> {
void removeRange(int start, int end) {
RangeError.checkValidRange(start, end, this.length);
- if (end > start) {
- _closeGap(start, end);
- }
+ int length = end - start;
+ setRange(start, this.length - length, this, end);
+ this.length -= length;
}
void fillRange(int start, int end, [E fill]) {
@@ -414,10 +401,13 @@ abstract class ListMixin<E> implements List<E> {
int removeLength = end - start;
int insertLength = newContents.length;
if (removeLength >= insertLength) {
+ int delta = removeLength - insertLength;
int insertEnd = start + insertLength;
+ int newLength = this.length - delta;
this.setRange(start, insertEnd, newContents);
- if (removeLength > insertLength) {
- _closeGap(insertEnd, end);
+ if (delta != 0) {
+ this.setRange(insertEnd, newLength, this, end);
+ this.length = newLength;
}
} else {
int delta = insertLength - removeLength;
@@ -480,7 +470,8 @@ abstract class ListMixin<E> implements List<E> {
E removeAt(int index) {
E result = this[index];
- _closeGap(index, index + 1);
+ setRange(index, this.length - 1, this, index + 1);
+ length--;
return result;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698