OLD | NEW |
---|---|
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 import "dart:_internal"; | 7 import "dart:_internal"; |
8 import 'dart:math' show Random; | 8 import 'dart:math' show Random; |
9 | 9 |
10 patch class Int8List { | 10 patch class Int8List { |
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
822 void _setFloat32x4(int offsetInBytes, Float32x4 value) | 822 void _setFloat32x4(int offsetInBytes, Float32x4 value) |
823 native "TypedData_SetFloat32x4"; | 823 native "TypedData_SetFloat32x4"; |
824 | 824 |
825 Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4"; | 825 Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4"; |
826 void _setInt32x4(int offsetInBytes, Int32x4 value) | 826 void _setInt32x4(int offsetInBytes, Int32x4 value) |
827 native "TypedData_SetInt32x4"; | 827 native "TypedData_SetInt32x4"; |
828 | 828 |
829 Float64x2 _getFloat64x2(int offsetInBytes) native "TypedData_GetFloat64x2"; | 829 Float64x2 _getFloat64x2(int offsetInBytes) native "TypedData_GetFloat64x2"; |
830 void _setFloat64x2(int offsetInBytes, Float64x2 value) | 830 void _setFloat64x2(int offsetInBytes, Float64x2 value) |
831 native "TypedData_SetFloat64x2"; | 831 native "TypedData_SetFloat64x2"; |
832 | |
833 /** Writes the code units of `string.substring(start, end)` as Uint16. */ | |
834 void _setStringAt(int byteOffset, String string, int start, int end) { | |
835 // This can be optimized to a mem-move if string is two-byte. | |
836 int length = end - start; | |
837 assert(byteOffset + length * Uint16List.BYTES_PER_ELEMENT <= | |
838 this.lengthInBytes); | |
839 for (int i = 0; i < length; i++) { | |
840 _setUint16(byteOffset + i * Uint16List.BYTES_PER_ELEMENT, | |
841 string.codeUnitAt(start + i)); | |
842 } | |
843 } | |
844 | |
845 void _setCodeUnits(CodeUnits units, int start, int end, int skipCount) { | |
846 String string = CodeUnits.stringOf(units); | |
847 end = RangeError.checkValidRange(start, end, length); | |
848 int sliceLength = end - start; | |
849 int sliceEnd = skipCount + sliceLength; | |
850 RangeError.checkValidRange(skipCount, sliceEnd, | |
851 string.length, | |
852 "skipCount", "skipCount + length"); | |
853 this._setStringAt(start * elementSizeInBytes, string, skipCount, sliceEnd); | |
854 } | |
832 } | 855 } |
833 | 856 |
834 | 857 |
835 class _Int8Array extends _TypedList with _IntListMixin implements Int8List { | 858 class _Int8Array extends _TypedList with _IntListMixin implements Int8List { |
836 // Factory constructors. | 859 // Factory constructors. |
837 | 860 |
838 factory _Int8Array(int length) { | 861 factory _Int8Array(int length) { |
839 return _new(length); | 862 return _new(length); |
840 } | 863 } |
841 | 864 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1022 return _getIndexedUint16(index); | 1045 return _getIndexedUint16(index); |
1023 } | 1046 } |
1024 | 1047 |
1025 void operator[]=(int index, int value) { | 1048 void operator[]=(int index, int value) { |
1026 if (index < 0 || index >= length) { | 1049 if (index < 0 || index >= length) { |
1027 throw _newRangeError(index, length); | 1050 throw _newRangeError(index, length); |
1028 } | 1051 } |
1029 _setIndexedUint16(index, _toUint16(value)); | 1052 _setIndexedUint16(index, _toUint16(value)); |
1030 } | 1053 } |
1031 | 1054 |
1055 void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { | |
1056 if (ClassID.getID(iterable) != CodeUnits.cid) { | |
1057 super.setRange(start, end, iterable, skipCount); | |
1058 } else { | |
1059 _setCodeUnits(iterable, start, end, skipCount); | |
Vyacheslav Egorov (Google)
2015/01/29 13:04:54
Maybe we should also have an optimization for Int8
Lasse Reichstein Nielsen
2015/01/29 13:13:27
I was planning to do that in a later CL.
| |
1060 } | |
1061 } | |
1032 | 1062 |
1033 // Method(s) implementing the TypedData interface. | 1063 // Method(s) implementing the TypedData interface. |
1034 | 1064 |
1035 int get elementSizeInBytes { | 1065 int get elementSizeInBytes { |
1036 return Uint16List.BYTES_PER_ELEMENT; | 1066 return Uint16List.BYTES_PER_ELEMENT; |
1037 } | 1067 } |
1038 | 1068 |
1039 | 1069 |
1040 // Internal utility methods. | 1070 // Internal utility methods. |
1041 | 1071 |
(...skipping 1404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2446 // Method(s) implementing the TypedData interface. | 2476 // Method(s) implementing the TypedData interface. |
2447 | 2477 |
2448 int get lengthInBytes { | 2478 int get lengthInBytes { |
2449 return length * elementSizeInBytes; | 2479 return length * elementSizeInBytes; |
2450 } | 2480 } |
2451 | 2481 |
2452 ByteBuffer get buffer { | 2482 ByteBuffer get buffer { |
2453 return _typedData.buffer; | 2483 return _typedData.buffer; |
2454 } | 2484 } |
2455 | 2485 |
2456 final TypedData _typedData; | 2486 final _TypedList _typedData; |
2457 final int offsetInBytes; | 2487 final int offsetInBytes; |
2458 final int length; | 2488 final int length; |
2459 } | 2489 } |
2460 | 2490 |
2461 | 2491 |
2462 class _Int8ArrayView extends _TypedListView with _IntListMixin implements Int8Li st { | 2492 class _Int8ArrayView extends _TypedListView with _IntListMixin implements Int8Li st { |
2463 // Constructor. | 2493 // Constructor. |
2464 _Int8ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) | 2494 _Int8ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) |
2465 : super(buffer, _offsetInBytes, | 2495 : super(buffer, _offsetInBytes, |
2466 _defaultIfNull(_length, | 2496 _defaultIfNull(_length, |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2674 } | 2704 } |
2675 | 2705 |
2676 void operator[]=(int index, int value) { | 2706 void operator[]=(int index, int value) { |
2677 if (index < 0 || index >= length) { | 2707 if (index < 0 || index >= length) { |
2678 throw _newRangeError(index, length); | 2708 throw _newRangeError(index, length); |
2679 } | 2709 } |
2680 _typedData._setUint16(offsetInBytes + (index * Uint16List.BYTES_PER_ELEMENT) , | 2710 _typedData._setUint16(offsetInBytes + (index * Uint16List.BYTES_PER_ELEMENT) , |
2681 _toUint16(value)); | 2711 _toUint16(value)); |
2682 } | 2712 } |
2683 | 2713 |
2714 void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { | |
2715 if (ClassID.getID(iterable) != CodeUnits.cid) { | |
2716 super.setRange(start, end, iterable, skipCount); | |
2717 } else { | |
2718 _typed_Data._setCodeUnits(iterable, start, end, skipCount); | |
2719 } | |
2720 } | |
2684 | 2721 |
2685 // Method(s) implementing TypedData interface. | 2722 // Method(s) implementing TypedData interface. |
2686 | 2723 |
2687 int get elementSizeInBytes { | 2724 int get elementSizeInBytes { |
2688 return Uint16List.BYTES_PER_ELEMENT; | 2725 return Uint16List.BYTES_PER_ELEMENT; |
2689 } | 2726 } |
2690 | 2727 |
2691 | |
2692 // Internal utility methods. | 2728 // Internal utility methods. |
2693 | 2729 |
2694 Uint16List _createList(int length) { | 2730 Uint16List _createList(int length) { |
2695 return new Uint16List(length); | 2731 return new Uint16List(length); |
2696 } | 2732 } |
2697 } | 2733 } |
2698 | 2734 |
2699 | 2735 |
2700 class _Int32ArrayView extends _TypedListView with _IntListMixin implements Int32 List { | 2736 class _Int32ArrayView extends _TypedListView with _IntListMixin implements Int32 List { |
2701 // Constructor. | 2737 // Constructor. |
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3486 return value; | 3522 return value; |
3487 } | 3523 } |
3488 return object; | 3524 return object; |
3489 } | 3525 } |
3490 | 3526 |
3491 | 3527 |
3492 _newRangeError(int index, int length) { | 3528 _newRangeError(int index, int length) { |
3493 String message = "$index must be in the range [0..$length)"; | 3529 String message = "$index must be in the range [0..$length)"; |
3494 return new RangeError(message); | 3530 return new RangeError(message); |
3495 } | 3531 } |
OLD | NEW |