OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 // Utilities used by the node library. |
| 6 |
| 7 #library('nodeimpl'); |
| 8 |
| 9 // Helpers for read-only collections of native objects |
| 10 |
| 11 // Takes a JavaScript object, returns a dart object |
| 12 // Used to wrap list elements and map values |
| 13 |
| 14 typedef var NativeValueWrapper(var v); |
| 15 |
| 16 class NativeListBase<E> implements List<E>{ |
| 17 var _list; |
| 18 NativeListBase(this._list); |
| 19 int get length() => _length(_list); |
| 20 int _length(var list) native "return list.length;"; |
| 21 abstract E operator[](int index); |
| 22 |
| 23 bool isEmpty() => length == 0; |
| 24 |
| 25 void forEach(void f(E e)) { |
| 26 int len = length; |
| 27 for (int i = 0; i < len; i++) { |
| 28 f(this[i]); |
| 29 } |
| 30 } |
| 31 } |
| 32 |
| 33 class NativeList<E> extends NativeListBase<E> { |
| 34 NativeValueWrapper _ctor; |
| 35 NativeList(var list, this._ctor) : super(list); |
| 36 E operator[](int index) => _ctor(_at(_list, index)); |
| 37 var _at(var list, int index) native "return list[index];"; |
| 38 } |
| 39 |
| 40 class NativeListPrimitiveElement<E> extends NativeListBase<E> { |
| 41 NativeListPrimitiveElement(var list) : super(list); |
| 42 E operator[](int index) => _at(_list, index); |
| 43 E _at(var list, int index) native "return list[index];"; |
| 44 } |
| 45 |
| 46 class NativeMapBase<V> implements Map<String, V> { |
| 47 var _map; |
| 48 NativeMapBase(this._map); |
| 49 int get length() => _length(_map); |
| 50 int _length(var map) native "return map.length;"; |
| 51 |
| 52 bool isEmpty() => length == 0; |
| 53 |
| 54 abstract V operator[](String key); |
| 55 |
| 56 Collection<String> getKeys() { |
| 57 List<String> keys = new List<String>(); |
| 58 _forEachKey(_map, (String key) => keys.add(key)); |
| 59 return keys; |
| 60 } |
| 61 |
| 62 Collection<V> getValues() { |
| 63 List<V> values = new List<V>(); |
| 64 _forEachKey(_map, (String key) => values.add(this[key])); |
| 65 return values; |
| 66 } |
| 67 |
| 68 void forEach(void f(String key, V value)) => |
| 69 _forEachKey(_map, (String k) => f(k, this[k])); |
| 70 |
| 71 void _forEachKey(var map, void f(String key)) |
| 72 native """ |
| 73 for (var i in map) { |
| 74 if (map.hasOwnProperty(i)) { |
| 75 f(i); |
| 76 } |
| 77 } |
| 78 """; |
| 79 } |
| 80 |
| 81 class NativeMap<V> extends NativeMapBase<V> { |
| 82 NativeValueWrapper _ctor; |
| 83 NativeMap(var map, this._ctor) : super(map); |
| 84 V operator[](String key) => _ctor(_at(_map, key)); |
| 85 var _at(var map, String key) native "return map[key];"; |
| 86 } |
| 87 |
| 88 class NativeMapPrimitiveValue<V> extends NativeMapBase<V> { |
| 89 NativeMapPrimitiveValue(map) : super(map); |
| 90 V operator[](String key) => _at(_map, key); |
| 91 var _at(var map, String key) native "return map[key];"; |
| 92 } |
| 93 |
| 94 String NativeGetStringProperty(var object, String key) |
| 95 native "var v = object[key];return v == undefined ? null : v;"; |
| 96 |
| 97 bool NativeGetBoolProperty(var object, String key) |
| 98 native "var v = object[key];return v == undefined ? null : v;"; |
| 99 |
| 100 int NativeGetIntProperty(var object, String key) |
| 101 native "var v = object[key];return v == undefined ? null : v;"; |
| 102 |
| 103 double NativeGetDoubleProperty(var object, String key) |
| 104 native "var v = object[key];return v == undefined ? null : v;"; |
| 105 |
| 106 |
| 107 // Fixed size List utilities |
| 108 |
| 109 class FixedLists { |
| 110 static void getRangeCheck(int srcLength, int start, int length) { |
| 111 if (length < 0) { |
| 112 throw new IllegalArgumentException(); |
| 113 } |
| 114 int end = start + length; |
| 115 if (start < 0 || start >= srcLength) { |
| 116 throw new IndexOutOfRangeException(start); |
| 117 } |
| 118 if (end < 0 || end > srcLength) { |
| 119 throw new IndexOutOfRangeException(end); |
| 120 } |
| 121 } |
| 122 |
| 123 static int indexOf(List list, var element, int start) { |
| 124 if (start == null) { |
| 125 start = 0; |
| 126 } |
| 127 int end = list.length; |
| 128 for (int i = start; i < end; i++) { |
| 129 if (list[i] == element) { |
| 130 return i; |
| 131 } |
| 132 } |
| 133 return -1; |
| 134 } |
| 135 |
| 136 static int lastIndexOf(List list, var element, int start) { |
| 137 int end = start == null ? list.length : start; |
| 138 for (int i = end-1; i >= 0; i--) { |
| 139 if (list[i] == element) { |
| 140 return i; |
| 141 } |
| 142 } |
| 143 return -1; |
| 144 } |
| 145 |
| 146 static num last(List list) { |
| 147 int end = list.length; |
| 148 if (end <= 0) { |
| 149 throw new IndexOutOfRangeException(0); |
| 150 } |
| 151 return list[end-1]; |
| 152 } |
| 153 |
| 154 static void forEach(List list, void f(var element)) { |
| 155 int len = list.length; |
| 156 for (int i = 0; i < len; i++) { |
| 157 f(list[i]); |
| 158 } |
| 159 } |
| 160 |
| 161 static Collection filter(List list, bool f(element), List ctor(int length)) { |
| 162 // Assume computation is more expensive than allocation, so use a |
| 163 // temporary growable list to store the filtered results. |
| 164 // (The alternative would be to make two passes through the list.) |
| 165 List filtered = []; |
| 166 int len = list.length; |
| 167 for (int i = 0; i < len; i++) { |
| 168 var e = list[i]; |
| 169 if (f(e)) { |
| 170 filtered.add(e); |
| 171 } |
| 172 } |
| 173 int filteredLength = filtered.length; |
| 174 List result = ctor(filteredLength); |
| 175 for (int i = 0; i < len; i++) { |
| 176 result[i] = filtered[i]; |
| 177 } |
| 178 return result; |
| 179 } |
| 180 |
| 181 static bool every(List list, bool f(int element)) { |
| 182 int len = list.length; |
| 183 for (int i = 0; i < len; i++) { |
| 184 if (! f(list[i])) { |
| 185 return false; |
| 186 } |
| 187 } |
| 188 return true; |
| 189 } |
| 190 |
| 191 static Collection map(List list, f(element), List result) { |
| 192 int len = list.length; |
| 193 for (int i = 0; i < len; i++) { |
| 194 result[i] = f(list[i]); |
| 195 } |
| 196 return result; |
| 197 } |
| 198 |
| 199 |
| 200 static bool some(List list, bool f(num element)) { |
| 201 int len = list.length; |
| 202 for (int i = 0; i < len; i++) { |
| 203 if (f(list[i])) { |
| 204 return true; |
| 205 } |
| 206 } |
| 207 return false; |
| 208 } |
| 209 |
| 210 static bool isEmpty(List list) => list.length == 0; |
| 211 } |
OLD | NEW |