private int EnsureIndex(int key, bool intType)
{
int index = -1;
int firstDeleted = -1;
int[] keys = this.keys;
if (keys != null)
{
int fraction = key * A;
index = (int)(((uint)fraction) >> (32 - power));
int entry = keys[index];
if (entry == key)
{
return index;
}
if (entry != EMPTY)
{
if (entry == DELETED)
{
firstDeleted = index;
}
// Search in table after first failed attempt
int mask = (1 << power) - 1;
int step = TableLookupStep(fraction, mask, power);
int n = 0;
do
{
index = (index + step) & mask;
entry = keys[index];
if (entry == key)
{
return index;
}
if (entry == DELETED && firstDeleted < 0)
{
firstDeleted = index;
}
}
while (entry != EMPTY);
}
}
// Inserting of new key
if (check && keys != null && keys[index] != EMPTY)
{
Kit.CodeBug();
}
if (firstDeleted >= 0)
{
index = firstDeleted;
}
else
{
// Need to consume empty entry: check occupation level
if (keys == null || occupiedCount * 4 >= (1 << power) * 3)
{
// Too litle unused entries: rehash
RehashTable(intType);
return InsertNewKey(key);
}
++occupiedCount;
}
keys[index] = key;
++keyCount;
return index;
}