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

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

Issue 9958046: Implement {Int,Uint}{8,16,32,64} and Float{32,64} typed arrays. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: move test code, minor formatting and consistency tweaks Created 8 years, 7 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/byte_array.cc ('k') | runtime/tests/vm/dart/byte_array_test.dart » ('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) 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 interface ByteArray extends List default _InternalByteArray { 5 interface ByteArray default _Uint8Array {
6 // TODO: remove constructor and default implementation after dart:io
7 // is updated to use Uint8Array directly instead of ByteArray
6 ByteArray(int length); 8 ByteArray(int length);
7 9
8 int get length(); 10 int lengthInBytes();
11
12 ByteArray subByteArray([int start, int length]);
9 13
10 int getInt8(int byteOffset); 14 int getInt8(int byteOffset);
11 15
12 void setInt8(int byteOffset, int value); 16 void setInt8(int byteOffset, int value);
13 17
14 int getUint8(int byteOffset); 18 int getUint8(int byteOffset);
15 19
16 void setUint8(int byteOffset, int value); 20 void setUint8(int byteOffset, int value);
17 21
18 int getInt16(int byteOffset); 22 int getInt16(int byteOffset);
(...skipping 23 matching lines...) Expand all
42 double getFloat32(int byteOffset); 46 double getFloat32(int byteOffset);
43 47
44 void setFloat32(int byteOffset, double value); 48 void setFloat32(int byteOffset, double value);
45 49
46 double getFloat64(int byteOffset); 50 double getFloat64(int byteOffset);
47 51
48 void setFloat64(int byteOffset, double value); 52 void setFloat64(int byteOffset, double value);
49 } 53 }
50 54
51 55
52 class _ByteArrayBase { 56 interface ByteArrayViewable {
53 57 int bytesPerElement();
54 // Iterable interface 58
55 59 int lengthInBytes();
56 Iterator iterator() { 60
57 return new _ByteArrayIterator(this); 61 ByteArray asByteArray([int offsetInBytes, int lengthInBytes]);
58 } 62 }
59 63
60 // Collection interface 64
65 interface Int8Array extends List<int>, ByteArrayViewable
66 default _Int8Array {
67 Int8Array(int length);
68 Int8Array.view(ByteArray array, [int start, int length]);
69 }
70
71
72 interface Uint8Array extends List<int>, ByteArrayViewable
73 default _Uint8Array {
74 Uint8Array(int length);
75 Uint8Array.view(ByteArray array, [int start, int length]);
76 }
77
78
79 interface Int16Array extends List<int>, ByteArrayViewable
80 default _Int16Array {
81 Int16Array(int length);
82 Int16Array.view(ByteArray array, [int start, int length]);
83 }
84
85
86 interface Uint16Array extends List<int>, ByteArrayViewable
87 default _Uint16Array {
88 Uint16Array(int length);
89 Uint16Array.view(ByteArray array, [int start, int length]);
90 }
91
92
93 interface Int32Array extends List<int>, ByteArrayViewable
94 default _Int32Array {
95 Int32Array(int length);
96 Int32Array.view(ByteArray array, [int start, int length]);
97 }
98
99
100 interface Uint32Array extends List<int>, ByteArrayViewable
101 default _Uint32Array {
102 Uint32Array(int length);
103 Uint32Array.view(ByteArray array, [int start, int length]);
104
105 }
106
107
108 interface Int64Array extends List<int>, ByteArrayViewable
109 default _Int64Array {
110 Int64Array(int length);
111 Int64Array.view(ByteArray array, [int start, int length]);
112 }
113
114
115 interface Uint64Array extends List<int>, ByteArrayViewable
116 default _Uint64Array {
117 Uint64Array(int length);
118 Uint64Array.view(ByteArray array, [int start, int length]);
119 }
120
121
122 interface Float32Array extends List<double>, ByteArrayViewable
123 default _Float32Array {
124 Float32Array(int length);
125 Float32Array.view(ByteArray array, [int start, int length]);
126 }
127
128
129 interface Float64Array extends List<double>, ByteArrayViewable
130 default _Float64Array {
131 Float64Array(int length);
132 Float64Array.view(ByteArray array, [int start, int length]);
133 }
134
135
136 abstract class _ByteArrayBase {
137 void add(value) {
138 throw const UnsupportedOperationException(
139 "Cannot add to a non-extendable array");
140 }
141
142 void addLast(value) {
143 throw const UnsupportedOperationException(
144 "Cannot add to a non-extendable array");
145 }
146
147 void addAll(Collection value) {
148 throw const UnsupportedOperationException(
149 "Cannot add to a non-extendable array");
150 }
151
152 void clear() {
153 throw const UnsupportedOperationException(
154 "Cannot remove from a non-extendable array");
155 }
156
157 void insertRange(int start, int length, [initialValue]) {
158 throw const UnsupportedOperationException(
159 "Cannot add to a non-extendable array");
160 }
61 161
62 int get length() { 162 int get length() {
63 return _length(); 163 return _length();
64 } 164 }
65 165
66 bool every(bool f(int element)) { 166 set length(newLength) {
67 return Collections.every(this, f); 167 throw const UnsupportedOperationException(
68 } 168 "Cannot resize a non-extendable array");
69
70 Collection map(f(int element)) {
71 return Collections.map(this,
72 new GrowableObjectArray.withCapacity(length),
73 f);
74 }
75
76 Collection filter(bool f(int element)) {
77 return Collections.filter(this, new GrowableObjectArray(), f);
78 }
79
80 void forEach(f(int element)) {
81 Collections.forEach(this, f);
82 }
83
84 bool isEmpty() {
85 return this.length === 0;
86 }
87
88 bool some(bool f(int element)) {
89 return Collections.some(this, f);
90 }
91
92 // List interface
93
94 int operator[](int index) {
95 return getUint8(index);
96 }
97
98 void operator[]=(int index, int value) {
99 setUint8(index, value);
100 }
101
102 void set length(int newLength) {
103 throw const UnsupportedOperationException("Cannot add to a byte array");
104 }
105
106 void add(int element) {
107 throw const UnsupportedOperationException("Cannot add to a byte array");
108 }
109
110 void addLast(int element) {
111 add(element);
112 }
113
114 void addAll(Collection elements) {
115 throw const UnsupportedOperationException("Cannot add to a byte array");
116 }
117
118 void sort(int compare(int a, b)) {
119 DualPivotQuicksort.sort(this, compare);
120 }
121
122 int indexOf(int element, [int start = 0]) {
123 return Arrays.indexOf(this, element, start, this.length);
124 }
125
126 int lastIndexOf(int element, [int start = null]) {
127 if (start === null) start = length - 1;
128 return Arrays.lastIndexOf(this, element, start);
129 }
130
131 void clear() {
132 throw const UnsupportedOperationException("Cannot clear a byte array");
133 } 169 }
134 170
135 int removeLast() { 171 int removeLast() {
136 throw const UnsupportedOperationException( 172 throw const UnsupportedOperationException(
137 "Cannot remove from a byte array"); 173 "Cannot remove from a non-extendable array");
138 } 174 }
139 175
140 int last() { 176 void removeRange(int start, int length) {
141 return this[length - 1]; 177 throw const UnsupportedOperationException(
142 } 178 "Cannot remove from a non-extendable array");
143 179 }
144 String toString() { 180
145 return Collections.collectionToString(this); 181 ByteArray asByteArray([int offsetInBytes = 0, int lengthInBytes]) {
146 } 182 if (lengthInBytes === null) {
147 183 lengthInBytes = this.lengthInBytes();
148 void setRange(int start, int length, List<int> from, [int startFrom = 0]) { 184 }
149 if (length < 0) { 185 return new _ByteArrayView(this, offsetInBytes, lengthInBytes);
150 throw new IllegalArgumentException("negative length $length"); 186 }
151 } 187
152 if (from is ByteArray) { 188 int _length() native "ByteArray_getLength";
153 _setRange(start, length, from, startFrom); 189
190 void _setRange(int startInBytes, int lengthInBytes,
191 _ByteArrayBase from, int startFromInBytes)
192 native "ByteArray_setRange";
193
194 int _getInt8(int byteOffset) native "ByteArray_getInt8";
195 void _setInt8(int byteOffset, int value) native "ByteArray_setInt8";
196
197 int _getUint8(int byteOffset) native "ByteArray_getUint8";
198 void _setUint8(int byteOffset, int value) native "ByteArray_setUint8";
199
200 int _getInt16(int byteOffset) native "ByteArray_getInt16";
201 void _setInt16(int byteOffset, int value) native "ByteArray_setInt16";
202
203 int _getUint16(int byteOffset) native "ByteArray_getUint16";
204 void _setUint16(int byteOffset, int value) native "ByteArray_setUint16";
205
206 int _getInt32(int byteOffset) native "ByteArray_getInt32";
207 void _setInt32(int byteOffset, int value) native "ByteArray_setInt32";
208
209 int _getUint32(int byteOffset) native "ByteArray_getUint32";
210 void _setUint32(int byteOffset, int value) native "ByteArray_setUint32";
211
212 int _getInt64(int byteOffset) native "ByteArray_getInt64";
213 void _setInt64(int byteOffset, int value) native "ByteArray_setInt64";
214
215 int _getUint64(int byteOffset) native "ByteArray_getUint64";
216 void _setUint64(int byteOffset, int value) native "ByteArray_setUint64";
217
218 double _getFloat32(int byteOffset) native "ByteArray_getFloat32";
219 void _setFloat32(int byteOffset, double value) native "ByteArray_setFloat32";
220
221 double _getFloat64(int byteOffset) native "ByteArray_getFloat64";
222 void _setFloat64(int byteOffset, double value) native "ByteArray_setFloat64";
223 }
224
225
226 int _toInt(int value, int mask) {
227 value &= mask;
228 if (value > (mask >> 1)) value -= mask + 1;
229 return value;
230 }
231
232 int _toInt8(int value) {
233 return _toInt(value, 0xFF);
234 }
235 int _toUint8(int value) {
236 return value & 0xFF;
237 }
238
239
240 int _toInt16(int value) {
241 return _toInt(value, 0xFFFF);
242 }
243 int _toUint16(int value) {
244 return value & 0xFFFF;
245 }
246
247
248 int _toInt32(int value) {
249 return _toInt(value, 0xFFFFFFFF);
250 }
251 int _toUint32(int value) {
252 return value & 0xFFFFFFFF;
253 }
254
255
256 int _toInt64(int value) {
257 return _toInt(value, 0xFFFFFFFFFFFFFFFF);
258 }
259 int _toUint64(int value) {
260 return value & 0xFFFFFFFFFFFFFFFF;
261 }
262
263
264 void _rangeCheck(List a, int start, int length) {
265 if (length < 0) {
266 throw new IllegalArgumentException("negative length $length");
267 }
268 if (start < 0) {
269 throw new IndexOutOfRangeException("negative start $start");
270 }
271 if (start + length > a.length) {
272 throw new IndexOutOfRangeException(start + length);
273 }
274 }
275
276
277 class _Int8Array extends _ByteArrayBase implements Int8Array {
278 factory _Int8Array(int length) {
279 return _new(length);
280 }
281
282 factory _Int8Array.view(ByteArray array, [int start = 0, int length]) {
283 if (length === null) {
284 length = array.lengthInBytes();
285 }
286 return new _Int8ArrayView(array, start, length);
287 }
288
289 int operator[](int index) {
290 return _getIndexed(index);
291 }
292
293 void operator[]=(int index, int value) {
294 _setIndexed(index, _toInt8(value));
295 }
296
297 Iterator<int> iterator() {
298 return new _ByteArrayIterator<int>(this);
299 }
300
301 List<int> getRange(int start, int length) {
302 _rangeCheck(this, start, length);
303 _Int8Array result = _new(length);
304 result.setRange(0, length, this, start);
305 return result;
306 }
307
308 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
309 if (from is _Int8Array) {
310 int startInBytes = start * _BYTES_PER_ELEMENT;
311 int lengthInBytes = length * _BYTES_PER_ELEMENT;
312 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
313 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
154 } else { 314 } else {
155 Arrays.copy(from, startFrom, this, start, length); 315 Arrays.copy(from, startFrom, this, start, length);
156 } 316 }
157 } 317 }
158 318
159 List getRange(int start, int length) { 319 String toString() {
160 if (length == 0) return []; 320 return Collections.collectionToString(this);
161 Arrays.rangeCheck(this, start, length); 321 }
162 ByteArray list = new ByteArray(length); 322
163 list._setRange(0, length, this, start); 323 int bytesPerElement() {
164 return list; 324 return _BYTES_PER_ELEMENT;
165 } 325 }
166 326
167 // Implementation 327 int lengthInBytes() {
168 328 return _length() * _BYTES_PER_ELEMENT;
169 static final int _UINT8_MAX = (1 << 8) - 1; 329 }
170 static final int _UINT16_MAX = (1 << 16) - 1; 330
171 static final int _UINT32_MAX = (1 << 32) - 1; 331 static final int _BYTES_PER_ELEMENT = 1;
172 static final int _UINT64_MAX = (1 << 64) - 1; 332
173 333 static _Int8Array _new(int length) native "Int8Array_new";
174 int _toInt(int value, int mask) { 334
175 int result = value & mask; 335 int _getIndexed(int index) native "Int8Array_getIndexed";
176 return result > (mask >> 1) ? (result - mask) : result; 336
177 } 337 void _setIndexed(int index, int value) native "Int8Array_setIndexed";
178 338 }
179 int _toInt8(int value) { 339
180 return _toInt(value, _UINT8_MAX); 340
181 } 341 class _Uint8Array extends _ByteArrayBase implements Uint8Array {
182 342 factory _Uint8Array(int length) {
183 int _toUint8(int value) { 343 return _new(length);
184 return value & _UINT8_MAX; 344 }
185 } 345
186 346 factory _Uint8Array.view(ByteArray array, [int start = 0, int length]) {
187 int _toInt16(int value) { 347 if (length === null) {
188 return _toInt(value, _UINT16_MAX); 348 length = array.lengthInBytes();
189 } 349 }
190 350 return new _Uint8ArrayView(array, start, length);
191 int _toUint16(int value) { 351 }
192 return value & _UINT16_MAX; 352
193 } 353 factory ByteArray(int length) { return _new(length); } // TODO
194 354
195 int _toInt32(int value) { 355 int operator[](int index) {
196 return _toInt(value, _UINT32_MAX); 356 return _getIndexed(index);
197 } 357 }
198 358
199 int _toUint32(int value) { 359 void operator[]=(int index, int value) {
200 return value & _UINT32_MAX; 360 _setIndexed(index, _toUint8(value));
201 } 361 }
202 362
203 int _toInt64(int value) { 363 Iterator<int> iterator() {
204 return _toInt(value, _UINT64_MAX); 364 return new _ByteArrayIterator<int>(this);
205 } 365 }
206 366
207 int _toUint64(int value) { 367 List<int> getRange(int start, int length) {
208 return value & _UINT64_MAX; 368 _rangeCheck(this, start, length);
209 } 369 _Uint8Array result = _new(length);
210 370 result.setRange(0, length, this, start);
211 int _length() native "ByteArray_getLength"; 371 return result;
212 372 }
213 void _setRange(int start, int length, ByteArray from, int startFrom) 373
214 native "ByteArray_setRange"; 374 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
215 } 375 if (from is _Uint8Array) {
216 376 int startInBytes = start * _BYTES_PER_ELEMENT;
217 377 int lengthInBytes = length * _BYTES_PER_ELEMENT;
218 class _ByteArrayIterator implements Iterator { 378 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
219 _ByteArrayIterator(List byteArray) 379 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
220 : _byteArray = byteArray, _length = byteArray.length, _pos = 0 { 380 } else {
221 assert(byteArray is ByteArray); 381 Arrays.copy(from, startFrom, this, start, length);
222 } 382 }
383 }
384
385 String toString() {
386 return Collections.collectionToString(this);
387 }
388
389 int bytesPerElement() {
390 return _BYTES_PER_ELEMENT;
391 }
392
393 int lengthInBytes() {
394 return _length() * _BYTES_PER_ELEMENT;
395 }
396
397 static final int _BYTES_PER_ELEMENT = 1;
398
399 static _Uint8Array _new(int length) native "Uint8Array_new";
400
401 int _getIndexed(int index) native "Uint8Array_getIndexed";
402
403 void _setIndexed(int index, int value) native "Uint8Array_setIndexed";
404 }
405
406
407 class _Int16Array extends _ByteArrayBase implements Int16Array {
408 factory _Int16Array(int length) {
409 return _new(length);
410 }
411
412 factory _Int16Array.view(ByteArray array, [int start = 0, int length]) {
413 if (length === null) {
414 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
415 }
416 return new _Int16ArrayView(array, start, length);
417 }
418
419 int operator[](int index) {
420 return _getIndexed(index);
421 }
422
423 void operator[]=(int index, int value) {
424 _setIndexed(index, _toInt16(value));
425 }
426
427 Iterator<int> iterator() {
428 return new _ByteArrayIterator<int>(this);
429 }
430
431 List<int> getRange(int start, int length) {
432 _rangeCheck(this, start, length);
433 _Int16Array result = _new(length);
434 result.setRange(0, length, this, start);
435 return result;
436 }
437
438 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
439 if (from is _Int16Array) {
440 int startInBytes = start * _BYTES_PER_ELEMENT;
441 int lengthInBytes = length * _BYTES_PER_ELEMENT;
442 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
443 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
444 } else {
445 Arrays.copy(from, startFrom, this, start, length);
446 }
447 }
448
449 String toString() {
450 return Collections.collectionToString(this);
451 }
452
453 int bytesPerElement() {
454 return _BYTES_PER_ELEMENT;
455 }
456
457 int lengthInBytes() {
458 return _length() * _BYTES_PER_ELEMENT;
459 }
460
461 static final int _BYTES_PER_ELEMENT = 2;
462
463 static _Int16Array _new(int length) native "Int16Array_new";
464
465 int _getIndexed(int index) native "Int16Array_getIndexed";
466
467 void _setIndexed(int index, int value) native "Int16Array_setIndexed";
468 }
469
470
471 class _Uint16Array extends _ByteArrayBase implements Uint16Array {
472 factory _Uint16Array(int length) {
473 return _new(length);
474 }
475
476 factory _Uint16Array.view(ByteArray array, [int start = 0, int length]) {
477 if (length === null) {
478 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
479 }
480 return new _Uint16ArrayView(array, start, length);
481 }
482
483 int operator[](int index) {
484 return _getIndexed(index);
485 }
486
487 void operator[]=(int index, int value) {
488 _setIndexed(index, _toUint16(value));
489 }
490
491 Iterator<int> iterator() {
492 return new _ByteArrayIterator<int>(this);
493 }
494
495 List<int> getRange(int start, int length) {
496 _rangeCheck(this, start, length);
497 _Uint16Array result = _new(length);
498 result.setRange(0, length, this, start);
499 return result;
500 }
501
502 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
503 if (from is _Uint16Array) {
504 int startInBytes = start * _BYTES_PER_ELEMENT;
505 int lengthInBytes = length * _BYTES_PER_ELEMENT;
506 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
507 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
508 } else {
509 Arrays.copy(from, startFrom, this, start, length);
510 }
511 }
512
513 String toString() {
514 return Collections.collectionToString(this);
515 }
516
517 int bytesPerElement() {
518 return _BYTES_PER_ELEMENT;
519 }
520
521 int lengthInBytes() {
522 return _length() * _BYTES_PER_ELEMENT;
523 }
524
525 static final int _BYTES_PER_ELEMENT = 2;
526
527 static _Uint16Array _new(int length) native "Uint16Array_new";
528
529 int _getIndexed(int index) native "Uint16Array_getIndexed";
530
531 void _setIndexed(int index, int value) native "Uint16Array_setIndexed";
532 }
533
534
535 class _Int32Array extends _ByteArrayBase implements Int32Array {
536 factory _Int32Array(int length) {
537 return _new(length);
538 }
539
540 factory _Int32Array.view(ByteArray array, [int start = 0, int length]) {
541 if (length === null) {
542 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
543 }
544 return new _Int32ArrayView(array, start, length);
545 }
546
547 int operator[](int index) {
548 return _getIndexed(index);
549 }
550
551 void operator[]=(int index, int value) {
552 _setIndexed(index, _toInt32(value));
553 }
554
555 Iterator<int> iterator() {
556 return new _ByteArrayIterator<int>(this);
557 }
558
559 List<int> getRange(int start, int length) {
560 _rangeCheck(this, start, length);
561 _Int32Array result = _new(length);
562 result.setRange(0, length, this, start);
563 return result;
564 }
565
566 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
567 if (from is _Int32Array) {
568 int startInBytes = start * _BYTES_PER_ELEMENT;
569 int lengthInBytes = length * _BYTES_PER_ELEMENT;
570 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
571 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
572 } else {
573 Arrays.copy(from, startFrom, this, start, length);
574 }
575 }
576
577 String toString() {
578 return Collections.collectionToString(this);
579 }
580
581 int bytesPerElement() {
582 return _BYTES_PER_ELEMENT;
583 }
584
585 int lengthInBytes() {
586 return _length() * _BYTES_PER_ELEMENT;
587 }
588
589 static final int _BYTES_PER_ELEMENT = 4;
590
591 static _Int32Array _new(int length) native "Int32Array_new";
592
593 int _getIndexed(int index) native "Int32Array_getIndexed";
594
595 void _setIndexed(int index, int value) native "Int32Array_setIndexed";
596 }
597
598
599 class _Uint32Array extends _ByteArrayBase implements Uint32Array {
600 factory _Uint32Array(int length) {
601 return _new(length);
602 }
603
604 factory _Uint32Array.view(ByteArray array, [int start = 0, int length]) {
605 if (length === null) {
606 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
607 }
608 return new _Uint32ArrayView(array, start, length);
609 }
610
611 int operator[](int index) {
612 return _getIndexed(index);
613 }
614
615 void operator[]=(int index, int value) {
616 _setIndexed(index, _toUint32(value));
617 }
618
619 Iterator<int> iterator() {
620 return new _ByteArrayIterator<int>(this);
621 }
622
623 List<int> getRange(int start, int length) {
624 _rangeCheck(this, start, length);
625 _Uint32Array result = _new(length);
626 result.setRange(0, length, this, start);
627 return result;
628 }
629
630 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
631 if (from is _Uint32Array) {
632 int startInBytes = start * _BYTES_PER_ELEMENT;
633 int lengthInBytes = length * _BYTES_PER_ELEMENT;
634 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
635 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
636 } else {
637 Arrays.copy(from, startFrom, this, start, length);
638 }
639 }
640
641 String toString() {
642 return Collections.collectionToString(this);
643 }
644
645 int bytesPerElement() {
646 return _BYTES_PER_ELEMENT;
647 }
648
649 int lengthInBytes() {
650 return _length() * _BYTES_PER_ELEMENT;
651 }
652
653 static final int _BYTES_PER_ELEMENT = 4;
654
655 static _Uint32Array _new(int length) native "Uint32Array_new";
656
657 int _getIndexed(int index) native "Uint32Array_getIndexed";
658
659 void _setIndexed(int index, int value) native "Uint32Array_setIndexed";
660 }
661
662
663 class _Int64Array extends _ByteArrayBase implements Int64Array {
664 factory _Int64Array(int length) {
665 return _new(length);
666 }
667
668 factory _Int64Array.view(ByteArray array, [int start = 0, int length]) {
669 if (length === null) {
670 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
671 }
672 return new _Int64ArrayView(array, start, length);
673 }
674
675 int operator[](int index) {
676 return _getIndexed(index);
677 }
678
679 void operator[]=(int index, int value) {
680 _setIndexed(index, _toInt64(value));
681 }
682
683 Iterator<int> iterator() {
684 return new _ByteArrayIterator<int>(this);
685 }
686
687 List<int> getRange(int start, int length) {
688 _rangeCheck(this, start, length);
689 _Int64Array result = _new(length);
690 result.setRange(0, length, this, start);
691 return result;
692 }
693
694 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
695 if (from is _Int64Array) {
696 int startInBytes = start * _BYTES_PER_ELEMENT;
697 int lengthInBytes = length * _BYTES_PER_ELEMENT;
698 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
699 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
700 } else {
701 Arrays.copy(from, startFrom, this, start, length);
702 }
703 }
704
705 String toString() {
706 return Collections.collectionToString(this);
707 }
708
709 int bytesPerElement() {
710 return _BYTES_PER_ELEMENT;
711 }
712
713 int lengthInBytes() {
714 return _length() * _BYTES_PER_ELEMENT;
715 }
716
717 static final int _BYTES_PER_ELEMENT = 8;
718
719 static _Int64Array _new(int length) native "Int64Array_new";
720
721 int _getIndexed(int index) native "Int64Array_getIndexed";
722
723 void _setIndexed(int index, int value) native "Int64Array_setIndexed";
724 }
725
726
727 class _Uint64Array extends _ByteArrayBase implements Uint64Array {
728 factory _Uint64Array(int length) {
729 return _new(length);
730 }
731
732 factory _Uint64Array.view(ByteArray array, [int start = 0, int length]) {
733 if (length === null) {
734 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
735 }
736 return new _Uint64ArrayView(array, start, length);
737 }
738
739 int operator[](int index) {
740 return _getIndexed(index);
741 }
742
743 void operator[]=(int index, int value) {
744 _setIndexed(index, _toUint64(value));
745 }
746
747 Iterator<int> iterator() {
748 return new _ByteArrayIterator<int>(this);
749 }
750
751 List<int> getRange(int start, int length) {
752 _rangeCheck(this, start, length);
753 _Uint64Array result = _new(length);
754 result.setRange(0, length, this, start);
755 return result;
756 }
757
758 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
759 if (from is _Uint64Array) {
760 int startInBytes = start * _BYTES_PER_ELEMENT;
761 int lengthInBytes = length * _BYTES_PER_ELEMENT;
762 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
763 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
764 } else {
765 Arrays.copy(from, startFrom, this, start, length);
766 }
767 }
768
769 String toString() {
770 return Collections.collectionToString(this);
771 }
772
773 int bytesPerElement() {
774 return _BYTES_PER_ELEMENT;
775 }
776
777 int lengthInBytes() {
778 return _length() * _BYTES_PER_ELEMENT;
779 }
780
781 static final int _BYTES_PER_ELEMENT = 8;
782
783 static _Uint64Array _new(int length) native "Uint64Array_new";
784
785 int _getIndexed(int index) native "Uint64Array_getIndexed";
786
787 void _setIndexed(int index, int value) native "Uint64Array_setIndexed";
788 }
789
790
791 class _Float32Array extends _ByteArrayBase implements Float32Array {
792 factory _Float32Array(int length) {
793 return _new(length);
794 }
795
796 factory _Float32Array.view(ByteArray array, [int start = 0, int length]) {
797 if (length === null) {
798 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
799 }
800 return new _Float32ArrayView(array, start, length);
801 }
802
803 double operator[](int index) {
804 return _getIndexed(index);
805 }
806
807 void operator[]=(int index, double value) {
808 _setIndexed(index, value);
809 }
810
811 Iterator<double> iterator() {
812 return new _ByteArrayIterator<double>(this);
813 }
814
815 List<double> getRange(int start, int length) {
816 _rangeCheck(this, start, length);
817 _Float32Array result = _new(length);
818 result.setRange(0, length, this, start);
819 return result;
820 }
821
822 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
823 if (from is _Float32Array) {
824 int startInBytes = start * _BYTES_PER_ELEMENT;
825 int lengthInBytes = length * _BYTES_PER_ELEMENT;
826 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
827 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
828 } else {
829 Arrays.copy(from, startFrom, this, start, length);
830 }
831 }
832
833 String toString() {
834 return Collections.collectionToString(this);
835 }
836
837 int bytesPerElement() {
838 return _BYTES_PER_ELEMENT;
839 }
840
841 int lengthInBytes() {
842 return _length() * _BYTES_PER_ELEMENT;
843 }
844
845 static final int _BYTES_PER_ELEMENT = 4;
846
847 static _Float32Array _new(int length) native "Float32Array_new";
848
849 int _getIndexed(int index) native "Float32Array_getIndexed";
850
851 void _setIndexed(int index, double value) native "Float32Array_setIndexed";
852 }
853
854
855 class _Float64Array extends _ByteArrayBase implements Float64Array {
856 factory _Float64Array(int length) {
857 return _new(length);
858 }
859
860 factory _Float64Array.view(ByteArray array, [int start = 0, int length]) {
861 if (length === null) {
862 length = (array.lengthInBytes() - start) ~/ _BYTES_PER_ELEMENT;
863 }
864 return new _Float64ArrayView(array, start, length);
865 }
866
867 double operator[](int index) {
868 return _getIndexed(index);
869 }
870
871 void operator[]=(int index, double value) {
872 _setIndexed(index, value);
873 }
874
875 Iterator<double> iterator() {
876 return new _ByteArrayIterator<double>(this);
877 }
878
879 List<double> getRange(int start, int length) {
880 _rangeCheck(this, start, length);
881 _Float64Array result = _new(length);
882 result.setRange(0, length, this, start);
883 return result;
884 }
885
886 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
887 if (from is _Float64Array) {
888 int startInBytes = start * _BYTES_PER_ELEMENT;
889 int lengthInBytes = length * _BYTES_PER_ELEMENT;
890 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
891 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
892 } else {
893 Arrays.copy(from, startFrom, this, start, length);
894 }
895 }
896
897 String toString() {
898 return Collections.collectionToString(this);
899 }
900
901 int bytesPerElement() {
902 return _BYTES_PER_ELEMENT;
903 }
904
905 int lengthInBytes() {
906 return _length() * _BYTES_PER_ELEMENT;
907 }
908
909 static final int _BYTES_PER_ELEMENT = 8;
910
911 static _Float64Array _new(int length) native "Float64Array_new";
912
913 int _getIndexed(int index) native "Float64Array_getIndexed";
914
915 void _setIndexed(int index, double value) native "Float64Array_setIndexed";
916 }
917
918
919 class _ExternalInt8Array extends _ByteArrayBase implements Int8Array {
920 int operator[](int index) {
921 return _getIndexed(index);
922 }
923
924 int operator[]=(int index, int value) {
925 _setIndexed(index, _toInt8(value));
926 }
927
928 Iterator<int> iterator() {
929 return new _ByteArrayIterator<int>(this);
930 }
931
932 _Int8Array getRange(int start, int length) {
933 _rangeCheck(this, start, length);
934 _Int8Array result = new Int8Array(length);
935 result.setRange(0, length, this, start);
936 return result;
937 }
938
939 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
940 if (from is _ExternalInt8Array) {
941 int startInBytes = start * _BYTES_PER_ELEMENT;
942 int lengthInBytes = length * _BYTES_PER_ELEMENT;
943 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
944 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
945 } else {
946 Arrays.copy(from, startFrom, this, start, length);
947 }
948 }
949
950 String toString() {
951 return Collections.collectionToString(this);
952 }
953
954 int bytesPerElement() {
955 return _BYTES_PER_ELEMENT;
956 }
957
958 int lengthInBytes() {
959 return _length() * _BYTES_PER_ELEMENT;
960 }
961
962 static final int _BYTES_PER_ELEMENT = 1;
963
964 int _getIndexed(int index) native "ExternalInt8Array_getIndexed";
965
966 void _setIndexed(int index, int value) native "ExternalInt8Array_setIndexed";
967 }
968
969
970 class _ExternalUint8Array extends _ByteArrayBase implements Uint8Array {
971 int operator[](int index) {
972 return _getIndexed(index);
973 }
974
975 int operator[]=(int index, int value) {
976 _setIndexed(index, _toUint8(value));
977 }
978
979 Iterator<int> iterator() {
980 return new _ByteArrayIterator<int>(this);
981 }
982
983 _Uint8Array getRange(int start, int length) {
984 _rangeCheck(this, start, length);
985 _Uint8Array result = new Uint8Array(length);
986 result.setRange(0, length, this, start);
987 return result;
988 }
989
990 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
991 if (from is _ExternalUint8Array) {
992 int startInBytes = start * _BYTES_PER_ELEMENT;
993 int lengthInBytes = length * _BYTES_PER_ELEMENT;
994 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
995 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
996 } else {
997 Arrays.copy(from, startFrom, this, start, length);
998 }
999 }
1000
1001 String toString() {
1002 return Collections.collectionToString(this);
1003 }
1004
1005 int bytesPerElement() {
1006 return _BYTES_PER_ELEMENT;
1007 }
1008
1009 int lengthInBytes() {
1010 return _length() * _BYTES_PER_ELEMENT;
1011 }
1012
1013 static final int _BYTES_PER_ELEMENT = 1;
1014
1015 int _getIndexed(int index) native "ExternalUint8Array_getIndexed";
1016
1017 void _setIndexed(int index, int value) native "ExternalUint8Array_setIndexed";
1018 }
1019
1020
1021 class _ExternalInt16Array extends _ByteArrayBase implements Int16Array {
1022 int operator[](int index) {
1023 return _getIndexed(index);
1024 }
1025
1026 int operator[]=(int index, int value) {
1027 _setIndexed(index, _toInt16(value));
1028 }
1029
1030 Iterator<int> iterator() {
1031 return new _ByteArrayIterator<int>(this);
1032 }
1033
1034 _Int16Array getRange(int start, int length) {
1035 _rangeCheck(this, start, length);
1036 _Int16Array result = new Int16Array(length);
1037 result.setRange(0, length, this, start);
1038 return result;
1039 }
1040
1041 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1042 if (from is _ExternalInt16Array) {
1043 int startInBytes = start * _BYTES_PER_ELEMENT;
1044 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1045 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1046 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1047 } else {
1048 Arrays.copy(from, startFrom, this, start, length);
1049 }
1050 }
1051
1052 String toString() {
1053 return Collections.collectionToString(this);
1054 }
1055
1056 int bytesPerElement() {
1057 return _BYTES_PER_ELEMENT;
1058 }
1059
1060 int lengthInBytes() {
1061 return _length() * _BYTES_PER_ELEMENT;
1062 }
1063
1064 static final int _BYTES_PER_ELEMENT = 2;
1065
1066 int _getIndexed(int index) native "ExternalInt16Array_getIndexed";
1067
1068 void _setIndexed(int index, int value) native "ExternalInt16Array_setIndexed";
1069 }
1070
1071
1072 class _ExternalUint16Array extends _ByteArrayBase implements Uint16Array {
1073 int operator[](int index) {
1074 return _getIndexed(index);
1075 }
1076
1077 int operator[]=(int index, int value) {
1078 _setIndexed(index, _toUint16(value));
1079 }
1080
1081 Iterator<int> iterator() {
1082 return new _ByteArrayIterator<int>(this);
1083 }
1084
1085 _Uint16Array getRange(int start, int length) {
1086 _rangeCheck(this, start, length);
1087 _Uint16Array result = new Uint16Array(length);
1088 result.setRange(0, length, this, start);
1089 return result;
1090 }
1091
1092 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1093 if (from is _ExternalUint16Array) {
1094 int startInBytes = start * _BYTES_PER_ELEMENT;
1095 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1096 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1097 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1098 } else {
1099 Arrays.copy(from, startFrom, this, start, length);
1100 }
1101 }
1102
1103 String toString() {
1104 return Collections.collectionToString(this);
1105 }
1106
1107 int bytesPerElement() {
1108 return _BYTES_PER_ELEMENT;
1109 }
1110
1111 int lengthInBytes() {
1112 return _length() * _BYTES_PER_ELEMENT;
1113 }
1114
1115 static final int _BYTES_PER_ELEMENT = 2;
1116
1117 int _getIndexed(int index) native "ExternalUint16Array_getIndexed";
1118
1119 void _setIndexed(int index, int value)
1120 native "ExternalUint16Array_setIndexed";
1121 }
1122
1123
1124 class _ExternalInt32Array extends _ByteArrayBase implements Int32Array {
1125 int operator[](int index) {
1126 return _getIndexed(index);
1127 }
1128
1129 int operator[]=(int index, int value) {
1130 _setIndexed(index, _toInt32(value));
1131 }
1132
1133 Iterator<int> iterator() {
1134 return new _ByteArrayIterator<int>(this);
1135 }
1136
1137 _Int32Array getRange(int start, int length) {
1138 _rangeCheck(this, start, length);
1139 _Int32Array result = new Int32Array(length);
1140 result.setRange(0, length, this, start);
1141 return result;
1142 }
1143
1144 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1145 if (from is _ExternalInt32Array) {
1146 int startInBytes = start * _BYTES_PER_ELEMENT;
1147 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1148 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1149 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1150 } else {
1151 Arrays.copy(from, startFrom, this, start, length);
1152 }
1153 }
1154
1155 String toString() {
1156 return Collections.collectionToString(this);
1157 }
1158
1159 int bytesPerElement() {
1160 return _BYTES_PER_ELEMENT;
1161 }
1162
1163 int lengthInBytes() {
1164 return _length() * _BYTES_PER_ELEMENT;
1165 }
1166
1167 static final int _BYTES_PER_ELEMENT = 4;
1168
1169 int _getIndexed(int index) native "ExternalInt32Array_getIndexed";
1170
1171 void _setIndexed(int index, int value) native "ExternalInt32Array_setIndexed";
1172 }
1173
1174
1175 class _ExternalUint32Array extends _ByteArrayBase implements Uint32Array {
1176 int operator[](int index) {
1177 return _getIndexed(index);
1178 }
1179
1180 int operator[]=(int index, int value) {
1181 _setIndexed(index, _toUint32(value));
1182 }
1183
1184 Iterator<int> iterator() {
1185 return new _ByteArrayIterator<int>(this);
1186 }
1187
1188 _Uint32Array getRange(int start, int length) {
1189 _rangeCheck(this, start, length);
1190 _Uint32Array result = new Uint32Array(length);
1191 result.setRange(0, length, this, start);
1192 return result;
1193 }
1194
1195 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1196 if (from is _ExternalUint32Array) {
1197 int startInBytes = start * _BYTES_PER_ELEMENT;
1198 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1199 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1200 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1201 } else {
1202 Arrays.copy(from, startFrom, this, start, length);
1203 }
1204 }
1205
1206 String toString() {
1207 return Collections.collectionToString(this);
1208 }
1209
1210 int bytesPerElement() {
1211 return _BYTES_PER_ELEMENT;
1212 }
1213
1214 int lengthInBytes() {
1215 return _length() * _BYTES_PER_ELEMENT;
1216 }
1217
1218 static final int _BYTES_PER_ELEMENT = 4;
1219
1220 int _getIndexed(int index) native "ExternalUint32Array_getIndexed";
1221
1222 void _setIndexed(int index, int value)
1223 native "ExternalUint32Array_setIndexed";
1224 }
1225
1226
1227 class _ExternalInt64Array extends _ByteArrayBase implements Int64Array {
1228 int operator[](int index) {
1229 return _getIndexed(index);
1230 }
1231
1232 int operator[]=(int index, int value) {
1233 _setIndexed(index, _toInt64(value));
1234 }
1235
1236 Iterator<int> iterator() {
1237 return new _ByteArrayIterator<int>(this);
1238 }
1239
1240 _Int64Array getRange(int start, int length) {
1241 _rangeCheck(this, start, length);
1242 _Int64Array result = new Int64Array(length);
1243 result.setRange(0, length, this, start);
1244 return result;
1245 }
1246
1247 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1248 if (from is _ExternalInt64Array) {
1249 int startInBytes = start * _BYTES_PER_ELEMENT;
1250 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1251 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1252 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1253 } else {
1254 Arrays.copy(from, startFrom, this, start, length);
1255 }
1256 }
1257
1258 String toString() {
1259 return Collections.collectionToString(this);
1260 }
1261
1262 int bytesPerElement() {
1263 return _BYTES_PER_ELEMENT;
1264 }
1265
1266 int lengthInBytes() {
1267 return _length() * _BYTES_PER_ELEMENT;
1268 }
1269
1270 static final int _BYTES_PER_ELEMENT = 8;
1271
1272 int _getIndexed(int index) native "ExternalInt64Array_getIndexed";
1273
1274 void _setIndexed(int index, int value) native "ExternalInt64Array_setIndexed";
1275 }
1276
1277
1278 class _ExternalUint64Array extends _ByteArrayBase implements Uint64Array {
1279 int operator[](int index) {
1280 return _getIndexed(index);
1281 }
1282
1283 int operator[]=(int index, int value) {
1284 _setIndexed(index, _toUint64(value));
1285 }
1286
1287 Iterator<int> iterator() {
1288 return new _ByteArrayIterator<int>(this);
1289 }
1290
1291 _Uint64Array getRange(int start, int length) {
1292 _rangeCheck(this, start, length);
1293 _Uint64Array result = new Uint64Array(length);
1294 result.setRange(0, length, this, start);
1295 return result;
1296 }
1297
1298 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1299 if (from is _ExternalUint64Array) {
1300 int startInBytes = start * _BYTES_PER_ELEMENT;
1301 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1302 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1303 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1304 } else {
1305 Arrays.copy(from, startFrom, this, start, length);
1306 }
1307 }
1308
1309 String toString() {
1310 return Collections.collectionToString(this);
1311 }
1312
1313 int bytesPerElement() {
1314 return _BYTES_PER_ELEMENT;
1315 }
1316
1317 int lengthInBytes() {
1318 return _length() * _BYTES_PER_ELEMENT;
1319 }
1320
1321 static final int _BYTES_PER_ELEMENT = 8;
1322
1323 int _getIndexed(int index) native "ExternalUint64Array_getIndexed";
1324
1325 void _setIndexed(int index, int value)
1326 native "ExternalUint64Array_setIndexed";
1327 }
1328
1329
1330 class _ExternalFloat32Array extends _ByteArrayBase implements Float32Array {
1331 int operator[](int index) {
1332 return _getIndexed(index);
1333 }
1334
1335 int operator[]=(int index, double value) {
1336 _setIndexed(index, value);
1337 }
1338
1339 Iterator<int> iterator() {
1340 return new _ByteArrayIterator<double>(this);
1341 }
1342
1343 _Float32Array getRange(int start, int length) {
1344 _rangeCheck(this, start, length);
1345 _Float32Array result = new Float32Array(length);
1346 result.setRange(0, length, this, start);
1347 return result;
1348 }
1349
1350 void setRange(int start, int length, List<double> from, [int startFrom = 0]) {
1351 if (from is _ExternalFloat32Array) {
1352 int startInBytes = start * _BYTES_PER_ELEMENT;
1353 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1354 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1355 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1356 } else {
1357 Arrays.copy(from, startFrom, this, start, length);
1358 }
1359 }
1360
1361 String toString() {
1362 return Collections.collectionToString(this);
1363 }
1364
1365 int bytesPerElement() {
1366 return _BYTES_PER_ELEMENT;
1367 }
1368
1369 int lengthInBytes() {
1370 return _length() * _BYTES_PER_ELEMENT;
1371 }
1372
1373 static final int _BYTES_PER_ELEMENT = 4;
1374
1375 int _getIndexed(int index) native "ExternalFloat32Array_getIndexed";
1376
1377 void _setIndexed(int index, int value)
1378 native "ExternalFloat32Array_setIndexed";
1379 }
1380
1381
1382 class _ExternalFloat64Array extends _ByteArrayBase implements Float64Array {
1383 int operator[](int index) {
1384 return _getIndexed(index);
1385 }
1386
1387 int operator[]=(int index, double value) {
1388 _setIndexed(index, value);
1389 }
1390
1391 Iterator<int> iterator() {
1392 return new _ByteArrayIterator<double>(this);
1393 }
1394
1395 _Float64Array getRange(int start, int length) {
1396 _rangeCheck(this, start, length);
1397 _Float64Array result = new Float64Array(length);
1398 result.setRange(0, length, this, start);
1399 return result;
1400 }
1401
1402 void setRange(int start, int length, List<double> from, [int startFrom = 0]) {
1403 if (from is _ExternalFloat64Array) {
1404 int startInBytes = start * _BYTES_PER_ELEMENT;
1405 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1406 int startFromInBytes = startFrom * _BYTES_PER_ELEMENT;
1407 _setRange(startInBytes, lengthInBytes, from, startFromInBytes);
1408 } else {
1409 Arrays.copy(from, startFrom, this, start, length);
1410 }
1411 }
1412
1413 String toString() {
1414 return Collections.collectionToString(this);
1415 }
1416
1417 int bytesPerElement() {
1418 return _BYTES_PER_ELEMENT;
1419 }
1420
1421 int lengthInBytes() {
1422 return _length() * _BYTES_PER_ELEMENT;
1423 }
1424
1425 static final int _BYTES_PER_ELEMENT = 8;
1426
1427 int _getIndexed(int index) native "ExternalFloat64Array_getIndexed";
1428
1429 void _setIndexed(int index, int value)
1430 native "ExternalFloat64Array_setIndexed";
1431 }
1432
1433
1434 class _ByteArrayIterator<E> implements Iterator<E> {
1435 _ByteArrayIterator(_ByteArrayBase array)
1436 : _array = array, _length = array.length, _pos = 0;
223 1437
224 bool hasNext() { 1438 bool hasNext() {
225 return _length > _pos; 1439 return _length > _pos;
226 } 1440 }
227 1441
228 int next() { 1442 E next() {
229 if (!hasNext()) { 1443 if (!hasNext()) {
230 throw const NoMoreElementsException(); 1444 throw const NoMoreElementsException();
231 } 1445 }
232 return _byteArray[_pos++]; 1446 return _array[_pos++];
233 } 1447 }
234 1448
235 final List _byteArray; 1449 final List<E> _array;
236 1450
237 final int _length; 1451 final int _length;
238 1452
239 int _pos; 1453 int _pos;
240 } 1454 }
241 1455
242 1456
243 class _InternalByteArray extends _ByteArrayBase implements ByteArray { 1457 class _ByteArrayView implements ByteArray {
244 factory _InternalByteArray(int length) { 1458 _ByteArrayView(this._array, this._offset, this._length) {
245 return _allocate(length); 1459 }
246 } 1460
247 1461 int lengthInBytes() {
248 // ByteArray interface 1462 return _length;
1463 }
1464
1465 ByteArray subByteArray([int start = 0, int length]) {
1466 if (length === null) {
1467 length = this.lengthInBytes();
1468 }
1469 _rangeCheck(start, length);
1470 return new _ByteArrayView(_array, _offset + start, length);
1471 }
249 1472
250 int getInt8(int byteOffset) { 1473 int getInt8(int byteOffset) {
251 return _getInt8(byteOffset); 1474 return _array._getInt8(_offset + byteOffset);
252 } 1475 }
253
254 void setInt8(int byteOffset, int value) { 1476 void setInt8(int byteOffset, int value) {
255 _setInt8(byteOffset, _toInt8(value)); 1477 _array._setInt8(_offset + byteOffset, value);
256 } 1478 }
257 1479
258 int getUint8(int byteOffset) { 1480 int getUint8(int byteOffset) {
259 return _getUint8(byteOffset); 1481 return _array._getUint8(_offset + byteOffset);
260 } 1482 }
261
262 void setUint8(int byteOffset, int value) { 1483 void setUint8(int byteOffset, int value) {
263 _setUint8(byteOffset, _toUint8(value)); 1484 _array._setUint8(_offset + byteOffset, value);
264 } 1485 }
265 1486
266 int getInt16(int byteOffset) { 1487 int getInt16(int byteOffset) {
267 return _getInt16(byteOffset); 1488 return _array._getInt16(_offset + byteOffset);
268 } 1489 }
269
270 void setInt16(int byteOffset, int value) { 1490 void setInt16(int byteOffset, int value) {
271 _setInt16(byteOffset, _toInt16(value)); 1491 _array._setInt16(_offset + byteOffset, value);
272 } 1492 }
273 1493
274 int getUint16(int byteOffset) { 1494 int getUint16(int byteOffset) {
275 return _getInt16(byteOffset); 1495 return _array._getUint16(_offset + byteOffset);
276 } 1496 }
277
278 void setUint16(int byteOffset, int value) { 1497 void setUint16(int byteOffset, int value) {
279 _setUint16(byteOffset, _toUint16(value)); 1498 _array._setUint16(_offset + byteOffset, value);
280 } 1499 }
281 1500
282 int getInt32(int byteOffset) { 1501 int getInt32(int byteOffset) {
283 return _getInt32(byteOffset); 1502 return _array._getInt32(_offset + byteOffset);
284 } 1503 }
285
286 void setInt32(int byteOffset, int value) { 1504 void setInt32(int byteOffset, int value) {
287 _setInt32(byteOffset, _toInt32(value)); 1505 _array._setInt32(_offset + byteOffset, value);
288 } 1506 }
289 1507
290 int getUint32(int byteOffset) { 1508 int getUint32(int byteOffset) {
291 return _getUint32(byteOffset); 1509 return _array._getUint32(_offset + byteOffset);
292 } 1510 }
293
294 void setUint32(int byteOffset, int value) { 1511 void setUint32(int byteOffset, int value) {
295 _setUint32(byteOffset, _toUint32(value)); 1512 _array._setUint32(_offset + byteOffset, value);
296 } 1513 }
297 1514
298 int getInt64(int byteOffset) { 1515 int getInt64(int byteOffset) {
299 return _getInt64(byteOffset); 1516 return _array._getInt64(_offset + byteOffset);
300 } 1517 }
301
302 void setInt64(int byteOffset, int value) { 1518 void setInt64(int byteOffset, int value) {
303 _setInt64(byteOffset, _toInt64(value)); 1519 _array._setInt64(_offset + byteOffset, value);
304 } 1520 }
305 1521
306 int getUint64(int byteOffset) { 1522 int getUint64(int byteOffset) {
307 return _getUint64(byteOffset); 1523 return _array._getUint64(_offset + byteOffset);
308 } 1524 }
309
310 void setUint64(int byteOffset, int value) { 1525 void setUint64(int byteOffset, int value) {
311 _setUint64(byteOffset, _toUint64(value)); 1526 _array._setUint64(_offset + byteOffset, value);
312 } 1527 }
313 1528
314 double getFloat32(int byteOffset) { 1529 double getFloat32(int byteOffset) {
315 return _getFloat32(byteOffset); 1530 return _array._getFloat32(_offset + byteOffset);
316 } 1531 }
317
318 void setFloat32(int byteOffset, double value) { 1532 void setFloat32(int byteOffset, double value) {
319 _setFloat32(byteOffset, value); 1533 _array._setFloat32(_offset + byteOffset, value);
320 } 1534 }
321 1535
322 double getFloat64(int byteOffset) { 1536 double getFloat64(int byteOffset) {
323 return _getFloat64(byteOffset); 1537 return _array._getFloat64(_offset + byteOffset);
324 } 1538 }
325
326 void setFloat64(int byteOffset, double value) { 1539 void setFloat64(int byteOffset, double value) {
327 _setFloat64(byteOffset, value); 1540 _array._setFloat64(_offset + byteOffset, value);
328 } 1541 }
329 1542
330 // Implementation 1543 final _ByteArrayBase _array;
331 1544 final int _offset;
332 static _InternalByteArray _allocate(int length) 1545 final int _length;
333 native "InternalByteArray_allocate"; 1546 }
334 1547
335 int _getInt8(int byteOffset) 1548
336 native "InternalByteArray_getInt8"; 1549 class _ByteArrayViewBase {
337 1550 void add(value) {
338 void _setInt8(int byteOffset, int value) 1551 throw const UnsupportedOperationException(
339 native "InternalByteArray_setInt8"; 1552 "Cannot add to a non-extendable array");
340 1553 }
341 int _getUint8(int byteOffset) 1554
342 native "InternalByteArray_getUint8"; 1555 void addLast(value) {
343 1556 throw const UnsupportedOperationException(
344 void _setUint8(int byteOffset, int value) 1557 "Cannot add to a non-extendable array");
345 native "InternalByteArray_setUint8"; 1558 }
346 1559
347 int _getInt16(int byteOffset) 1560 void addAll(Collection value) {
348 native "InternalByteArray_getInt16"; 1561 throw const UnsupportedOperationException(
349 1562 "Cannot add to a non-extendable array");
350 void _setInt16(int byteOffset, int value) 1563 }
351 native "InternalByteArray_setInt16"; 1564
352 1565 void clear() {
353 int _getUint16(int byteOffset) 1566 throw const UnsupportedOperationException(
354 native "InternalByteArray_getUint16"; 1567 "Cannot remove from a non-extendable array");
355 1568 }
356 void _setUint16(int byteOffset, int value) 1569
357 native "InternalByteArray_setUint16"; 1570 void insertRange(int start, int length, [initialValue]) {
358 1571 throw const UnsupportedOperationException(
359 int _getInt32(int byteOffset) 1572 "Cannot add to a non-extendable array");
360 native "InternalByteArray_getInt32"; 1573 }
361 1574
362 void _setInt32(int byteOffset, int value) 1575 set length(int newLength) {
363 native "InternalByteArray_setInt32"; 1576 throw const UnsupportedOperationException(
364 1577 "Cannot resize a non-extendable array");
365 int _getUint32(int byteOffset) 1578 }
366 native "InternalByteArray_getUint32"; 1579
367 1580 int removeLast() {
368 void _setUint32(int byteOffset, int value) 1581 throw const UnsupportedOperationException(
369 native "InternalByteArray_setUint32"; 1582 "Cannot remove from a non-extendable array");
370 1583 }
371 int _getInt64(int byteOffset) 1584
372 native "InternalByteArray_getInt64"; 1585 void removeRange(int start, int length) {
373 1586 throw const UnsupportedOperationException(
374 void _setInt64(int byteOffset, int value) 1587 "Cannot remove from a non-extendable array");
375 native "InternalByteArray_setInt64"; 1588 }
376 1589 }
377 int _getUint64(int byteOffset) 1590
378 native "InternalByteArray_getUint64"; 1591
379 1592 class _Int8ArrayView extends _ByteArrayViewBase implements Int8Array {
380 void _setUint64(int byteOffset, int value) 1593 _Int8ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
381 native "InternalByteArray_setUint64"; 1594 : _array = array,
382 1595 _offset = offsetInBytes,
383 double _getFloat32(int byteOffset) 1596 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
384 native "InternalByteArray_getFloat32"; 1597 : length {
385 1598 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
386 void _setFloat32(int byteOffset, double value) 1599 throw new IndexOutOfRangeException(offsetInBytes);
387 native "InternalByteArray_setFloat32"; 1600 }
388 1601 int lengthInBytes = length * _BYTES_PER_ELEMENT;
389 double _getFloat64(int byteOffset) 1602 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
390 native "InternalByteArray_getFloat64"; 1603 throw new IndexOutOfRangeException(length);
391 1604 }
392 void _setFloat64(int byteOffset, double value) 1605 }
393 native "InternalByteArray_setFloat64"; 1606
394 } 1607 get length() {
395 1608 return _length;
396 1609 }
397 class _ExternalByteArray extends _ByteArrayBase implements ByteArray { 1610
398 // Collection interface 1611 int operator[](int index) {
399 1612 if (index < 0 || index >= _length) {
400 int get length() { 1613 throw new IndexOutOfRangeException(index);
401 return _length(); 1614 }
402 } 1615 return _array.getInt8(_offset + (index * _BYTES_PER_ELEMENT));
403
404 // List interface
405
406 int operator[](int index) {
407 return _getUint8(index);
408 } 1616 }
409 1617
410 void operator[]=(int index, int value) { 1618 void operator[]=(int index, int value) {
411 _setUint8(index, value); 1619 if (index < 0 || index >= _length) {
412 } 1620 throw new IndexOutOfRangeException(index);
413 1621 }
414 // ByteArray interface 1622 _array.setInt8(_offset + (index * _BYTES_PER_ELEMENT), _toInt8(value));
415 1623 }
416 int getInt8(int byteOffset) { 1624
417 return _getInt8(byteOffset); 1625 Iterator<int> iterator() {
418 } 1626 return new _ByteArrayIterator<int>(this);
419 1627 }
420 void setInt8(int byteOffset, int value) { 1628
421 _setInt8(byteOffset, _toInt8(value)); 1629 List<int> getRange(int start, int length) {
422 } 1630 _rangeCheck(this, start, length);
423 1631 Int8Array result = new Int8Array(length);
424 int getUint8(int byteOffset) { 1632 result.setRange(0, length, this, start);
425 return _getUint8(byteOffset); 1633 return result;
426 } 1634 }
427 1635
428 void setUint8(int byteOffset, int value) { 1636 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
429 _setUint8(byteOffset, _toUint8(value)); 1637 Arrays.copy(from, startFrom, this, start, length);
430 } 1638 }
431 1639
432 int getInt16(int byteOffset) { 1640 String toString() {
433 return _getInt16(byteOffset); 1641 return Collections.collectionToString(this);
434 } 1642 }
435 1643
436 void setInt16(int byteOffset, int value) { 1644 int bytesPerElement() {
437 _setInt16(byteOffset, _toInt16(value)); 1645 return _BYTES_PER_ELEMENT;
438 } 1646 }
439 1647
440 int getUint16(int byteOffset) { 1648 int lengthInBytes() {
441 return _getInt16(byteOffset); 1649 return _length * _BYTES_PER_ELEMENT;
442 } 1650 }
443 1651
444 void setUint16(int byteOffset, int value) { 1652 ByteArray asByteArray([int start = 0, int length]) {
445 _setUint16(byteOffset, _toUint16(value)); 1653 if (length == null) {
446 } 1654 length = this.lengthInBytes();
447 1655 }
448 int getInt32(int byteOffset) { 1656 _rangeCheck(start, length);
449 return _getInt32(byteOffset); 1657 return _array.subByteArray(_offset + start, length);
450 } 1658 }
451 1659
452 void setInt32(int byteOffset, int value) { 1660 static final int _BYTES_PER_ELEMENT = 1;
453 _setInt32(byteOffset, _toInt32(value)); 1661 final ByteArray _array;
454 } 1662 final int _offset;
455 1663 final int _length;
456 int getUint32(int byteOffset) { 1664 }
457 return _getUint32(byteOffset); 1665
458 } 1666
459 1667 class _Uint8ArrayView extends _ByteArrayViewBase implements Uint8Array {
460 void setUint32(int byteOffset, int value) { 1668 _Uint8ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
461 _setUint32(byteOffset, _toUint32(value)); 1669 : _array = array,
462 } 1670 _offset = offsetInBytes,
463 1671 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
464 int getInt64(int byteOffset) { 1672 : length {
465 return _getInt64(byteOffset); 1673 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
466 } 1674 throw new IndexOutOfRangeException(offsetInBytes);
467 1675 }
468 void setInt64(int byteOffset, int value) { 1676 int lengthInBytes = length * _BYTES_PER_ELEMENT;
469 _setInt64(byteOffset, _toInt64(value)); 1677 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
470 } 1678 throw new IndexOutOfRangeException(length);
471 1679 }
472 int getUint64(int byteOffset) { 1680 }
473 return _getUint64(byteOffset); 1681
474 } 1682 get length() {
475 1683 return _length;
476 void setUint64(int byteOffset, int value) { 1684 }
477 _setUint64(byteOffset, _toUint64(value)); 1685
478 } 1686 int operator[](int index) {
479 1687 if (index < 0 || index >= _length) {
480 double getFloat32(int byteOffset) { 1688 throw new IndexOutOfRangeException(index);
481 return _getFloat32(byteOffset); 1689 }
482 } 1690 return _array.getUint8(_offset + (index * _BYTES_PER_ELEMENT));
483 1691 }
484 void setFloat32(int byteOffset, double value) { 1692
485 _setFloat32(byteOffset, value); 1693 void operator[]=(int index, int value) {
486 } 1694 if (index < 0 || index >= _length) {
487 1695 throw new IndexOutOfRangeException(index);
488 double getFloat64(int byteOffset) { 1696 }
489 return _getFloat64(byteOffset); 1697 _array.setUint8(_offset + (index * _BYTES_PER_ELEMENT), _toUint8(value));
490 } 1698 }
491 1699
492 void setFloat64(int byteOffset, double value) { 1700 Iterator<int> iterator() {
493 _setFloat64(byteOffset, value); 1701 return new _ByteArrayIterator<int>(this);
494 } 1702 }
495 1703
496 // Implementation 1704 List<int> getRange(int start, int length) {
497 1705 _rangeCheck(this, start, length);
498 int _getInt8(int byteOffset) 1706 Uint8Array result = new Uint8Array(length);
499 native "ExternalByteArray_getInt8"; 1707 result.setRange(0, length, this, start);
500 1708 return result;
501 void _setInt8(int byteOffset, int value) 1709 }
502 native "ExternalByteArray_setInt8"; 1710
503 1711 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
504 int _getUint8(int byteOffset) 1712 Arrays.copy(from, startFrom, this, start, length);
505 native "ExternalByteArray_getUint8"; 1713 }
506 1714
507 void _setUint8(int byteOffset, int value) 1715 String toString() {
508 native "ExternalByteArray_setUint8"; 1716 return Collections.collectionToString(this);
509 1717 }
510 int _getInt16(int byteOffset) 1718
511 native "ExternalByteArray_getInt16"; 1719 int bytesPerElement() {
512 1720 return _BYTES_PER_ELEMENT;
513 void _setInt16(int byteOffset, int value) 1721 }
514 native "ExternalByteArray_setInt16"; 1722
515 1723 int lengthInBytes() {
516 int _getUint16(int byteOffset) 1724 return _length * _BYTES_PER_ELEMENT;
517 native "ExternalByteArray_getUint16"; 1725 }
518 1726
519 void _setUint16(int byteOffset, int value) 1727 ByteArray asByteArray([int start = 0, int length]) {
520 native "ExternalByteArray_setUint16"; 1728 if (length == null) {
521 1729 length = this.lengthInBytes();
522 int _getInt32(int byteOffset) 1730 }
523 native "ExternalByteArray_getInt32"; 1731 _rangeCheck(start, length);
524 1732 return _array.subByteArray(_offset + start, length);
525 void _setInt32(int byteOffset, int value) 1733 }
526 native "ExternalByteArray_setInt32"; 1734
527 1735 static final int _BYTES_PER_ELEMENT = 1;
528 int _getUint32(int byteOffset) 1736 final ByteArray _array;
529 native "ExternalByteArray_getUint32"; 1737 final int _offset;
530 1738 final int _length;
531 void _setUint32(int byteOffset, int value) 1739 }
532 native "ExternalByteArray_setUint32"; 1740
533 1741
534 int _getInt64(int byteOffset) 1742 class _Int16ArrayView extends _ByteArrayViewBase implements Int16Array {
535 native "ExternalByteArray_getInt64"; 1743 _Int16ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
536 1744 : _array = array,
537 void _setInt64(int byteOffset, int value) 1745 _offset = offsetInBytes,
538 native "ExternalByteArray_setInt64"; 1746 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
539 1747 : length {
540 int _getUint64(int byteOffset) 1748 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
541 native "ExternalByteArray_getUint64"; 1749 throw new IndexOutOfRangeException(offsetInBytes);
542 1750 }
543 void _setUint64(int byteOffset, int value) 1751 int lengthInBytes = length * _BYTES_PER_ELEMENT;
544 native "ExternalByteArray_setUint64"; 1752 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
545 1753 throw new IndexOutOfRangeException(length);
546 double _getFloat32(int byteOffset) 1754 }
547 native "ExternalByteArray_getFloat32"; 1755 }
548 1756
549 void _setFloat32(int byteOffset, double value) 1757 get length() {
550 native "ExternalByteArray_setFloat32"; 1758 return _length;
551 1759 }
552 double _getFloat64(int byteOffset) 1760
553 native "ExternalByteArray_getFloat64"; 1761 int operator[](int index) {
554 1762 if (index < 0 || index >= _length) {
555 void _setFloat64(int byteOffset, double value) 1763 throw new IndexOutOfRangeException(index);
556 native "ExternalByteArray_setFloat64"; 1764 }
557 } 1765 return _array.getInt16(_offset + (index * _BYTES_PER_ELEMENT));
1766 }
1767
1768 void operator[]=(int index, int value) {
1769 if (index < 0 || index >= _length) {
1770 throw new IndexOutOfRangeException(index);
1771 }
1772 _array.setInt16(_offset + (index * _BYTES_PER_ELEMENT), _toInt16(value));
1773 }
1774
1775 Iterator<int> iterator() {
1776 return new _ByteArrayIterator<int>(this);
1777 }
1778
1779 List<int> getRange(int start, int length) {
1780 _rangeCheck(this, start, length);
1781 Int16Array result = new Int16Array(length);
1782 result.setRange(0, length, this, start);
1783 return result;
1784 }
1785
1786 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1787 Arrays.copy(from, startFrom, this, start, length);
1788 }
1789
1790 String toString() {
1791 return Collections.collectionToString(this);
1792 }
1793
1794 int bytesPerElement() {
1795 return _BYTES_PER_ELEMENT;
1796 }
1797
1798 int lengthInBytes() {
1799 return _length * _BYTES_PER_ELEMENT;
1800 }
1801
1802 ByteArray asByteArray([int start = 0, int length]) {
1803 if (length == null) {
1804 length = this.lengthInBytes();
1805 }
1806 _rangeCheck(start, length);
1807 return _array.subByteArray(_offset + start, length);
1808 }
1809
1810 static final int _BYTES_PER_ELEMENT = 2;
1811 final ByteArray _array;
1812 final int _offset;
1813 final int _length;
1814 }
1815
1816
1817 class _Uint16ArrayView extends _ByteArrayViewBase implements Uint16Array {
1818 _Uint16ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
1819 : _array = array,
1820 _offset = offsetInBytes,
1821 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
1822 : length {
1823 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
1824 throw new IndexOutOfRangeException(offsetInBytes);
1825 }
1826 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1827 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
1828 throw new IndexOutOfRangeException(length);
1829 }
1830 }
1831
1832 get length() {
1833 return _length;
1834 }
1835
1836 int operator[](int index) {
1837 if (index < 0 || index >= _length) {
1838 throw new IndexOutOfRangeException(index);
1839 }
1840 return _array.getUint16(_offset + (index * _BYTES_PER_ELEMENT));
1841 }
1842
1843 void operator[]=(int index, int value) {
1844 if (index < 0 || index >= _length) {
1845 throw new IndexOutOfRangeException(index);
1846 }
1847 _array.setUint16(_offset + (index * _BYTES_PER_ELEMENT), _toUint16(value));
1848 }
1849
1850 Iterator<int> iterator() {
1851 return new _ByteArrayIterator<int>(this);
1852 }
1853
1854 List<int> getRange(int start, int length) {
1855 _rangeCheck(this, start, length);
1856 Uint16Array result = new Uint16Array(length);
1857 result.setRange(0, length, this, start);
1858 return result;
1859 }
1860
1861 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1862 Arrays.copy(from, startFrom, this, start, length);
1863 }
1864
1865 String toString() {
1866 return Collections.collectionToString(this);
1867 }
1868
1869 int bytesPerElement() {
1870 return _BYTES_PER_ELEMENT;
1871 }
1872
1873 int lengthInBytes() {
1874 return _length * _BYTES_PER_ELEMENT;
1875 }
1876
1877 ByteArray asByteArray([int start = 0, int length]) {
1878 if (length == null) {
1879 length = this.lengthInBytes();
1880 }
1881 _rangeCheck(start, length);
1882 return _array.subByteArray(_offset + start, length);
1883 }
1884
1885 static final int _BYTES_PER_ELEMENT = 2;
1886 final ByteArray _array;
1887 final int _offset;
1888 final int _length;
1889 }
1890
1891
1892 class _Int32ArrayView extends _ByteArrayViewBase implements Int32Array {
1893 _Int32ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
1894 : _array = array,
1895 _offset = offsetInBytes,
1896 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
1897 : length {
1898 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
1899 throw new IndexOutOfRangeException(offsetInBytes);
1900 }
1901 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1902 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
1903 throw new IndexOutOfRangeException(length);
1904 }
1905 }
1906
1907 get length() {
1908 return _length;
1909 }
1910
1911 int operator[](int index) {
1912 if (index < 0 || index >= _length) {
1913 throw new IndexOutOfRangeException(index);
1914 }
1915 return _array.getInt32(_offset + (index * _BYTES_PER_ELEMENT));
1916 }
1917
1918 void operator[]=(int index, int value) {
1919 if (index < 0 || index >= _length) {
1920 throw new IndexOutOfRangeException(index);
1921 }
1922 _array.setInt32(_offset + (index * _BYTES_PER_ELEMENT), _toInt32(value));
1923 }
1924
1925 Iterator<int> iterator() {
1926 return new _ByteArrayIterator<int>(this);
1927 }
1928
1929 List<int> getRange(int start, int length) {
1930 _rangeCheck(this, start, length);
1931 Int32Array result = new Int32Array(length);
1932 result.setRange(0, length, this, start);
1933 return result;
1934 }
1935
1936 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
1937 Arrays.copy(from, startFrom, this, start, length);
1938 }
1939
1940 String toString() {
1941 return Collections.collectionToString(this);
1942 }
1943
1944 int bytesPerElement() {
1945 return _BYTES_PER_ELEMENT;
1946 }
1947
1948 int lengthInBytes() {
1949 return _length * _BYTES_PER_ELEMENT;
1950 }
1951
1952 ByteArray asByteArray([int start = 0, int length]) {
1953 if (length == null) {
1954 length = this.lengthInBytes();
1955 }
1956 _rangeCheck(start, length);
1957 return _array.subByteArray(_offset + start, length);
1958 }
1959
1960 static final int _BYTES_PER_ELEMENT = 4;
1961 final ByteArray _array;
1962 final int _offset;
1963 final int _length;
1964 }
1965
1966
1967 class _Uint32ArrayView extends _ByteArrayViewBase implements Uint32Array {
1968 _Uint32ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
1969 : _array = array,
1970 _offset = offsetInBytes,
1971 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
1972 : length {
1973 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
1974 throw new IndexOutOfRangeException(offsetInBytes);
1975 }
1976 int lengthInBytes = length * _BYTES_PER_ELEMENT;
1977 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
1978 throw new IndexOutOfRangeException(length);
1979 }
1980 }
1981
1982 get length() {
1983 return _length;
1984 }
1985
1986 int operator[](int index) {
1987 if (index < 0 || index >= _length) {
1988 throw new IndexOutOfRangeException(index);
1989 }
1990 return _array.getUint32(_offset + (index * _BYTES_PER_ELEMENT));
1991 }
1992
1993 void operator[]=(int index, int value) {
1994 if (index < 0 || index >= _length) {
1995 throw new IndexOutOfRangeException(index);
1996 }
1997 _array.setUint32(_offset + (index * _BYTES_PER_ELEMENT), _toUint32(value));
1998 }
1999
2000 Iterator<int> iterator() {
2001 return new _ByteArrayIterator<int>(this);
2002 }
2003
2004 List<int> getRange(int start, int length) {
2005 _rangeCheck(this, start, length);
2006 Uint32Array result = new Uint32Array(length);
2007 result.setRange(0, length, this, start);
2008 return result;
2009 }
2010
2011 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
2012 Arrays.copy(from, startFrom, this, start, length);
2013 }
2014
2015 String toString() {
2016 return Collections.collectionToString(this);
2017 }
2018
2019 int bytesPerElement() {
2020 return _BYTES_PER_ELEMENT;
2021 }
2022
2023 int lengthInBytes() {
2024 return _length * _BYTES_PER_ELEMENT;
2025 }
2026
2027 ByteArray asByteArray([int start = 0, int length]) {
2028 if (length == null) {
2029 length = this.lengthInBytes();
2030 }
2031 _rangeCheck(start, length);
2032 return _array.subByteArray(_offset + start, length);
2033 }
2034
2035 static final int _BYTES_PER_ELEMENT = 4;
2036 final ByteArray _array;
2037 final int _offset;
2038 final int _length;
2039 }
2040
2041
2042 class _Int64ArrayView extends _ByteArrayViewBase implements Int64Array {
2043 _Int64ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
2044 : _array = array,
2045 _offset = offsetInBytes,
2046 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
2047 : length {
2048 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
2049 throw new IndexOutOfRangeException(offsetInBytes);
2050 }
2051 int lengthInBytes = length * _BYTES_PER_ELEMENT;
2052 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
2053 throw new IndexOutOfRangeException(length);
2054 }
2055 }
2056
2057 get length() {
2058 return _length;
2059 }
2060
2061 int operator[](int index) {
2062 if (index < 0 || index >= _length) {
2063 throw new IndexOutOfRangeException(index);
2064 }
2065 return _array.getInt64(_offset + (index * _BYTES_PER_ELEMENT));
2066 }
2067
2068 void operator[]=(int index, int value) {
2069 if (index < 0 || index >= _length) {
2070 throw new IndexOutOfRangeException(index);
2071 }
2072 _array.setInt64(_offset + (index * _BYTES_PER_ELEMENT), _toInt64(value));
2073 }
2074
2075 Iterator<int> iterator() {
2076 return new _ByteArrayIterator<int>(this);
2077 }
2078
2079 List<int> getRange(int start, int length) {
2080 _rangeCheck(this, start, length);
2081 Int64Array result = new Int64Array(length);
2082 result.setRange(0, length, this, start);
2083 return result;
2084 }
2085
2086 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
2087 Arrays.copy(from, startFrom, this, start, length);
2088 }
2089
2090 String toString() {
2091 return Collections.collectionToString(this);
2092 }
2093
2094 int bytesPerElement() {
2095 return _BYTES_PER_ELEMENT;
2096 }
2097
2098 int lengthInBytes() {
2099 return _length * _BYTES_PER_ELEMENT;
2100 }
2101
2102 ByteArray asByteArray([int start = 0, int length]) {
2103 if (length == null) {
2104 length = this.lengthInBytes();
2105 }
2106 _rangeCheck(start, length);
2107 return _array.subByteArray(_offset + start, length);
2108 }
2109
2110 static final int _BYTES_PER_ELEMENT = 8;
2111 final ByteArray _array;
2112 final int _offset;
2113 final int _length;
2114 }
2115
2116
2117 class _Uint64ArrayView extends _ByteArrayViewBase implements Uint64Array {
2118 _Uint64ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
2119 : _array = array,
2120 _offset = offsetInBytes,
2121 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
2122 : length {
2123 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
2124 throw new IndexOutOfRangeException(offsetInBytes);
2125 }
2126 int lengthInBytes = length * _BYTES_PER_ELEMENT;
2127 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
2128 throw new IndexOutOfRangeException(length);
2129 }
2130 }
2131
2132 get length() {
2133 return _length;
2134 }
2135
2136 int operator[](int index) {
2137 if (index < 0 || index >= _length) {
2138 throw new IndexOutOfRangeException(index);
2139 }
2140 return _array.getUint64(_offset + (index * _BYTES_PER_ELEMENT));
2141 }
2142
2143 void operator[]=(int index, int value) {
2144 if (index < 0 || index >= _length) {
2145 throw new IndexOutOfRangeException(index);
2146 }
2147 _array.setUint64(_offset + (index * _BYTES_PER_ELEMENT), _toUint64(value));
2148 }
2149
2150 Iterator<int> iterator() {
2151 return new _ByteArrayIterator<int>(this);
2152 }
2153
2154 List<int> getRange(int start, int length) {
2155 _rangeCheck(this, start, length);
2156 Uint64Array result = new Uint64Array(length);
2157 result.setRange(0, length, this, start);
2158 return result;
2159 }
2160
2161 void setRange(int start, int length, List<int> from, [int startFrom = 0]) {
2162 Arrays.copy(from, startFrom, this, start, length);
2163 }
2164
2165 String toString() {
2166 return Collections.collectionToString(this);
2167 }
2168
2169 int bytesPerElement() {
2170 return _BYTES_PER_ELEMENT;
2171 }
2172
2173 int lengthInBytes() {
2174 return _length * _BYTES_PER_ELEMENT;
2175 }
2176
2177 ByteArray asByteArray([int start = 0, int length]) {
2178 if (length == null) {
2179 length = this.lengthInBytes();
2180 }
2181 _rangeCheck(start, length);
2182 return _array.subByteArray(_offset + start, length);
2183 }
2184
2185 static final int _BYTES_PER_ELEMENT = 8;
2186 final ByteArray _array;
2187 final int _offset;
2188 final int _length;
2189 }
2190
2191
2192 class _Float32ArrayView extends _ByteArrayViewBase implements Float32Array {
2193 _Float32ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
2194 : _array = array,
2195 _offset = offsetInBytes,
2196 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
2197 : length {
2198 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
2199 throw new IndexOutOfRangeException(offsetInBytes);
2200 }
2201 int lengthInBytes = length * _BYTES_PER_ELEMENT;
2202 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
2203 throw new IndexOutOfRangeException(length);
2204 }
2205 }
2206
2207 get length() {
2208 return _length;
2209 }
2210
2211 double operator[](int index) {
2212 if (index < 0 || index >= _length) {
2213 throw new IndexOutOfRangeException(index);
2214 }
2215 return _array.getFloat32(_offset + (index * _BYTES_PER_ELEMENT));
2216 }
2217
2218 void operator[]=(int index, double value) {
2219 if (index < 0 || index >= _length) {
2220 throw new IndexOutOfRangeException(index);
2221 }
2222 _array.setFloat32(_offset + (index * _BYTES_PER_ELEMENT), value);
2223 }
2224
2225 Iterator<double> iterator() {
2226 return new _ByteArrayIterator<double>(this);
2227 }
2228
2229 List<double> getRange(int start, int length) {
2230 _rangeCheck(this, start, length);
2231 Float32Array result = new Float32Array(length);
2232 result.setRange(0, length, this, start);
2233 return result;
2234 }
2235
2236 void setRange(int start, int length, List<double> from, [int startFrom = 0]) {
2237 Arrays.copy(from, startFrom, this, start, length);
2238 }
2239
2240 String toString() {
2241 return Collections.collectionToString(this);
2242 }
2243
2244 int bytesPerElement() {
2245 return _BYTES_PER_ELEMENT;
2246 }
2247
2248 int lengthInBytes() {
2249 return _length * _BYTES_PER_ELEMENT;
2250 }
2251
2252 ByteArray asByteArray([int start = 0, int length]) {
2253 if (length == null) {
2254 length = this.lengthInBytes();
2255 }
2256 _rangeCheck(start, length);
2257 return _array.subByteArray(_offset + start, length);
2258 }
2259
2260 static final int _BYTES_PER_ELEMENT = 4;
2261 final ByteArray _array;
2262 final int _offset;
2263 final int _length;
2264 }
2265
2266
2267 class _Float64ArrayView extends _ByteArrayViewBase implements Float64Array {
2268 _Float64ArrayView(ByteArray array, [int offsetInBytes = 0, int length])
2269 : _array = array,
2270 _offset = offsetInBytes,
2271 _length = (length === null) ? (array.lengthInBytes() - offsetInBytes)
2272 : length {
2273 if (offsetInBytes < 0 || offsetInBytes >= array.lengthInBytes()) {
2274 throw new IndexOutOfRangeException(offsetInBytes);
2275 }
2276 int lengthInBytes = length * _BYTES_PER_ELEMENT;
2277 if (length < 0 || (lengthInBytes + _offset) > array.lengthInBytes()) {
2278 throw new IndexOutOfRangeException(length);
2279 }
2280 }
2281
2282 get length() {
2283 return _length;
2284 }
2285
2286 double operator[](int index) {
2287 if (index < 0 || index >= _length) {
2288 throw new IndexOutOfRangeException(index);
2289 }
2290 return _array.getFloat64(_offset + (index * _BYTES_PER_ELEMENT));
2291 }
2292
2293 void operator[]=(int index, double value) {
2294 if (index < 0 || index >= _length) {
2295 throw new IndexOutOfRangeException(index);
2296 }
2297 _array.setFloat64(_offset + (index * _BYTES_PER_ELEMENT), value);
2298 }
2299
2300 Iterator<double> iterator() {
2301 return new _ByteArrayIterator<double>(this);
2302 }
2303
2304 List<double> getRange(int start, int length) {
2305 _rangeCheck(this, start, length);
2306 Float64Array result = new Float64Array(length);
2307 result.setRange(0, length, this, start);
2308 return result;
2309 }
2310
2311 void setRange(int start, int length, List<double> from, [int startFrom = 0]) {
2312 Arrays.copy(from, startFrom, this, start, length);
2313 }
2314
2315 String toString() {
2316 return Collections.collectionToString(this);
2317 }
2318
2319 int bytesPerElement() {
2320 return _BYTES_PER_ELEMENT;
2321 }
2322
2323 int lengthInBytes() {
2324 return _length * _BYTES_PER_ELEMENT;
2325 }
2326
2327 ByteArray asByteArray([int start = 0, int length]) {
2328 if (length == null) {
2329 length = this.lengthInBytes();
2330 }
2331 _rangeCheck(start, length);
2332 return _array.subByteArray(_offset + start, length);
2333 }
2334
2335 static final int _BYTES_PER_ELEMENT = 8;
2336 final ByteArray _array;
2337 final int _offset;
2338 final int _length;
2339 }
OLDNEW
« no previous file with comments | « runtime/lib/byte_array.cc ('k') | runtime/tests/vm/dart/byte_array_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698