[E, K] allocateEntryAt(th: TwoHash[E], key: K, rvalue entry: E) { assert(null?(pEntryAt(th, key))); var hash = splitHash(th, key); var entryCount = [0,0]; for (i in range(2)) { for (k in range(16)) { if (th.tables[i][hash[i]].hashBytes[k] != 255) entryCount[i] += 1; } } if (min(entryCount[0], entryCount[1]) == 16) { grow(th); return allocateEntryAt(th, key, entry); } var bi = 0; if (entryCount[1] < entryCount[0]) bi = 1; for (k in range(16)) { if (th.tables[bi][hash[bi]].hashBytes[k] == 255) { th.tables[bi][hash[bi]].hashBytes[k] = Byte(hash[2]); var pEntry = &th.tables[bi][hash[bi]].entries[k]; pEntry^ <-- move(entry); return pEntry; } } assert(false, "shouldn't reach"); return null(E); }