1 pnkfelix 1.1.2.1 // ColorableGraph.java, created Wed Jan 13 14:13:21 1999 by pnkfelix 2 cananian 1.1.2.4 // Copyright (C) 1998 Felix S. Klock II <pnkfelix@mit.edu> 3 pnkfelix 1.1.2.1 // 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.1 import java.util.Enumeration; 7 pnkfelix 1.1.2.1 import java.util.NoSuchElementException; 8 pnkfelix 1.1.2.1 9 pnkfelix 1.1.2.1 /** 10 pnkfelix 1.1.2.2 * <code>ColorableGraphImpl</code> defines a set of methods that graphs to 11 pnkfelix 1.1.2.1 * be colored should implement. They are meant to be called by the 12 pnkfelix 1.1.2.1 * graph colorers defined in this package. 13 pnkfelix 1.1.2.2 * 14 pnkfelix 1.1.2.2 * @deprecated replaced by <code>ColorableGraph</code> interface. 15 cananian 1.1.2.4 * @author Felix S. Klock II <pnkfelix@mit.edu> 16 cananian 1.2 * @version $Id: ColorableGraphImpl.java,v 1.2 2002/02/25 20:57:16 cananian Exp $ */ 17 pnkfelix 1.1.2.1 18 pnkfelix 1.1.2.3 abstract class ColorableGraphImpl extends GraphImpl { 19 pnkfelix 1.1.2.1 20 pnkfelix 1.1.2.1 private boolean mutable; 21 pnkfelix 1.1.2.1 22 pnkfelix 1.1.2.1 /** Creates a <code>ColorableGraph</code>. */ 23 pnkfelix 1.1.2.1 public ColorableGraphImpl() { 24 pnkfelix 1.1.2.1 super(); 25 pnkfelix 1.1.2.1 mutable = true; 26 pnkfelix 1.1.2.1 } 27 pnkfelix 1.1.2.1 28 pnkfelix 1.1.2.1 /** Returns the graph to a modifiable state. 29 pnkfelix 1.1.2.1 <BR> <B>modifies:</B> all colored and hidden nodes in 30 pnkfelix 1.1.2.1 <code>this</code>. 31 pnkfelix 1.1.2.1 <BR> <B>effects:</B> each colored node is given an 'uncolored' 32 pnkfelix 1.1.2.1 state and each hidden node is unhid. 33 pnkfelix 1.1.2.1 */ 34 pnkfelix 1.1.2.1 public void resetGraph() { 35 pnkfelix 1.1.2.1 unhideAllNodes(); 36 pnkfelix 1.1.2.1 resetColors(); 37 pnkfelix 1.1.2.1 } 38 pnkfelix 1.1.2.1 39 pnkfelix 1.1.2.1 /** Reverts the graph to an uncolored state. 40 pnkfelix 1.1.2.1 <BR> <B>modifies:</B> all colored nodes in <code>this</code> 41 pnkfelix 1.1.2.1 <BR> <B>effects:</B> Each colored node is given an 'uncolored' 42 pnkfelix 1.1.2.1 state. 43 pnkfelix 1.1.2.1 */ 44 pnkfelix 1.1.2.1 void resetColors() { 45 pnkfelix 1.1.2.1 Enumeration nodes = super.getNodes(); 46 pnkfelix 1.1.2.1 while(nodes.hasMoreElements()) { 47 pnkfelix 1.1.2.1 ColorableNode node = (ColorableNode) nodes.nextElement(); 48 pnkfelix 1.1.2.1 try { 49 pnkfelix 1.1.2.1 node.setColor(null); 50 pnkfelix 1.1.2.1 } catch (NodeAlreadyColoredException e) { 51 pnkfelix 1.1.2.1 // this should not be thrown, because we are not 52 pnkfelix 1.1.2.1 // coloring the node. 53 pnkfelix 1.1.2.1 throw new RuntimeException 54 pnkfelix 1.1.2.1 (e.getMessage()); 55 pnkfelix 1.1.2.1 } 56 pnkfelix 1.1.2.1 } 57 pnkfelix 1.1.2.1 mutable = true; 58 pnkfelix 1.1.2.1 } 59 pnkfelix 1.1.2.1 60 pnkfelix 1.1.2.1 /** Sets the color of <code>node</code>. 61 pnkfelix 1.1.2.1 <BR> <B>requires:</B> <code>node</code> is present in graph 62 pnkfelix 1.1.2.1 and has not been colored. 63 pnkfelix 1.1.2.1 <BR> <B>effects:</B> Sets the color of <code>node</code> to 64 pnkfelix 1.1.2.1 <code>color</code>. If 65 pnkfelix 1.1.2.1 <code>color</code> is <code>null</code> 66 pnkfelix 1.1.2.1 then <code>node</code> is given an 67 pnkfelix 1.1.2.1 'uncolored' state. Marks 68 pnkfelix 1.1.2.1 <code>this</code> as unmodifiable. 69 pnkfelix 1.1.2.1 */ 70 pnkfelix 1.1.2.1 void setColor(ColorableNode node, Color color) { 71 pnkfelix 1.1.2.1 // modifies: this.mutable 72 pnkfelix 1.1.2.1 mutable = false; 73 pnkfelix 1.1.2.1 node.setColor( color ); 74 pnkfelix 1.1.2.1 } 75 pnkfelix 1.1.2.1 76 pnkfelix 1.1.2.1 77 pnkfelix 1.1.2.1 /** Temporarily removes <code>node</code> from graph. 78 pnkfelix 1.1.2.1 <BR> <B>requires:</B> <code>node</code> is present in 79 pnkfelix 1.1.2.1 <code>this</code>. 80 pnkfelix 1.1.2.1 <BR> <B>modifies:</B> <code>this</code>, <code>node</code> 81 pnkfelix 1.1.2.1 <BR> <B>effects:</B> Removes <code>node</code> from 82 pnkfelix 1.1.2.1 <code>this</code>, placing it in storage 83 pnkfelix 1.1.2.1 for later replacement in the graph. Also 84 pnkfelix 1.1.2.1 updates all edges and nodes of 85 pnkfelix 1.1.2.1 <code>this</code> to reflect that 86 pnkfelix 1.1.2.1 <code>node</code> has been hidden. 87 pnkfelix 1.1.2.1 */ 88 pnkfelix 1.1.2.1 abstract void hideNode( ColorableNode node ); 89 pnkfelix 1.1.2.1 90 pnkfelix 1.1.2.1 /** Replaces a hidden <code>node</code> in graph. 91 pnkfelix 1.1.2.1 <BR> <B>NOTE:</B> This method may be replaced by a "unhide 92 pnkfelix 1.1.2.1 last node" or equivalent method, like 93 pnkfelix 1.1.2.1 popping a stack, because the current 94 pnkfelix 1.1.2.1 implementation does not support unhiding 95 pnkfelix 1.1.2.1 nodes out-of-reverse-order. (I will look 96 pnkfelix 1.1.2.1 into the difficulty of implementing this 97 pnkfelix 1.1.2.1 correctly). 98 pnkfelix 1.1.2.1 <BR> <B>requires:</B> <code>node</code> was previously hidden 99 pnkfelix 1.1.2.1 in <code>this</code> and has not been 100 pnkfelix 1.1.2.1 replaced since its last removal. 101 pnkfelix 1.1.2.1 <BR> <B>modifies:</B> <code>this</code>, <code>node</code> 102 pnkfelix 1.1.2.1 <BR> <B>effects:</B> Moves <code>node</code> back into 103 pnkfelix 1.1.2.1 the graph. It also updates all edges and 104 pnkfelix 1.1.2.1 nodes of <code>this</code> to reflect 105 pnkfelix 1.1.2.1 that <code>node</code> has been replaced. 106 pnkfelix 1.1.2.1 */ 107 pnkfelix 1.1.2.1 abstract void unhideNode( ColorableNode node ); 108 pnkfelix 1.1.2.1 109 pnkfelix 1.1.2.1 /** Replaces all hidden nodes in graph. 110 pnkfelix 1.1.2.1 <BR> <B>modifies:</B> <code>this</code>, all 111 pnkfelix 1.1.2.1 <code>Node</code>s in <code>this</code> 112 pnkfelix 1.1.2.1 <BR> <B>effects:</B> If a node was previously removed from 113 pnkfelix 1.1.2.1 <code>this</code>, and has not been 114 pnkfelix 1.1.2.1 replaced since its last removal, then 115 pnkfelix 1.1.2.1 moves node (and all other hidden ones) 116 pnkfelix 1.1.2.1 back into the graph. It also updates all 117 pnkfelix 1.1.2.1 edges and nodes of <code>this</code> to 118 pnkfelix 1.1.2.1 reflect that the nodes have been 119 pnkfelix 1.1.2.1 replaced. 120 pnkfelix 1.1.2.1 */ 121 pnkfelix 1.1.2.1 abstract void unhideAllNodes(); 122 pnkfelix 1.1.2.1 123 pnkfelix 1.1.2.1 /** Ensures that only <code>ColorableNode</code>s are added to <code>this</code>. 124 pnkfelix 1.1.2.1 <BR> <B>requires:</B> <code>node</code> is an instance of a 125 pnkfelix 1.1.2.1 <code>ColorableNode</code>. 126 pnkfelix 1.1.2.1 <BR> <B>effects:</B> Does nothing. 127 pnkfelix 1.1.2.1 */ 128 pnkfelix 1.1.2.1 protected void checkNode( Node node ) { 129 pnkfelix 1.1.2.1 if (! (node instanceof ColorableNode) ) { 130 pnkfelix 1.1.2.1 throw new WrongNodeTypeException(node + " is not a ColorableNode."); 131 pnkfelix 1.1.2.1 } 132 pnkfelix 1.1.2.1 } 133 pnkfelix 1.1.2.1 134 pnkfelix 1.1.2.1 /** Wrapper class for Enumeration that filters out hidden nodes. */ 135 pnkfelix 1.1.2.1 protected static class HiddenFilteringEnum implements Enumeration { 136 pnkfelix 1.1.2.1 Enumeration nodes; 137 pnkfelix 1.1.2.1 ColorableNode next = null; 138 pnkfelix 1.1.2.1 139 pnkfelix 1.1.2.1 HiddenFilteringEnum(Enumeration e) { 140 pnkfelix 1.1.2.1 nodes = e; 141 pnkfelix 1.1.2.1 } 142 pnkfelix 1.1.2.1 143 pnkfelix 1.1.2.1 public boolean hasMoreElements() { 144 pnkfelix 1.1.2.1 while(next == null && nodes.hasMoreElements()) { 145 pnkfelix 1.1.2.1 ColorableNode n = (ColorableNode) 146 pnkfelix 1.1.2.1 nodes.nextElement(); 147 pnkfelix 1.1.2.1 if (! n.isHidden()) { 148 pnkfelix 1.1.2.1 next = n; 149 pnkfelix 1.1.2.1 } 150 pnkfelix 1.1.2.1 } 151 pnkfelix 1.1.2.1 return (next != null); 152 pnkfelix 1.1.2.1 } 153 pnkfelix 1.1.2.1 154 pnkfelix 1.1.2.1 public Object nextElement() { 155 pnkfelix 1.1.2.1 Object rtrn; 156 pnkfelix 1.1.2.1 if (hasMoreElements()) { 157 pnkfelix 1.1.2.1 rtrn = next; 158 pnkfelix 1.1.2.1 next = null; 159 pnkfelix 1.1.2.1 } else { 160 pnkfelix 1.1.2.1 throw new NoSuchElementException(); 161 pnkfelix 1.1.2.1 } 162 pnkfelix 1.1.2.1 return rtrn; 163 pnkfelix 1.1.2.1 } 164 pnkfelix 1.1.2.1 } 165 pnkfelix 1.1.2.1 166 pnkfelix 1.1.2.1 167 pnkfelix 1.1.2.1 /** Constructs an enumeration for all the nodes. 168 pnkfelix 1.1.2.1 <BR> <B>effects:</B> Returns an <code>Enumeration</code> of 169 pnkfelix 1.1.2.1 the <code>ColorableNode</code>s that have 170 pnkfelix 1.1.2.1 been successfully added to 171 pnkfelix 1.1.2.1 <code>this</code> that are not currently 172 pnkfelix 1.1.2.1 hidden. 173 pnkfelix 1.1.2.1 <BR> <B>requires:</B> <code>this</code> is not modified while 174 pnkfelix 1.1.2.1 the <code>Enumeration</code> returned is 175 pnkfelix 1.1.2.1 in use. 176 pnkfelix 1.1.2.1 */ 177 pnkfelix 1.1.2.1 public Enumeration getNodes() { 178 pnkfelix 1.1.2.1 HiddenFilteringEnum hf = new HiddenFilteringEnum(super.getNodes()); 179 pnkfelix 1.1.2.1 return hf; 180 pnkfelix 1.1.2.1 } 181 pnkfelix 1.1.2.1 182 pnkfelix 1.1.2.1 /** Modifiability check. 183 pnkfelix 1.1.2.1 Subclasses should override this method to incorporate 184 pnkfelix 1.1.2.1 consistency checks, and should ensure that they call 185 pnkfelix 1.1.2.1 <code>super.isModifiable</code> in their check. 186 pnkfelix 1.1.2.1 <BR> <B>effects:</B> if <code>this</code> is allowed to be 187 pnkfelix 1.1.2.1 modified, returns true. Else returns 188 pnkfelix 1.1.2.1 false. 189 pnkfelix 1.1.2.1 */ 190 pnkfelix 1.1.2.1 public boolean isModifiable() { 191 pnkfelix 1.1.2.1 return mutable && super.isModifiable(); 192 pnkfelix 1.1.2.1 } 193 pnkfelix 1.1.2.1 194 pnkfelix 1.1.2.1 195 pnkfelix 1.1.2.1 } 196 cananian 1.2