/* SlotSet Copyright (C) 1998-2002 Jochen Hoenicke. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; see the file COPYING.LESSER. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id$ */ package net.sf.jode.flow; import net.sf.jode.decompiler.LocalInfo; ///#def COLLECTIONS java.util import java.util.AbstractSet; import java.util.Set; import java.util.Iterator; ///#enddef /** * This class represents a set of local info, all having different * slots. It is used for representing the in sets of flow block.

* * Its add method will automatically merge any localinfo that have * the same slot and is in the method.

*/ public final class SlotSet extends AbstractSet implements Cloneable { LocalInfo[] locals; int count; /** * Creates a new empty variable set */ public SlotSet() { locals = null; count = 0; } /** * Creates a new pre initialized variable set */ public SlotSet(LocalInfo[] locals) { count = locals.length; this.locals = locals; } public final void grow(int size) { if (locals != null) { size += count; if (size > locals.length) { int nextSize = locals.length * 2; // GlobalOptions.err.println("wanted: "+size+" next: "+nextSize); LocalInfo[] newLocals = new LocalInfo[nextSize > size ? nextSize : size]; System.arraycopy(locals, 0, newLocals, 0, count); locals = newLocals; } } else if (size > 0) locals = new LocalInfo[size]; } /** * Adds a local info to this variable set. */ public boolean add(Object o) { LocalInfo li = (LocalInfo) o; LocalInfo contained = findSlot(li.getSlot()); if (contained != null) { li.combineWith(contained); return false; } else { grow(1); locals[count++] = li; return true; } } public final boolean contains(Object o) { return containsSlot(((LocalInfo)o).getSlot()); } /** * Checks if the variable set contains a local with the given name. */ public final boolean containsSlot(int slot) { return findSlot(slot) != null; } /** * Checks if the variable set contains a local with the given slot. */ public LocalInfo findSlot(int slot) { for (int i=0; i 0) { other.locals = new LocalInfo[count]; System.arraycopy(locals, 0, other.locals, 0, count); } return other; } catch (CloneNotSupportedException ex) { throw new InternalError("Clone?"); } } /** * Merges this SlotSet with another. For all slots occuring * in both variable sets, all corresponding LocalInfos are merged. * The sets are not changed (use addAll for this). * @return The merged variables. * @param vs the other variable set. */ public void merge(VariableSet vs) { for (int i=0; i