1 pnkfelix 1.1.2.1 // ColorFactory.java, created Wed Jan 13 17:39:31 1999 by pnkfelix 2 cananian 1.1.2.7 // Copyright (C) 1998 Felix S. Klock II <pnkfelix@mit.edu> 3 cananian 1.1.2.6 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 pnkfelix 1.1.2.1 package harpoon.Analysis.GraphColoring; 5 pnkfelix 1.1.2.1 6 pnkfelix 1.1.2.2 import java.util.Stack; 7 pnkfelix 1.1.2.1 import java.util.Vector; 8 pnkfelix 1.1.2.1 9 pnkfelix 1.1.2.1 /** 10 pnkfelix 1.1.2.1 * <code>ColorFactory</code> 11 pnkfelix 1.1.2.1 * 12 cananian 1.1.2.7 * @author Felix S. Klock II <pnkfelix@mit.edu> 13 cananian 1.2 * @version $Id: ColorFactory.java,v 1.2 2002/02/25 20:57:15 cananian Exp $ 14 pnkfelix 1.1.2.1 */ 15 pnkfelix 1.1.2.1 16 pnkfelix 1.1.2.1 public abstract class ColorFactory { 17 pnkfelix 1.1.2.1 18 pnkfelix 1.1.2.2 private Stack colors; 19 pnkfelix 1.1.2.2 private Stack removedColors; 20 pnkfelix 1.1.2.1 21 pnkfelix 1.1.2.1 /** Creates a <code>ColorFactory</code>. */ 22 pnkfelix 1.1.2.1 public ColorFactory() { 23 pnkfelix 1.1.2.2 colors = new Stack(); 24 pnkfelix 1.1.2.2 removedColors = new Stack(); 25 pnkfelix 1.1.2.1 } 26 pnkfelix 1.1.2.1 27 pnkfelix 1.1.2.1 /** Color generator. 28 pnkfelix 1.1.2.4 <BR> <B>modifies:</B> <code>this</code> 29 pnkfelix 1.1.2.4 <BR> <B>effects:</B> If no <code>Color</code>s have been 30 pnkfelix 1.1.2.4 removed from <code>this</code>, 31 pnkfelix 1.1.2.4 constructs a new <code>Color</code> and 32 pnkfelix 1.1.2.4 returns it. Else returns the most 33 pnkfelix 1.1.2.4 recently removed <code>Color</code> and 34 pnkfelix 1.1.2.4 flags the <code>Color</code> returned as 35 pnkfelix 1.1.2.4 no longer being removed from 36 pnkfelix 1.1.2.5 <code>this</code>. 37 pnkfelix 1.1.2.1 */ 38 pnkfelix 1.1.2.1 public Color makeColor() { 39 pnkfelix 1.1.2.4 // modifies: this.colors, this.removedColors 40 pnkfelix 1.1.2.2 Color c; 41 pnkfelix 1.1.2.2 if (removedColors.empty()) { 42 pnkfelix 1.1.2.2 c = newColor(); 43 pnkfelix 1.1.2.2 } else { 44 pnkfelix 1.1.2.2 c = (Color) removedColors.pop(); 45 pnkfelix 1.1.2.2 } 46 pnkfelix 1.1.2.2 colors.push(c); 47 pnkfelix 1.1.2.1 return c; 48 pnkfelix 1.1.2.1 } 49 pnkfelix 1.1.2.2 50 pnkfelix 1.1.2.2 /** Factory downsizer. 51 pnkfelix 1.1.2.4 <BR> <B>modifies:</B> <code>this</code> 52 pnkfelix 1.1.2.4 <BR> <B>effects:</B> If <code>Color</code>s exist in 53 pnkfelix 1.1.2.4 <code>this</code> for distribution, 54 pnkfelix 1.1.2.4 removes the last produced 55 pnkfelix 1.1.2.4 <code>Color</code> from the internal 56 pnkfelix 1.1.2.4 colors list. Else does nothing. 57 pnkfelix 1.1.2.2 */ 58 pnkfelix 1.1.2.2 public void removeColor() { 59 pnkfelix 1.1.2.4 // modifies: this.colors, this.removedColors 60 pnkfelix 1.1.2.2 if (! colors.empty() ) { 61 pnkfelix 1.1.2.2 removedColors.push( colors.pop() ); 62 pnkfelix 1.1.2.2 } 63 pnkfelix 1.1.2.2 } 64 pnkfelix 1.1.2.2 65 pnkfelix 1.1.2.1 /** Color generator that subclasses must implement. 66 pnkfelix 1.1.2.5 <BR> <B>effects:</B> Constructs a new <code>Color</code> and 67 pnkfelix 1.1.2.5 returns it. 68 pnkfelix 1.1.2.1 */ 69 pnkfelix 1.1.2.1 protected abstract Color newColor(); 70 pnkfelix 1.1.2.1 71 pnkfelix 1.1.2.4 /** Inventory accessor. 72 pnkfelix 1.1.2.4 <BR> <B>effects:</B> Returns a <code>Vector</code> of all of 73 pnkfelix 1.1.2.4 the <code>Color</code>s currently 74 pnkfelix 1.1.2.5 distributable from <code>this</code>. 75 pnkfelix 1.1.2.4 <BR> <B>requires:</B> <code>makeColor</code> and 76 pnkfelix 1.1.2.4 <code>removeColor</code> are not called 77 pnkfelix 1.1.2.4 as long as the <code>Vector</code> 78 pnkfelix 1.1.2.4 returned is in use. 79 pnkfelix 1.1.2.4 */ 80 pnkfelix 1.1.2.4 public Vector getColors() { 81 pnkfelix 1.1.2.1 return colors; 82 pnkfelix 1.1.2.1 } 83 pnkfelix 1.1.2.1 } 84 pnkfelix 1.1.2.4 85 pnkfelix 1.1.2.4 86 pnkfelix 1.1.2.4 87 pnkfelix 1.1.2.4 88 cananian 1.2