# Returns the first valid free identifier which correspond to this mask
private fun first_valid_id(mask: Int): Int
do
# Search for the first valid free identifier
var inter = interval.iterator
var found = false
var id = 0
while inter.is_ok and not found do
var i = inter.item.first.as(not null)
while i != inter.item.second and not found do
# Tests if this id is free for this mask
var hv = i & mask
# If the hashtable if full, push an empty item
if hv >= tempht.length then
tempht.push(null)
end
if tempht[hv] != mask then
found = true
id = i
end
i = i + 1
end
if not found then
inter.next
end
end
# Updates the structure of union of intervals
if id == inter.item.first then
if inter.item.first == inter.item.second then
inter.delete
else
inter.item.first += 1
end
else
if id != inter.item.first and id != inter.item.second then
# We need to split in two this interval
var last = inter.item.second
inter.item.second = id - 1
inter.next
var p = new Couple[nullable Int, nullable Int](id + 1, last)
if inter.is_ok then
inter.insert_before(p)
else
interval.push(p)
end
else
inter.item.second = id - 1
end
end
return id
end
lib/perfect_hashing/perfect_hashing.nit:149,2--205,4