docs: private int ensureIndex(int key, boolean intType) {
          int index = -1;
          int firstDeleted = -1;
          int[] keys = this.keys;
          if (keys != null) {
              int fraction = key * A;
              index = 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 {
                      if (check) {
                          if (n >= occupiedCount) Kit.codeBug();
                          ++n;
                      }
                      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;
      }