X-Git-Url: http://nitlanguage.org diff --git a/lib/core/collection/array.nit b/lib/core/collection/array.nit index ce89435..e8f57c0 100644 --- a/lib/core/collection/array.nit +++ b/lib/core/collection/array.nit @@ -112,10 +112,18 @@ abstract class AbstractArrayRead[E] fun copy_to(start: Int, len: Int, dest: AbstractArray[E], new_start: Int) do # TODO native one - var i = len - while i > 0 do - i -= 1 - dest[new_start+i] = self[start+i] + if start < new_start then + var i = len + while i > 0 do + i -= 1 + dest[new_start+i] = self[start+i] + end + else + var i = 0 + while i < len do + dest[new_start+i] = self[start+i] + i += 1 + end end end @@ -130,7 +138,7 @@ abstract class AbstractArrayRead[E] end end - redef fun iterator: ArrayIterator[E] do + redef fun iterator: IndexedIterator[E] do var res = _free_iterator if res == null then return new ArrayIterator[E](self) res._index = 0 @@ -220,22 +228,18 @@ abstract class AbstractArray[E] do assert not_empty: not is_empty var r = first - var i = 1 - var l = length - while i < l do - self[i-1] = self[i] - i += 1 - end - _length = l - 1 + var l = length-1 + copy_to(1, l, self, 0) + _length = l return r end redef fun unshift(item) do - var i = length - 1 - while i >= 0 do - self[i+1] = self[i] - i -= 1 + var l = length + if l > 0 then + enlarge(l + 1) + copy_to(0, l, self, 1) end self[0] = item end @@ -653,7 +657,7 @@ private class ArraySetIterator[E] redef fun item: E do return _iter.item - var iter: ArrayIterator[E] + var iter: Iterator[E] end