59 return double.class; |
59 return double.class; |
60 } |
60 } |
61 |
61 |
62 @Override |
62 @Override |
63 public ArrayData copy() { |
63 public ArrayData copy() { |
64 return new NumberArrayData(array.clone(), (int) length()); |
64 return new NumberArrayData(array.clone(), (int)length); |
65 } |
65 } |
66 |
66 |
67 @Override |
67 @Override |
68 public Object[] asObjectArray() { |
68 public Object[] asObjectArray() { |
69 return toObjectArray(array, (int) length()); |
69 return toObjectArray(array, (int)length); |
70 } |
70 } |
71 |
71 |
72 private static Object[] toObjectArray(final double[] array, final int length) { |
72 private static Object[] toObjectArray(final double[] array, final int length) { |
73 assert length <= array.length : "length exceeds internal array size"; |
73 assert length <= array.length : "length exceeds internal array size"; |
74 final Object[] oarray = new Object[array.length]; |
74 final Object[] oarray = new Object[array.length]; |
80 } |
80 } |
81 |
81 |
82 @Override |
82 @Override |
83 public Object asArrayOfType(final Class<?> componentType) { |
83 public Object asArrayOfType(final Class<?> componentType) { |
84 if(componentType == double.class) { |
84 if(componentType == double.class) { |
85 return array.length == length() ? array.clone() : Arrays.copyOf(array, (int) length()); |
85 return array.length == length ? array.clone() : Arrays.copyOf(array, (int)length); |
86 } |
86 } |
87 return super.asArrayOfType(componentType); |
87 return super.asArrayOfType(componentType); |
88 } |
88 } |
89 |
89 |
90 @Override |
90 @Override |
91 public ArrayData convert(final Class<?> type) { |
91 public ArrayData convert(final Class<?> type) { |
92 if (type != Double.class && type != Integer.class && type != Long.class) { |
92 if (type != Double.class && type != Integer.class && type != Long.class) { |
93 final int length = (int) length(); |
93 final int len = (int)length; |
94 return new ObjectArrayData(NumberArrayData.toObjectArray(array, length), length); |
94 return new ObjectArrayData(NumberArrayData.toObjectArray(array, len), len); |
95 } |
95 } |
96 return this; |
96 return this; |
97 } |
97 } |
98 |
98 |
99 @Override |
99 @Override |
101 System.arraycopy(array, by, array, 0, array.length - by); |
101 System.arraycopy(array, by, array, 0, array.length - by); |
102 } |
102 } |
103 |
103 |
104 @Override |
104 @Override |
105 public ArrayData shiftRight(final int by) { |
105 public ArrayData shiftRight(final int by) { |
106 final ArrayData newData = ensure(by + length() - 1); |
106 final ArrayData newData = ensure(by + length - 1); |
107 if (newData != this) { |
107 if (newData != this) { |
108 newData.shiftRight(by); |
108 newData.shiftRight(by); |
109 return newData; |
109 return newData; |
110 } |
110 } |
111 System.arraycopy(array, 0, array, by, array.length - by); |
111 System.arraycopy(array, 0, array, by, array.length - by); |
146 } |
146 } |
147 |
147 |
148 @Override |
148 @Override |
149 public ArrayData set(final int index, final int value, final boolean strict) { |
149 public ArrayData set(final int index, final int value, final boolean strict) { |
150 array[index] = value; |
150 array[index] = value; |
151 setLength(Math.max(index + 1, length())); |
151 setLength(Math.max(index + 1, length)); |
152 return this; |
152 return this; |
153 } |
153 } |
154 |
154 |
155 @Override |
155 @Override |
156 public ArrayData set(final int index, final long value, final boolean strict) { |
156 public ArrayData set(final int index, final long value, final boolean strict) { |
157 array[index] = value; |
157 array[index] = value; |
158 setLength(Math.max(index + 1, length())); |
158 setLength(Math.max(index + 1, length)); |
159 return this; |
159 return this; |
160 } |
160 } |
161 |
161 |
162 @Override |
162 @Override |
163 public ArrayData set(final int index, final double value, final boolean strict) { |
163 public ArrayData set(final int index, final double value, final boolean strict) { |
164 array[index] = value; |
164 array[index] = value; |
165 setLength(Math.max(index + 1, length())); |
165 setLength(Math.max(index + 1, length)); |
166 return this; |
166 return this; |
167 } |
167 } |
168 |
168 |
169 @Override |
169 @Override |
170 public Type getOptimisticType() { |
170 public Type getOptimisticType() { |
244 return new DeletedRangeArrayFilter(this, fromIndex, toIndex); |
244 return new DeletedRangeArrayFilter(this, fromIndex, toIndex); |
245 } |
245 } |
246 |
246 |
247 @Override |
247 @Override |
248 public Object pop() { |
248 public Object pop() { |
249 if (length() == 0) { |
249 if (length == 0) { |
250 return UNDEFINED; |
250 return UNDEFINED; |
251 } |
251 } |
252 |
252 |
253 final int newLength = (int) (length() - 1); |
253 final int newLength = (int)length - 1; |
254 final double elem = array[newLength]; |
254 final double elem = array[newLength]; |
255 array[newLength] = 0; |
255 array[newLength] = 0; |
256 setLength(newLength); |
256 setLength(newLength); |
257 return elem; |
257 return elem; |
258 } |
258 } |
259 |
259 |
260 @Override |
260 @Override |
261 public ArrayData slice(final long from, final long to) { |
261 public ArrayData slice(final long from, final long to) { |
262 final long start = from < 0 ? from + length() : from; |
262 final long start = from < 0 ? from + length : from; |
263 final long newLength = to - start; |
263 final long newLength = to - start; |
264 return new NumberArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength); |
264 return new NumberArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength); |
265 } |
265 } |
266 |
266 |
267 @Override |
267 @Override |
268 public final ArrayData push(final boolean strict, final double item) { |
268 public final ArrayData push(final boolean strict, final double item) { |
269 final long length = length(); |
269 final long len = length; |
270 final ArrayData newData = ensure(length); |
270 final ArrayData newData = ensure(len); |
271 if (newData == this) { |
271 if (newData == this) { |
272 array[(int)length] = item; |
272 array[(int)len] = item; |
273 return this; |
273 return this; |
274 } |
274 } |
275 return newData.set((int)length, item, strict); |
275 return newData.set((int)len, item, strict); |
276 } |
276 } |
277 |
277 |
278 @Override |
278 @Override |
279 public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException { |
279 public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException { |
280 final long oldLength = length(); |
280 final long oldLength = length; |
281 final long newLength = oldLength - removed + added; |
281 final long newLength = oldLength - removed + added; |
282 if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) { |
282 if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) { |
283 throw new UnsupportedOperationException(); |
283 throw new UnsupportedOperationException(); |
284 } |
284 } |
285 final ArrayData returnValue = removed == 0 ? |
285 final ArrayData returnValue = removed == 0 ? |