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

Side by Side Diff: sdk/lib/collection/list.dart

Issue 13863012: Refactor List.setRange function. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comments. Created 7 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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.collection; 5 part of dart.collection;
6 6
7 /** 7 /**
8 * Abstract implementation of a list. 8 * Abstract implementation of a list.
9 * 9 *
10 * All operations are defined in terms of `length`, `operator[]`, 10 * All operations are defined in terms of `length`, `operator[]`,
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 235
236 void addAll(Iterable<E> iterable) { 236 void addAll(Iterable<E> iterable) {
237 for (E element in iterable) { 237 for (E element in iterable) {
238 this[this.length++] = element; 238 this[this.length++] = element;
239 } 239 }
240 } 240 }
241 241
242 void remove(Object element) { 242 void remove(Object element) {
243 for (int i = 0; i < this.length; i++) { 243 for (int i = 0; i < this.length; i++) {
244 if (this[i] == element) { 244 if (this[i] == element) {
245 this.setRange(i, this.length - i - 1, this, i + 1); 245 this.setRange(i, i + this.length - 1, this, i + 1);
246 this.length -= 1; 246 this.length -= 1;
247 return; 247 return;
248 } 248 }
249 } 249 }
250 } 250 }
251 251
252 void removeWhere(bool test(E element)) { 252 void removeWhere(bool test(E element)) {
253 _filter(this, test, false); 253 _filter(this, test, false);
254 } 254 }
255 255
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 } 325 }
326 326
327 void insertRange(int start, int length, [E initialValue]) { 327 void insertRange(int start, int length, [E initialValue]) {
328 if (start < 0 || start > this.length) { 328 if (start < 0 || start > this.length) {
329 throw new RangeError.range(start, 0, this.length); 329 throw new RangeError.range(start, 0, this.length);
330 } 330 }
331 int oldLength = this.length; 331 int oldLength = this.length;
332 int moveLength = oldLength - start; 332 int moveLength = oldLength - start;
333 this.length += length; 333 this.length += length;
334 if (moveLength > 0) { 334 if (moveLength > 0) {
335 this.setRange(start + length, moveLength, this, start); 335 this.setRange(start + length, oldLength, this, start);
336 } 336 }
337 for (int i = 0; i < length; i++) { 337 for (int i = 0; i < length; i++) {
338 this[start + i] = initialValue; 338 this[start + i] = initialValue;
339 } 339 }
340 } 340 }
341 341
342 void removeRange(int start, int length) { 342 void removeRange(int start, int length) {
343 if (start < 0 || start > this.length) { 343 if (start < 0 || start > this.length) {
344 throw new RangeError.range(start, 0, this.length); 344 throw new RangeError.range(start, 0, this.length);
345 } 345 }
346 if (length < 0 || start + length > this.length) { 346 if (length < 0 || start + length > this.length) {
347 throw new RangeError.range(length, 0, this.length - start); 347 throw new RangeError.range(length, 0, this.length - start);
348 } 348 }
349 int end = start + length; 349 int end = start + length;
350 setRange(start, this.length - end, this, end); 350 setRange(start, this.length - length, this, end);
351 this.length -= length; 351 this.length -= length;
352 } 352 }
353 353
354 void clearRange(int start, int length, [E fill]) { 354 void clearRange(int start, int length, [E fill]) {
355 for (int i = 0; i < length; i++) { 355 for (int i = 0; i < length; i++) {
356 this[start + i] = fill; 356 this[start + i] = fill;
357 } 357 }
358 } 358 }
359 359
360 void setRange(int start, int length, List<E> from, [int startFrom]) { 360 void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
361 if (start < 0 || start > this.length) { 361 if (start < 0 || start > this.length) {
362 throw new RangeError.range(start, 0, this.length); 362 throw new RangeError.range(start, 0, this.length);
363 } 363 }
364 if (length < 0 || start + length > this.length) { 364 if (end < 0 || end > this.length) {
365 throw new RangeError.range(length, 0, this.length - start); 365 throw new RangeError.range(end, start, this.length);
366 } 366 }
367 if (startFrom == null) { 367 int length = end - start;
368 startFrom = 0; 368 if (length == 0) return;
369
370 if (skipCount < 0) throw new ArgumentError(skipCount);
371
372 List otherList;
373 int otherStart;
374 // TODO(floitsch): Make this accept more.
375 if (iterable is List) {
376 otherList = iterable;
377 otherStart = skipCount;
378 } else {
379 otherList = iterable.skip(skipCount).toList(growable: false);
380 otherStart = 0;
369 } 381 }
370 if (startFrom < 0 || startFrom + length > from.length) { 382 if (otherStart + length > otherList.length) {
371 throw new RangeError.range(startFrom, 0, from.length - length); 383 throw new StateError("Not enough elements");
372 } 384 }
373 if (startFrom < start) { 385 if (otherStart < start) {
374 // Copy backwards to ensure correct copy if [from] is this. 386 // Copy backwards to ensure correct copy if [from] is this.
375 for (int i = length - 1; i >= 0; i--) { 387 for (int i = length - 1; i >= 0; i--) {
376 this[start + i] = from[startFrom + i]; 388 this[start + i] = otherList[otherStart + i];
377 } 389 }
378 } else { 390 } else {
379 for (int i = 0; i < length; i++) { 391 for (int i = 0; i < length; i++) {
380 this[start + i] = from[startFrom + i]; 392 this[start + i] = otherList[otherStart + i];
381 } 393 }
382 } 394 }
383 } 395 }
384 396
385 int indexOf(E element, [int startIndex = 0]) { 397 int indexOf(E element, [int startIndex = 0]) {
386 if (startIndex >= this.length) { 398 if (startIndex >= this.length) {
387 return -1; 399 return -1;
388 } 400 }
389 if (startIndex < 0) { 401 if (startIndex < 0) {
390 startIndex = 0; 402 startIndex = 0;
(...skipping 27 matching lines...) Expand all
418 return i; 430 return i;
419 } 431 }
420 } 432 }
421 return -1; 433 return -1;
422 } 434 }
423 435
424 Iterable<E> get reversed => new ReversedListIterable(this); 436 Iterable<E> get reversed => new ReversedListIterable(this);
425 437
426 String toString() => ToString.iterableToString(this); 438 String toString() => ToString.iterableToString(this);
427 } 439 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/lib/js_array.dart ('k') | sdk/lib/collection/queue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698