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