core/array: fix implementation of naive copy_to to avoid overwriting
[nit.git] / lib / core / collection / array.nit
index ce89435..e8f57c0 100644 (file)
@@ -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