+
+# Resizeable one dimention array of objects.
+class AbstractArray[E]
+special AbstractArrayRead[E]
+special IndexedCollection[E]
+ meth enlarge(cap: Int) is abstract
+
+ redef meth push(item) do add(item)
+
+ redef meth pop
+ do
+ assert not_empty: not is_empty
+ var r = last
+ _length -= 1
+ return r
+ end
+
+ redef meth shift
+ 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
+ return r
+ end
+
+ redef meth unshift(item)
+ do
+ var i = length - 1
+ while i > 0 do
+ self[i+1] = self[i]
+ i -= 1
+ end
+ self[0] = item
+ end
+
+ meth insert(item: E, pos: Int)
+ do
+ enlarge(length + 1)
+ copy_to(pos, length-pos, self, pos + 1)
+ self[pos] = item
+ end
+
+ redef meth add(item) do self[length] = item
+
+ redef meth clear do _length = 0
+
+ redef meth remove(item) do remove_at(index_of(item))
+
+ redef meth remove_all(item)
+ do
+ var i = index_of(item)
+ while i >= 0 do
+ remove_at(i)
+ i = index_of_from(item, i)
+ end
+ end
+
+ redef meth remove_at(i)
+ do
+ var l = length
+ if i >= 0 and i < l then
+ var j = i + 1
+ while j < l do
+ self[j-1] = self[j]
+ j += 1
+ end
+ _length = l - 1
+ end
+ end
+end
+