private abstract class HashCollection[K]
type N: HashNode[K]
- var array: nullable NativeArray[nullable N] = null # Used to store items
+ var array: NativeArray[nullable N] is noautoinit # Used to store items
var capacity: Int = 0 # Size of _array
var the_length: Int = 0 # Number of items in the map
# Return the node associated with the key
fun node_at(k: nullable Object): nullable N
do
+ if _the_length == 0 then return null
# cache: `is` is used instead of `==` because it is a faster filter (even if not exact)
if k.is_same_instance(_last_accessed_key) then return _last_accessed_node
# Return the node associated with the key (but with the index already known)
fun node_at_idx(i: Int, k: nullable Object): nullable N
do
+ if _the_length == 0 then return null
var c = _array[i]
while c != null do
var ck = c._key
# Remove the node assosiated with the key
fun remove_node(k: nullable Object)
do
+ if _the_length == 0 then return
var i = index_at(k)
var node = node_at_idx(i, k)
if node == null then return
# Force a capacity
fun enlarge(cap: Int)
do
- var old_cap = _capacity
# get a new capacity
if cap < _the_length + 1 then cap = _the_length + 1
if cap <= _capacity then return
var new_array = new NativeArray[nullable N](cap)
_array = new_array
- # clean the new array
- var i = cap - 1
- while i >=0 do
- new_array[i] = null
- i -= 1
- end
-
- if _capacity <= old_cap then return
-
# Reput items in the array
var node = _first_item
while node != null do
redef fun []=(key, v)
do
+ if _capacity == 0 then enlarge(17) # 17 because magic in `store`
var i = index_at(key)
var c = node_at_idx(i, key)
if c != null then
do
_capacity = 0
_the_length = 0
- enlarge(0)
end
redef var keys: RemovableCollection[K] = new HashMapKeys[K, V](self) is lazy
redef fun add(item)
do
+ if _capacity == 0 then enlarge(17) # 17 because magic in `store`
var i = index_at(item)
var c = node_at_idx(i, item)
if c != null then
do
_capacity = 0
_the_length = 0
- enlarge(0)
end
# Build a list filled with the items of `coll`.
a1
false
+~~~No hash statistics~~~
~~~Hash statistics~~~
GET:
number of get and has_key: 1
number of collisions: 0 (0.00%)
average length of collisions: NA
average length of considered collections: 0.00
-average capacity of considered collections: 1.00 (NA%)
+average capacity of considered collections: 17.00 (NA%)
STORE:
-number of stores: 0
-number of collisions: 0 (NA%)
-average length of collisions: NA
-average length of considered collections: NA
-average capacity or considered collections: NA (NA%)
-~~~~~~
-~~~Hash statistics~~~
-GET:
-number of get and has_key: 2
+number of stores: 1
number of collisions: 0 (0.00%)
average length of collisions: NA
average length of considered collections: 0.00
-average capacity of considered collections: 1.00 (NA%)
+average capacity or considered collections: 17.00 (NA%)
-STORE:
-number of stores: 1
-number of collisions: 0 (0.00%)
-average length of collisions: NA
+ENLARGE:
+number of enlarge: 1
average length of considered collections: 0.00
-average capacity or considered collections: 1.00 (NA%)
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
~~~Hash statistics~~~
GET:
-number of get and has_key: 3
+number of get and has_key: 2
number of collisions: 0 (0.00%)
average length of collisions: NA
-average length of considered collections: 0.33
-average capacity of considered collections: 6.33 (1900.00%)
+average length of considered collections: 0.50
+average capacity of considered collections: 17.00 (3400.00%)
STORE:
number of stores: 1
number of collisions: 0 (0.00%)
average length of collisions: NA
average length of considered collections: 0.00
-average capacity or considered collections: 1.00 (NA%)
+average capacity or considered collections: 17.00 (NA%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
true
~~~Hash statistics~~~
GET:
-number of get and has_key: 4
+number of get and has_key: 2
number of collisions: 0 (0.00%)
average length of collisions: NA
average length of considered collections: 0.50
-average capacity of considered collections: 9.00 (1800.00%)
+average capacity of considered collections: 17.00 (3400.00%)
STORE:
number of stores: 1
number of collisions: 0 (0.00%)
average length of collisions: NA
average length of considered collections: 0.00
-average capacity or considered collections: 1.00 (NA%)
+average capacity or considered collections: 17.00 (NA%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
a2
false
~~~Hash statistics~~~
GET:
-number of get and has_key: 5
+number of get and has_key: 3
number of collisions: 0 (0.00%)
average length of collisions: NA
-average length of considered collections: 0.60
-average capacity of considered collections: 10.60 (1766.67%)
+average length of considered collections: 0.67
+average capacity of considered collections: 17.00 (2550.00%)
STORE:
number of stores: 1
number of collisions: 0 (0.00%)
average length of collisions: NA
average length of considered collections: 0.00
-average capacity or considered collections: 1.00 (NA%)
+average capacity or considered collections: 17.00 (NA%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
~~~Hash statistics~~~
GET:
-number of get and has_key: 6
+number of get and has_key: 4
number of collisions: 0 (0.00%)
average length of collisions: NA
-average length of considered collections: 0.67
-average capacity of considered collections: 11.67 (1750.00%)
+average length of considered collections: 0.75
+average capacity of considered collections: 17.00 (2266.67%)
STORE:
number of stores: 2
number of collisions: 1 (50.00%)
average length of collisions: 2.00
average length of considered collections: 0.50
-average capacity or considered collections: 9.00 (1800.00%)
+average capacity or considered collections: 17.00 (3400.00%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
~~~Hash statistics~~~
GET:
-number of get and has_key: 7
-number of collisions: 1 (14.29%)
+number of get and has_key: 5
+number of collisions: 1 (20.00%)
average length of collisions: 2.00
-average length of considered collections: 0.86
-average capacity of considered collections: 12.43 (1450.00%)
+average length of considered collections: 1.00
+average capacity of considered collections: 17.00 (1700.00%)
STORE:
number of stores: 2
number of collisions: 1 (50.00%)
average length of collisions: 2.00
average length of considered collections: 0.50
-average capacity or considered collections: 9.00 (1800.00%)
+average capacity or considered collections: 17.00 (3400.00%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
true
~~~Hash statistics~~~
GET:
-number of get and has_key: 7
-number of collisions: 1 (14.29%)
+number of get and has_key: 5
+number of collisions: 1 (20.00%)
average length of collisions: 2.00
-average length of considered collections: 0.86
-average capacity of considered collections: 12.43 (1450.00%)
+average length of considered collections: 1.00
+average capacity of considered collections: 17.00 (1700.00%)
STORE:
number of stores: 2
number of collisions: 1 (50.00%)
average length of collisions: 2.00
average length of considered collections: 0.50
-average capacity or considered collections: 9.00 (1800.00%)
+average capacity or considered collections: 17.00 (3400.00%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~
end
~~~Hash statistics~~~
GET:
-number of get and has_key: 7
-number of collisions: 1 (14.29%)
+number of get and has_key: 5
+number of collisions: 1 (20.00%)
average length of collisions: 2.00
-average length of considered collections: 0.86
-average capacity of considered collections: 12.43 (1450.00%)
+average length of considered collections: 1.00
+average capacity of considered collections: 17.00 (1700.00%)
STORE:
number of stores: 2
number of collisions: 1 (50.00%)
average length of collisions: 2.00
average length of considered collections: 0.50
-average capacity or considered collections: 9.00 (1800.00%)
+average capacity or considered collections: 17.00 (3400.00%)
+
+ENLARGE:
+number of enlarge: 1
+average length of considered collections: 0.00
+average capacity or considered collections: 17.00 (NA%)
~~~~~~