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

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

Powered by Google App Engine
This is Rietveld 408576698