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

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

Issue 132163005: Version 1.1.0-dev.5.7 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/dart/
Patch Set: Created 6 years, 11 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 | « runtime/lib/typed_data.cc ('k') | runtime/tests/vm/vm.status » ('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) 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 // patch classes for Int8List ..... Float64List and ByteData implementations. 5 // patch classes for Int8List ..... Float64List and ByteData implementations.
6 6
7 patch class Int8List { 7 patch class Int8List {
8 /* patch */ factory Int8List(int length) { 8 /* patch */ factory Int8List(int length) {
9 return new _Int8Array(length); 9 return new _Int8Array(length);
10 } 10 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 result[i] = elements[i]; 55 result[i] = elements[i];
56 } 56 }
57 return result; 57 return result;
58 } 58 }
59 59
60 /* patch */ factory Uint8ClampedList.view(ByteBuffer buffer, 60 /* patch */ factory Uint8ClampedList.view(ByteBuffer buffer,
61 [int offsetInBytes = 0, 61 [int offsetInBytes = 0,
62 int length]) { 62 int length]) {
63 return new _Uint8ClampedArrayView(buffer, offsetInBytes, length); 63 return new _Uint8ClampedArrayView(buffer, offsetInBytes, length);
64 } 64 }
65
66 bool _isClamped() { return true; }
65 } 67 }
66 68
67 69
68 patch class Int16List { 70 patch class Int16List {
69 /* patch */ factory Int16List(int length) { 71 /* patch */ factory Int16List(int length) {
70 return new _Int16Array(length); 72 return new _Int16Array(length);
71 } 73 }
72 74
73 /* patch */ factory Int16List.fromList(List<int> elements) { 75 /* patch */ factory Int16List.fromList(List<int> elements) {
74 var result = new _Int16Array(elements.length); 76 var result = new _Int16Array(elements.length);
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 _rangeCheck(this.length, start, length); 518 _rangeCheck(this.length, start, length);
517 List result = _createList(length); 519 List result = _createList(length);
518 result.setRange(0, length, this, start); 520 result.setRange(0, length, this, start);
519 return result; 521 return result;
520 } 522 }
521 523
522 Iterable getRange(int start, [int end]) { 524 Iterable getRange(int start, [int end]) {
523 return IterableMixinWorkaround.getRangeList(this, start, end); 525 return IterableMixinWorkaround.getRangeList(this, start, end);
524 } 526 }
525 527
526 void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { 528 bool _isClamped() { return false; }
527 if (!_setRange(start, end - start, iterable, skipCount)) { 529
528 IterableMixinWorkaround.setRangeList(this, start, 530 void setRange(int start, int end, Iterable from, [int skipCount = 0]) {
529 end, iterable, skipCount); 531 // Check ranges.
532 if ((start < 0) || (start > length)) {
533 _throwRangeError(start, length + 1);
530 } 534 }
535 if ((end < 0) || (end > length)) {
536 _throwRangeError(end, length + 1);
537 }
538 if (start > end) {
539 _throwRangeError(start, end + 1);
540 }
541 if (skipCount < 0) {
542 throw new ArgumentError(skipCount);
543 }
544
545 final count = end - start;
546 if ((from.length - skipCount) < count) {
547 throw new StateError("Not enough elements");
548 }
549
550 if (from is _TypedListBase) {
551 final needsClamping =
552 this._isClamped() && (this._isClamped() != from._isClamped());
553 if (this.elementSizeInBytes == from.elementSizeInBytes) {
554 if (needsClamping) {
555 Lists.copy(from, skipCount, this, start, count);
556 return;
557 } else if (this.buffer._setRange(
558 start * elementSizeInBytes + this.offsetInBytes,
559 count * elementSizeInBytes,
560 from.buffer,
561 skipCount * elementSizeInBytes + from.offsetInBytes)) {
562 return;
563 }
564 } else if (from.buffer == this.buffer) {
565 // Different element sizes, but same buffer means that we need
566 // an intermediate structure.
567 // TODO(srdjan): Optimize to skip copying if the range does not overlap.
568 final temp_buffer = new List(count);
569 for (int i = 0; i < count; i++) {
570 temp_buffer[i] = from[skipCount + i];
571 }
572 for (int i = start; i < end; i++) {
573 this[i] = temp_buffer[i - start];
574 }
575 return;
576 }
577 }
578 IterableMixinWorkaround.setRangeList(this, start,
579 end, from, skipCount);
531 } 580 }
532 581
533 void setAll(int index, Iterable iterable) { 582 void setAll(int index, Iterable iterable) {
534 IterableMixinWorkaround.setAllList(this, index, iterable); 583 final end = iterable.length + index;
584 setRange(index, end, iterable);
535 } 585 }
536 586
537 void fillRange(int start, int end, [fillValue]) { 587 void fillRange(int start, int end, [fillValue]) {
538 IterableMixinWorkaround.fillRangeList(this, start, end, fillValue); 588 IterableMixinWorkaround.fillRangeList(this, start, end, fillValue);
539 } 589 }
540 590
541 591
542 // Method(s) implementing Object interface. 592 // Method(s) implementing Object interface.
543 593
544 String toString() { 594 String toString() {
545 return IterableMixinWorkaround.toStringIterable(this, '[', ']'); 595 return IterableMixinWorkaround.toStringIterable(this, '[', ']');
546 } 596 }
547 597
548 598
549 // Internal utility methods. 599 // Internal utility methods.
550 600
551 bool _setRange(int start, int length, Iterable from, int startFrom) 601 // Returns true if operation succeeds.
602 // Returns false if 'from' and 'this' do not have the same element types.
603 // The copy occurs using a memory copy (no clamping, conversion, etc).
604 bool _setRange(int startInBytes, int lengthInBytes,
605 _TypedListBase from, int startFromInBytes)
552 native "TypedData_setRange"; 606 native "TypedData_setRange";
553 } 607 }
554 608
555 609
556 abstract class _TypedList extends _TypedListBase implements ByteBuffer { 610 abstract class _TypedList extends _TypedListBase implements ByteBuffer {
557 // Default method implementing parts of the TypedData interface. 611 // Default method implementing parts of the TypedData interface.
558 int get offsetInBytes { 612 int get offsetInBytes {
559 return 0; 613 return 0;
560 } 614 }
561 615
562 int get lengthInBytes { 616 int get lengthInBytes {
563 return length * elementSizeInBytes; 617 return length * elementSizeInBytes;
564 } 618 }
565 619
566 ByteBuffer get buffer { 620 ByteBuffer get buffer {
567 return this; 621 return this;
568 } 622 }
569 623
570
571 // Methods implementing the collection interface. 624 // Methods implementing the collection interface.
572 625
573 int get length native "TypedData_length"; 626 int get length native "TypedData_length";
574 627
575
576 // Internal utility methods. 628 // Internal utility methods.
577 629
578 int _getInt8(int offsetInBytes) native "TypedData_GetInt8"; 630 int _getInt8(int offsetInBytes) native "TypedData_GetInt8";
579 void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8"; 631 void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8";
580 632
581 int _getUint8(int offsetInBytes) native "TypedData_GetUint8"; 633 int _getUint8(int offsetInBytes) native "TypedData_GetUint8";
582 void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8"; 634 void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8";
583 635
584 int _getInt16(int offsetInBytes) native "TypedData_GetInt16"; 636 int _getInt16(int offsetInBytes) native "TypedData_GetInt16";
585 void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16"; 637 void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16";
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 } 783 }
732 784
733 factory _Uint8ClampedArray.view(ByteBuffer buffer, 785 factory _Uint8ClampedArray.view(ByteBuffer buffer,
734 [int offsetInBytes = 0, int length]) { 786 [int offsetInBytes = 0, int length]) {
735 if (length == null) { 787 if (length == null) {
736 length = buffer.lengthInBytes - offsetInBytes; 788 length = buffer.lengthInBytes - offsetInBytes;
737 } 789 }
738 return new _Uint8ClampedArrayView(buffer, offsetInBytes, length); 790 return new _Uint8ClampedArrayView(buffer, offsetInBytes, length);
739 } 791 }
740 792
793 bool _isClamped() { return true; }
741 794
742 // Methods implementing List interface. 795 // Methods implementing List interface.
743 796
744 int operator[](int index) { 797 int operator[](int index) {
745 if (index < 0 || index >= length) { 798 if (index < 0 || index >= length) {
746 _throwRangeError(index, length); 799 _throwRangeError(index, length);
747 } 800 }
748 return _getUint8(index); 801 return _getUint8(index);
749 } 802 }
750 803
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 } 1549 }
1497 1550
1498 1551
1499 class _ExternalUint8ClampedArray extends _TypedList implements Uint8ClampedList { 1552 class _ExternalUint8ClampedArray extends _TypedList implements Uint8ClampedList {
1500 // Factory constructors. 1553 // Factory constructors.
1501 1554
1502 factory _ExternalUint8ClampedArray(int length) { 1555 factory _ExternalUint8ClampedArray(int length) {
1503 return _new(length); 1556 return _new(length);
1504 } 1557 }
1505 1558
1559 bool _isClamped() { return true; }
1506 1560
1507 // Method(s) implementing the List interface. 1561 // Method(s) implementing the List interface.
1508 1562
1509 int operator[](int index) { 1563 int operator[](int index) {
1510 if (index < 0 || index >= length) { 1564 if (index < 0 || index >= length) {
1511 _throwRangeError(index, length); 1565 _throwRangeError(index, length);
1512 } 1566 }
1513 return _getUint8(index); 1567 return _getUint8(index);
1514 } 1568 }
1515 1569
(...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after
2279 } 2333 }
2280 2334
2281 2335
2282 class _TypedListView extends _TypedListBase implements TypedData { 2336 class _TypedListView extends _TypedListBase implements TypedData {
2283 _TypedListView(ByteBuffer _buffer, int _offset, int _length) 2337 _TypedListView(ByteBuffer _buffer, int _offset, int _length)
2284 : _typedData = _buffer, // This assignment is type safe. 2338 : _typedData = _buffer, // This assignment is type safe.
2285 offsetInBytes = _offset, 2339 offsetInBytes = _offset,
2286 length = _length { 2340 length = _length {
2287 } 2341 }
2288 2342
2289
2290 // Method(s) implementing the TypedData interface. 2343 // Method(s) implementing the TypedData interface.
2291 2344
2292 int get lengthInBytes { 2345 int get lengthInBytes {
2293 return length * elementSizeInBytes; 2346 return length * elementSizeInBytes;
2294 } 2347 }
2295 2348
2296 ByteBuffer get buffer { 2349 ByteBuffer get buffer {
2297 return _typedData.buffer; 2350 return _typedData.buffer;
2298 } 2351 }
2299 2352
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
2412 : super(buffer, _offsetInBytes, 2465 : super(buffer, _offsetInBytes,
2413 _defaultIfNull(_length, 2466 _defaultIfNull(_length,
2414 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2467 ((buffer.lengthInBytes - _offsetInBytes) ~/
2415 Uint8List.BYTES_PER_ELEMENT))) { 2468 Uint8List.BYTES_PER_ELEMENT))) {
2416 _rangeCheck(buffer.lengthInBytes, 2469 _rangeCheck(buffer.lengthInBytes,
2417 offsetInBytes, 2470 offsetInBytes,
2418 length * Uint8List.BYTES_PER_ELEMENT); 2471 length * Uint8List.BYTES_PER_ELEMENT);
2419 } 2472 }
2420 2473
2421 2474
2475 bool _isClamped() { return true; }
2476
2422 // Method(s) implementing List interface. 2477 // Method(s) implementing List interface.
2423 2478
2424 int operator[](int index) { 2479 int operator[](int index) {
2425 if (index < 0 || index >= length) { 2480 if (index < 0 || index >= length) {
2426 _throwRangeError(index, length); 2481 _throwRangeError(index, length);
2427 } 2482 }
2428 return _typedData._getUint8(offsetInBytes + 2483 return _typedData._getUint8(offsetInBytes +
2429 (index * Uint8List.BYTES_PER_ELEMENT)); 2484 (index * Uint8List.BYTES_PER_ELEMENT));
2430 } 2485 }
2431 2486
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
3345 return value; 3400 return value;
3346 } 3401 }
3347 return object; 3402 return object;
3348 } 3403 }
3349 3404
3350 3405
3351 void _throwRangeError(int index, int length) { 3406 void _throwRangeError(int index, int length) {
3352 String message = "$index must be in the range [0..$length)"; 3407 String message = "$index must be in the range [0..$length)";
3353 throw new RangeError(message); 3408 throw new RangeError(message);
3354 } 3409 }
OLDNEW
« no previous file with comments | « runtime/lib/typed_data.cc ('k') | runtime/tests/vm/vm.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698