private static boolean addInternal(CellCacheEntry[] arr, CellCacheEntry cce) {
    int startIx = Math.abs(cce.hashCode() % arr.length);

    for (int i = startIx; i < arr.length; i++) {
      CellCacheEntry item = arr[i];
      if (item == cce) {
        // already present
        return false;
      }
      if (item == null) {
        arr[i] = cce;
        return true;
      }
    }
    for (int i = 0; i < startIx; i++) {
      CellCacheEntry item = arr[i];
      if (item == cce) {
        // already present
        return false;
      }
      if (item == null) {
        arr[i] = cce;
        return true;
      }
    }
    throw new IllegalStateException("No empty space found");
  }
  public boolean remove(CellCacheEntry cce) {
    FormulaCellCacheEntry[] arr = _arr;

    if (_size * 3 < _arr.length && _arr.length > 8) {
      // re-hash
      boolean found = false;
      FormulaCellCacheEntry[] prevArr = _arr;
      FormulaCellCacheEntry[] newArr = new FormulaCellCacheEntry[_arr.length / 2]; // shrink 50%
      for (int i = 0; i < prevArr.length; i++) {
        FormulaCellCacheEntry prevCce = _arr[i];
        if (prevCce != null) {
          if (prevCce == cce) {
            found = true;
            _size--;
            // skip it
            continue;
          }
          addInternal(newArr, prevCce);
        }
      }
      _arr = newArr;
      return found;
    }
    // else - usual case
    // delete single element (without re-hashing)

    int startIx = Math.abs(cce.hashCode() % arr.length);

    // note - can't exit loops upon finding null because of potential previous deletes
    for (int i = startIx; i < arr.length; i++) {
      FormulaCellCacheEntry item = arr[i];
      if (item == cce) {
        // found it
        arr[i] = null;
        _size--;
        return true;
      }
    }
    for (int i = 0; i < startIx; i++) {
      FormulaCellCacheEntry item = arr[i];
      if (item == cce) {
        // found it
        arr[i] = null;
        _size--;
        return true;
      }
    }
    return false;
  }