/**
  * Executes <tt>procedure</tt> for each key/value entry in the map.
  *
  * @param procedure a <code>TOByteLongProcedure</code> value
  * @return false if the loop over the entries terminated because the procedure returned false for
  *     some entry.
  */
 public boolean forEachEntry(TByteLongProcedure procedure) {
   byte[] states = _states;
   byte[] keys = _set;
   long[] values = _values;
   for (int i = keys.length; i-- > 0; ) {
     if (states[i] == FULL && !procedure.execute(keys[i], values[i])) {
       return false;
     }
   }
   return true;
 }
  /**
   * Retains only those entries in the map for which the procedure returns a true value.
   *
   * @param procedure determines which entries to keep
   * @return true if the map was modified.
   */
  public boolean retainEntries(TByteLongProcedure procedure) {
    boolean modified = false;
    byte[] states = _states;
    byte[] keys = _set;
    long[] values = _values;

    // Temporarily disable compaction. This is a fix for bug #1738760
    tempDisableAutoCompaction();
    try {
      for (int i = keys.length; i-- > 0; ) {
        if (states[i] == FULL && !procedure.execute(keys[i], values[i])) {
          removeAt(i);
          modified = true;
        }
      }
    } finally {
      reenableAutoCompaction(true);
    }

    return modified;
  }