# One dimention array of objects.
class AbstractArrayRead[E]
-special SequenceRead[E]
+ super SequenceRead[E]
# The current length
redef readable var _length: Int = 0
return true
end
- redef fun has_key(index) do return index >= 0 and index < length
-
redef fun count(item)
do
var res = 0
# Resizeable one dimention array of objects.
class AbstractArray[E]
-special AbstractArrayRead[E]
-special Sequence[E]
+ super AbstractArrayRead[E]
+ super Sequence[E]
fun enlarge(cap: Int) is abstract
redef fun push(item) do add(item)
# a.push(32)
# a.push(8)
class Array[E]
-special AbstractArray[E]
-special ArrayCapable[E]
+ super AbstractArray[E]
+ super ArrayCapable[E]
redef fun iterate
!each(e: E)
do
# An `Iterator' on `AbstractArray'
class ArrayIterator[E]
-special IndexedIterator[E]
+ super IndexedIterator[E]
redef fun item do return _array[_index]
# redef fun item=(e) do _array[_index] = e
# A set implemented with an Array.
class ArraySet[E: Object]
-special Set[E]
+ super Set[E]
# The stored elements.
var _array: Array[E]
# Iterators on sets implemented with arrays.
class ArraySetIterator[E: Object]
-special Iterator[E]
+ super Iterator[E]
redef fun is_ok do return _iter.is_ok
# Associative arrays implemented with an array of (key, value) pairs.
class ArrayMap[K: Object, E]
-special CoupleMap[K, E]
+ super CoupleMap[K, E]
# O(n)
redef fun [](key)
end
end
- # O(n)
- redef fun has_key(key) do return index(key) >= 0
-
- # O(n)
- redef fun has(item)
- do
- for i in _items do if i.second == item then return true
- return false
- end
-
- # O(n)
- redef fun has_only(item)
- do
- for i in _items do if i.second != item then return false
- return true
- end
+ redef var keys: ArrayMapKeys[K, E] = new ArrayMapKeys[K, E](self)
+ redef var values: ArrayMapValues[K, E] = new ArrayMapValues[K, E](self)
# O(1)
redef fun length do return _items.length
- redef fun first do return _items.first.second
-
- # O(n)
- redef fun count(item)
- do
- var nb = 0
- for i in _items do if i.second == item then nb += 1
- return nb
- end
-
redef fun iterator: CoupleMapIterator[K, E] do return new CoupleMapIterator[K, E](_items.iterator)
redef fun is_empty do return _items.is_empty
end
end
+class ArrayMapKeys[K: Object, E]
+ super Collection[K]
+ # The original map
+ var map: ArrayMap[K, E]
+ redef fun count(k) do if self.has(k) then return 1 else return 0
+ redef fun first do return self.map._items.first.first
+ redef fun has(k) do return self.map.index(k) >= 0
+ redef fun has_only(k) do return (self.has(k) and self.length == 1) or self.is_empty
+ redef fun is_empty do return self.map.is_empty
+ redef fun length do return self.map.length
+ redef fun iterator do return new MapKeysIterator[K, E](self.map.iterator)
+end
+
+class ArrayMapValues[K: Object, E]
+ super Collection[K]
+ # The original map
+ var map: ArrayMap[K, E]
+ redef fun first do return self.map._items.first.first
+ redef fun is_empty do return self.map.is_empty
+ redef fun length do return self.map.length
+ redef fun iterator do return new MapValuesIterator[K, E](self.map.iterator)
+
+ # O(n)
+ redef fun has(item)
+ do
+ for i in self.map._items do if i.second == item then return true
+ return false
+ end
+
+ # O(n)
+ redef fun has_only(item)
+ do
+ for i in self.map._items do if i.second != item then return false
+ return true
+ end
+
+ # O(n)
+ redef fun count(item)
+ do
+ var nb = 0
+ for i in self.map._items do if i.second == item then nb += 1
+ return nb
+ end
+
+end
+
+
# Others tools ################################################################
redef class Iterator[E]