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

Side by Side Diff: runtime/lib/array.dart

Issue 485043002: Optimize List.toList/.sublist and List.from on lists. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 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
« no previous file with comments | « no previous file | runtime/lib/array_patch.dart » ('j') | runtime/lib/class_id.dart » ('J')
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 5
6 // TODO(srdjan): Use shared array implementation. 6 // TODO(srdjan): Use shared array implementation.
7 class _List<E> implements List<E> { 7 class _List<E> implements List<E> {
8 8
9 factory _List(length) native "List_allocate"; 9 factory _List(length) native "List_allocate";
10 10
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) { 60 void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
61 if (start < 0 || start > this.length) { 61 if (start < 0 || start > this.length) {
62 throw new RangeError.range(start, 0, this.length); 62 throw new RangeError.range(start, 0, this.length);
63 } 63 }
64 if (end < start || end > this.length) { 64 if (end < start || end > this.length) {
65 throw new RangeError.range(end, start, this.length); 65 throw new RangeError.range(end, start, this.length);
66 } 66 }
67 int length = end - start; 67 int length = end - start;
68 if (length == 0) return; 68 if (length == 0) return;
69 69
70 if (ClassID.getID(iterable) == ClassID.cidOneByteString) { 70 if (ClassID.getID(iterable) == ClassID.cidOneByteString) {
Lasse Reichstein Nielsen 2014/08/19 12:48:30 This looks wrong: OneByteString?
71 _copyFromObjectArray(iterable, skipCount, start, length); 71 _copyFromObjectArray(iterable, skipCount, start, length);
72 } else { 72 } else {
73 if (iterable is List) { 73 if (iterable is List) {
74 Lists.copy(iterable, skipCount, this, start, length); 74 Lists.copy(iterable, skipCount, this, start, length);
75 } else { 75 } else {
76 Iterator it = iterable.iterator; 76 Iterator it = iterable.iterator;
77 while (skipCount > 0) { 77 while (skipCount > 0) {
78 if (!it.moveNext()) return; 78 if (!it.moveNext()) return;
79 skipCount--; 79 skipCount--;
80 } 80 }
(...skipping 14 matching lines...) Expand all
95 } 95 }
96 96
97 void fillRange(int start, int end, [E fillValue]) { 97 void fillRange(int start, int end, [E fillValue]) {
98 IterableMixinWorkaround.fillRangeList(this, start, end, fillValue); 98 IterableMixinWorkaround.fillRangeList(this, start, end, fillValue);
99 } 99 }
100 100
101 List<E> sublist(int start, [int end]) { 101 List<E> sublist(int start, [int end]) {
102 Lists.indicesCheck(this, start, end); 102 Lists.indicesCheck(this, start, end);
103 if (end == null) end = this.length; 103 if (end == null) end = this.length;
104 int length = end - start; 104 int length = end - start;
105 if (start == end) return []; 105 if (start == end) return <E>[];
106 List list = new _GrowableList<E>.withCapacity(length); 106 List list = new _List(length);
107 list.length = length; 107 list._copyFromObjectArray(this, start, 0, length);
108 Lists.copy(this, start, list, 0, length); 108 var result = new _GrowableList<E>.withData(list);
109 return list; 109 result._setLength(length);
110 return result;
110 } 111 }
111 112
112 // Iterable interface. 113 // Iterable interface.
113 114
114 bool contains(Object element) { 115 bool contains(Object element) {
115 return IterableMixinWorkaround.contains(this, element); 116 return IterableMixinWorkaround.contains(this, element);
116 } 117 }
117 118
118 void forEach(f(E element)) { 119 void forEach(f(E element)) {
119 IterableMixinWorkaround.forEach(this, f); 120 IterableMixinWorkaround.forEach(this, f);
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 if (length > 0) return this[length - 1]; 243 if (length > 0) return this[length - 1];
243 throw IterableElementError.noElement(); 244 throw IterableElementError.noElement();
244 } 245 }
245 246
246 E get single { 247 E get single {
247 if (length == 1) return this[0]; 248 if (length == 1) return this[0];
248 if (length == 0) throw IterableElementError.noElement(); 249 if (length == 0) throw IterableElementError.noElement();
249 throw IterableElementError.tooMany(); 250 throw IterableElementError.tooMany();
250 } 251 }
251 252
252 List<E> toList({ bool growable: true}) { 253 List<E> toList({ bool growable: true }) {
253 return new List<E>.from(this, growable: growable); 254 var length = this.length;
255 var result = growable ? new _List(length) : new _List<E>(length);
256 result._copyFromObjectArray(this, 0, 0, length);
257 if (growable) {
258 result = new _GrowableList<E>.withData(result);
259 result._setLength(length);
260 }
261 return result;
254 } 262 }
255 263
256 Set<E> toSet() { 264 Set<E> toSet() {
257 return new Set<E>.from(this); 265 return new Set<E>.from(this);
258 } 266 }
259 267
260 Map<int, E> asMap() { 268 Map<int, E> asMap() {
261 return new IterableMixinWorkaround<E>().asMapList(this); 269 return new IterableMixinWorkaround<E>().asMapList(this);
262 } 270 }
263 } 271 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 } 341 }
334 342
335 void replaceRange(int start, int end, Iterable<E> iterable) { 343 void replaceRange(int start, int end, Iterable<E> iterable) {
336 throw UnmodifiableListError.change(); 344 throw UnmodifiableListError.change();
337 } 345 }
338 346
339 List<E> sublist(int start, [int end]) { 347 List<E> sublist(int start, [int end]) {
340 Lists.indicesCheck(this, start, end); 348 Lists.indicesCheck(this, start, end);
341 if (end == null) end = this.length; 349 if (end == null) end = this.length;
342 int length = end - start; 350 int length = end - start;
343 if (start == end) return []; 351 if (start == end) return <E>[];
344 List list = new List<E>(); 352 List list = new _List(length);
345 list.length = length;
346 Lists.copy(this, start, list, 0, length); 353 Lists.copy(this, start, list, 0, length);
347 return list; 354 var result = new _GrowableList<E>.withData(list);
355 result._setLength(length);
356 return result;
348 } 357 }
349 358
350 Iterable<E> getRange(int start, int end) { 359 Iterable<E> getRange(int start, int end) {
351 return new IterableMixinWorkaround<E>().getRangeList(this, start, end); 360 return new IterableMixinWorkaround<E>().getRangeList(this, start, end);
352 } 361 }
353 362
354 // Collection interface. 363 // Collection interface.
355 364
356 bool contains(Object element) { 365 bool contains(Object element) {
357 return IterableMixinWorkaround.contains(this, element); 366 return IterableMixinWorkaround.contains(this, element);
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 throw IterableElementError.noElement(); 498 throw IterableElementError.noElement();
490 } 499 }
491 500
492 E get single { 501 E get single {
493 if (length == 1) return this[0]; 502 if (length == 1) return this[0];
494 if (length == 0) throw IterableElementError.noElement(); 503 if (length == 0) throw IterableElementError.noElement();
495 throw IterableElementError.tooMany(); 504 throw IterableElementError.tooMany();
496 } 505 }
497 506
498 List<E> toList({ bool growable: true }) { 507 List<E> toList({ bool growable: true }) {
499 return new List<E>.from(this, growable: growable); 508 int length = this.length;
509 List list = growable ? new _GrowableList<E>(length) : new _List<E>(length);
510 Lists.copy(this, 0, list, 0, length);
511 return list;
500 } 512 }
501 513
502 Set<E> toSet() { 514 Set<E> toSet() {
503 return new Set<E>.from(this); 515 return new Set<E>.from(this);
504 } 516 }
505 517
506 Map<int, E> asMap() { 518 Map<int, E> asMap() {
507 return new IterableMixinWorkaround<E>().asMapList(this); 519 return new IterableMixinWorkaround<E>().asMapList(this);
508 } 520 }
509 } 521 }
(...skipping 20 matching lines...) Expand all
530 } 542 }
531 _position = _length; 543 _position = _length;
532 _current = null; 544 _current = null;
533 return false; 545 return false;
534 } 546 }
535 547
536 E get current { 548 E get current {
537 return _current; 549 return _current;
538 } 550 }
539 } 551 }
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/array_patch.dart » ('j') | runtime/lib/class_id.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698