@SuppressWarnings({"unchecked"})
    public boolean retainEntries( TObjectObjectProcedure<? super K, ? super V> procedure ) {
        boolean modified = false;
        Object[] keys = _set;
        V[] values = _values;

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

        return modified;
    }