Index: runtime/lib/byte_array.dart |
diff --git a/runtime/lib/byte_array.dart b/runtime/lib/byte_array.dart |
index 61be89d704c817b3444a63fd50dfd7b2bddab733..f1358ce5f06b5014f9b8345c6fc1ec81ada6245c 100644 |
--- a/runtime/lib/byte_array.dart |
+++ b/runtime/lib/byte_array.dart |
@@ -196,8 +196,12 @@ abstract class _ByteArrayBase { |
} |
} |
- Collection map(f(element)) { |
- return Collections.map(this, new List(), f); |
+ List mappedBy(f(int element)) { |
+ return new MappedList<int, dynamic>(this, f); |
+ } |
+ |
+ String join([String separator]) { |
+ return Collections.join(this, separator); |
} |
dynamic reduce(dynamic initialValue, |
@@ -205,16 +209,48 @@ abstract class _ByteArrayBase { |
return Collections.reduce(this, initialValue, combine); |
} |
- Collection filter(bool f(element)) { |
- return Collections.filter(this, new List(), f); |
+ Collection where(bool f(element)) { |
+ return new WhereIterable<int>(this, f); |
+ } |
+ |
+ List<int> take(int n) { |
+ return new ListView<int>(this, 0, n); |
+ } |
+ |
+ Iterable<int> takeWhile(bool test(int value)) { |
+ return new TakeWhileIterable<int>(this, test); |
+ } |
+ |
+ List<int> skip(int n) { |
+ return new ListView<int>(this, n, null); |
+ } |
+ |
+ Iterable<int> skipWhile(bool test(int value)) { |
+ return new SkipWhileIterable<int>(this, test); |
} |
bool every(bool f(element)) { |
return Collections.every(this, f); |
} |
- bool some(bool f(element)) { |
- return Collections.some(this, f); |
+ bool any(bool f(element)) { |
+ return Collections.any(this, f); |
+ } |
+ |
+ int firstMatching(bool test(int value), {int orElse()}) { |
+ return Collections.firstMatching(this, test, orElse); |
+ } |
+ |
+ int lastMatching(bool test(int value), {int orElse()}) { |
+ return Collections.lastMatchingInList(this, test, orElse); |
+ } |
+ |
+ int singleMatching(bool test(int value)) { |
+ return Collections.singleMatching(this, test); |
+ } |
+ |
+ int elementAt(int index) { |
+ return this[index]; |
} |
bool get isEmpty { |
@@ -242,7 +278,7 @@ abstract class _ByteArrayBase { |
"Cannot add to a non-extendable array"); |
} |
- void addAll(Collection value) { |
+ void addAll(Iterable value) { |
throw new UnsupportedError( |
"Cannot add to a non-extendable array"); |
} |
@@ -271,14 +307,26 @@ abstract class _ByteArrayBase { |
"Cannot remove from a non-extendable array"); |
} |
- get first { |
- return this[0]; |
+ int get first { |
+ if (length > 0) return this[0]; |
+ throw new StateError("No elements"); |
+ } |
+ |
+ int get last { |
+ if (length > 0) return this[length - 1]; |
+ throw new StateError("No elements"); |
} |
- get last { |
- return this[length - 1]; |
+ int get single { |
+ if (length == 1) return this[0]; |
+ if (length == 0) throw new StateError("No elements"); |
+ throw new StateError("More than one element"); |
} |
+ int min([int compare(int a, int b)]) => Collections.min(this, compare); |
+ |
+ int max([int compare(int a, int b)]) => Collections.max(this, compare); |
+ |
void removeRange(int start, int length) { |
throw new UnsupportedError( |
"Cannot remove from a non-extendable array"); |
@@ -299,6 +347,14 @@ abstract class _ByteArrayBase { |
length * this.bytesPerElement()); |
} |
+ List<int> toList() { |
+ return new List<int>.from(this); |
+ } |
+ |
+ Set<int> toSet() { |
+ return new Set<int>.from(this); |
+ } |
+ |
int _length() native "ByteArray_getLength"; |
void _setRange(int startInBytes, int lengthInBytes, |
@@ -436,7 +492,7 @@ class _Int8Array extends _ByteArrayBase implements Int8List { |
_setIndexed(index, _toInt8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -505,7 +561,7 @@ class _Uint8Array extends _ByteArrayBase implements Uint8List { |
_setIndexed(index, _toUint8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -576,7 +632,7 @@ class _Uint8ClampedArray extends _ByteArrayBase implements Uint8ClampedList { |
_setIndexed(index, _toClampedUint8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -646,7 +702,7 @@ class _Int16Array extends _ByteArrayBase implements Int16List { |
_setIndexed(index, _toInt16(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -715,7 +771,7 @@ class _Uint16Array extends _ByteArrayBase implements Uint16List { |
_setIndexed(index, _toUint16(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -784,7 +840,7 @@ class _Int32Array extends _ByteArrayBase implements Int32List { |
_setIndexed(index, _toInt32(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -854,7 +910,7 @@ class _Uint32Array extends _ByteArrayBase implements Uint32List { |
_setIndexed(index, _toUint32(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -923,7 +979,7 @@ class _Int64Array extends _ByteArrayBase implements Int64List { |
_setIndexed(index, _toInt64(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -992,7 +1048,7 @@ class _Uint64Array extends _ByteArrayBase implements Uint64List { |
_setIndexed(index, _toUint64(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1061,7 +1117,7 @@ class _Float32Array extends _ByteArrayBase implements Float32List { |
_setIndexed(index, value); |
} |
- Iterator<double> iterator() { |
+ Iterator<double> get iterator { |
return new _ByteArrayIterator<double>(this); |
} |
@@ -1130,7 +1186,7 @@ class _Float64Array extends _ByteArrayBase implements Float64List { |
_setIndexed(index, value); |
} |
- Iterator<double> iterator() { |
+ Iterator<double> get iterator { |
return new _ByteArrayIterator<double>(this); |
} |
@@ -1184,7 +1240,7 @@ class _ExternalInt8Array extends _ByteArrayBase implements Int8List { |
_setIndexed(index, _toInt8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1234,7 +1290,7 @@ class _ExternalUint8Array extends _ByteArrayBase implements Uint8List { |
_setIndexed(index, _toUint8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1284,7 +1340,7 @@ class _ExternalInt16Array extends _ByteArrayBase implements Int16List { |
_setIndexed(index, _toInt16(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1334,7 +1390,7 @@ class _ExternalUint16Array extends _ByteArrayBase implements Uint16List { |
_setIndexed(index, _toUint16(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1386,7 +1442,7 @@ class _ExternalInt32Array extends _ByteArrayBase implements Int32List { |
_setIndexed(index, _toInt32(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1438,7 +1494,7 @@ class _ExternalUint32Array extends _ByteArrayBase implements Uint32List { |
_setIndexed(index, _toUint32(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1490,7 +1546,7 @@ class _ExternalInt64Array extends _ByteArrayBase implements Int64List { |
_setIndexed(index, _toInt64(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1542,7 +1598,7 @@ class _ExternalUint64Array extends _ByteArrayBase implements Uint64List { |
_setIndexed(index, _toUint64(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -1594,7 +1650,7 @@ class _ExternalFloat32Array extends _ByteArrayBase implements Float32List { |
_setIndexed(index, value); |
} |
- Iterator<double> iterator() { |
+ Iterator<double> get iterator { |
return new _ByteArrayIterator<double>(this); |
} |
@@ -1646,7 +1702,7 @@ class _ExternalFloat64Array extends _ByteArrayBase implements Float64List { |
_setIndexed(index, value); |
} |
- Iterator<double> iterator() { |
+ Iterator<double> get iterator { |
return new _ByteArrayIterator<double>(this); |
} |
@@ -1690,25 +1746,29 @@ class _ExternalFloat64Array extends _ByteArrayBase implements Float64List { |
class _ByteArrayIterator<E> implements Iterator<E> { |
+ final List<E> _array; |
+ final int _length; |
+ int _position; |
+ E _current; |
+ |
_ByteArrayIterator(List array) |
- : _array = array, _length = array.length, _pos = 0 { |
+ : _array = array, _length = array.length, _position = -1 { |
assert(array is _ByteArrayBase || array is _ByteArrayViewBase); |
} |
- bool get hasNext { |
- return _length > _pos; |
- } |
- |
- E next() { |
- if (!hasNext) { |
- throw new StateError("No more elements"); |
+ bool moveNext() { |
+ int nextPosition = _position + 1; |
+ if (nextPosition < _length) { |
+ _current = _array[nextPosition]; |
+ _position = nextPosition; |
+ return true; |
} |
- return _array[_pos++]; |
+ _position = _length; |
+ _current = null; |
+ return false; |
} |
- final List<E> _array; |
- final int _length; |
- int _pos; |
+ E get current => _current; |
} |
@@ -1807,7 +1867,10 @@ class _ByteArrayView implements ByteArray { |
} |
-class _ByteArrayViewBase { |
+// TODO(floitsch): extending the collection adds extra cost (because of type |
+// parameters). Consider copying the functions from Collection into this class |
+// and just implementing Collection<int>. |
+class _ByteArrayViewBase extends Collection<int> { |
num operator[](int index); |
// Methods implementing the Collection interface. |
@@ -1819,27 +1882,6 @@ class _ByteArrayViewBase { |
} |
} |
- Collection map(f(element)) { |
- return Collections.map(this, new List(), f); |
- } |
- |
- dynamic reduce(dynamic initialValue, |
- dynamic combine(dynamic initialValue, element)) { |
- return Collections.reduce(this, initialValue, combine); |
- } |
- |
- Collection filter(bool f(element)) { |
- return Collections.filter(this, new List(), f); |
- } |
- |
- bool every(bool f(element)) { |
- return Collections.every(this, f); |
- } |
- |
- bool some(bool f(element)) { |
- return Collections.some(this, f);; |
- } |
- |
bool get isEmpty { |
return this.length == 0; |
} |
@@ -1863,7 +1905,7 @@ class _ByteArrayViewBase { |
"Cannot add to a non-extendable array"); |
} |
- void addAll(Collection value) { |
+ void addAll(Iterable value) { |
throw new UnsupportedError( |
"Cannot add to a non-extendable array"); |
} |
@@ -1892,12 +1934,20 @@ class _ByteArrayViewBase { |
"Cannot remove from a non-extendable array"); |
} |
- get first { |
- return this[0]; |
+ int get first { |
+ if (length > 0) return this[0]; |
+ throw new StateError("No elements"); |
+ } |
+ |
+ int get last { |
+ if (length > 0) return this[length - 1]; |
+ throw new StateError("No elements"); |
} |
- get last { |
- return this[length - 1]; |
+ int get single { |
+ if (length == 1) return this[0]; |
+ if (length == 0) throw new StateError("No elements"); |
+ throw new StateError("More than one element"); |
} |
void removeRange(int start, int length) { |
@@ -1942,7 +1992,7 @@ class _Int8ArrayView extends _ByteArrayViewBase implements Int8List { |
_array.setInt8(_offset + (index * _BYTES_PER_ELEMENT), _toInt8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2014,7 +2064,7 @@ class _Uint8ArrayView extends _ByteArrayViewBase implements Uint8List { |
_array.setUint8(_offset + (index * _BYTES_PER_ELEMENT), _toUint8(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2086,7 +2136,7 @@ class _Int16ArrayView extends _ByteArrayViewBase implements Int16List { |
_array.setInt16(_offset + (index * _BYTES_PER_ELEMENT), _toInt16(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2158,7 +2208,7 @@ class _Uint16ArrayView extends _ByteArrayViewBase implements Uint16List { |
_array.setUint16(_offset + (index * _BYTES_PER_ELEMENT), _toUint16(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2230,7 +2280,7 @@ class _Int32ArrayView extends _ByteArrayViewBase implements Int32List { |
_array.setInt32(_offset + (index * _BYTES_PER_ELEMENT), _toInt32(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2302,7 +2352,7 @@ class _Uint32ArrayView extends _ByteArrayViewBase implements Uint32List { |
_array.setUint32(_offset + (index * _BYTES_PER_ELEMENT), _toUint32(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2374,7 +2424,7 @@ class _Int64ArrayView extends _ByteArrayViewBase implements Int64List { |
_array.setInt64(_offset + (index * _BYTES_PER_ELEMENT), _toInt64(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2446,7 +2496,7 @@ class _Uint64ArrayView extends _ByteArrayViewBase implements Uint64List { |
_array.setUint64(_offset + (index * _BYTES_PER_ELEMENT), _toUint64(value)); |
} |
- Iterator<int> iterator() { |
+ Iterator<int> get iterator { |
return new _ByteArrayIterator<int>(this); |
} |
@@ -2518,7 +2568,7 @@ class _Float32ArrayView extends _ByteArrayViewBase implements Float32List { |
_array.setFloat32(_offset + (index * _BYTES_PER_ELEMENT), value); |
} |
- Iterator<double> iterator() { |
+ Iterator<double> get iterator { |
return new _ByteArrayIterator<double>(this); |
} |
@@ -2590,7 +2640,7 @@ class _Float64ArrayView extends _ByteArrayViewBase implements Float64List { |
_array.setFloat64(_offset + (index * _BYTES_PER_ELEMENT), value); |
} |
- Iterator<double> iterator() { |
+ Iterator<double> get iterator { |
return new _ByteArrayIterator<double>(this); |
} |