abstract class AbstractArrayRead[E]
super SequenceRead[E]
- redef readable var _length: Int = 0
+ var _length: Int = 0
+ redef fun length do return _length
redef fun is_empty do return _length == 0
self[pos] = item
end
+ redef fun insert_all(coll, pos)
+ do
+ var l = coll.length
+ if l == 0 then return
+ enlarge(length + l)
+ _length += l
+ copy_to(pos, length-pos-l, self, pos + l)
+ for c in coll do
+ self[pos] = c
+ pos += 1
+ end
+ end
+
redef fun add(item) do self[length] = item
redef fun clear do _length = 0
# The size of `_items`.
var _capacity: Int = 0
+
+ redef fun ==(o)
+ do
+ if not o isa Array[nullable Object] then return super
+ # Efficient implementation
+ var l = length
+ if l != o.length then return false
+ var i = 0
+ var it = _items
+ var oit = o._items
+ while i < l do
+ if it[i] != oit[i] then return false
+ i += 1
+ end
+ return true
+ end
end
# An `Iterator` on `AbstractArray`
_index = 0
end
- redef readable var _index: Int = 0
+ var _index: Int = 0
+ redef fun index do return _index
var _array: AbstractArrayRead[E]
end
# Create an empty set with a given capacity.
init with_capacity(i: Int) do _array = new Array[E].with_capacity(i)
+
+ redef fun new_set do return new ArraySet[E]
end
# Iterators on sets implemented with arrays.
end
# Internal storage.
- var _items: Array[Couple[K,E]]
+ var _items = new Array[Couple[K,E]]
# fast remove the ith element of the array
private fun remove_at_index(i: Int)
end
return -1
end
-
- # A new empty map.
- init
- do
- _items = new Array[Couple[K,E]]
- end
end
private class ArrayMapKeys[K: Object, E]
end
end
+# Comparable array for comparable elements.
+#
+# For two arrays, if one is a prefix, then it is lower.
+#
+# ~~~
+# var a12 = new ArrayCmp[nullable Int].with_items(1,2)
+# var a123 = new ArrayCmp[nullable Int].with_items(1,2,3)
+# assert a12 < a123
+# ~~~
+#
+# Otherwise, the first element just after the longest
+# common prefix gives the order between the two arrays.
+#
+# ~~~
+# var a124 = new ArrayCmp[nullable Int].with_items(1,2,4)
+# var a13 = new ArrayCmp[nullable Int].with_items(1,3)
+# assert a12 < a123
+# assert a123 < a13
+# ~~~
+#
+# Obviously, two equal arrays are equal.
+#
+# ~~~
+# var b12 = new ArrayCmp[nullable Int].with_items(1,2)
+# assert (a12 <=> b12) == 0
+# ~~~
+#
+# `null` is considered lower than any other elements.
+# But is still greater than no element.
+#
+# ~~~
+# var a12n = new ArrayCmp[nullable Int].with_items(1,2,null)
+# assert a12n < a123
+# assert a12 < a12n
+# ~~~
+class ArrayCmp[E: nullable Comparable]
+ super Array[E]
+ super Comparable
+ redef type OTHER: ArrayCmp[E] is fixed
+
+ redef fun <(o) do return (self <=> o) < 0
+
+ redef fun <=>(o)
+ do
+ var it = _items
+ var oit = o._items
+ var i = 0
+ var l = length
+ var ol = o.length
+ var len
+ if l < ol then len = l else len = ol
+ while i < len do
+ var a = it[i]
+ var b = oit[i]
+ if a != null then
+ if b == null then return 1
+ var d = a <=> b.as(Comparable)
+ if d != 0 then return d
+ else
+ if b != null then return -1
+ end
+ i += 1
+ end
+ return l <=> ol
+ end
+end
# Others tools ################################################################
# Build a new array from a collection
fun to_a: Array[E]
do
- return iterator.to_a
+ var res = new Array[E].with_capacity(length)
+ res.add_all(self)
+ return res
end
end
protected fun calloc_array(size: Int): NativeArray[E] is intern
end
-# Native C array (void ...).
+# Native Nit array
+# Access are unchecked and it has a fixed size
+# Not for public use: may become private.
universal NativeArray[E]
+ # Creates a new NativeArray of capacity `length`
+ new(length: Int) is intern
+ # The length of the array
+ fun length: Int is intern
+ # Use `self` to initialize a standard Nit Array.
+ fun to_a: Array[E] do return new Array[E].with_native(self, length)
fun [](index: Int): E is intern
fun []=(index: Int, item: E) is intern
fun copy_to(dest: NativeArray[E], length: Int) is intern