1 pnkfelix 1.1.2.1 // UseDefer.java, created Thu Jan 27 15:33:54 2000 by pnkfelix
 2 cananian 1.1.2.5 // Copyright (C) 2000 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.IR.Properties;
 5 pnkfelix 1.1.2.1 
 6 pnkfelix 1.1.2.1 import harpoon.ClassFile.HCodeElement;
 7 pnkfelix 1.1.2.1 import harpoon.Temp.Temp;
 8 pnkfelix 1.1.2.1 import java.util.Collection;
 9 pnkfelix 1.1.2.1 
10 pnkfelix 1.1.2.1 /**
11 cananian 1.1.2.3  * <code>UseDefer</code> provides a means to externally associate use and
12 cananian 1.1.2.3  * def information with elements of an intermediate representation.
13 pnkfelix 1.1.2.1  * 
14 cananian 1.1.2.5  * @author  Felix S. Klock II <pnkfelix@mit.edu>
15 cananian 1.5      * @version $Id: UseDefer.java,v 1.5 2004/02/08 05:01:39 cananian Exp $
16 pnkfelix 1.1.2.1  */
17 cananian 1.2.2.1 public abstract class UseDefer<HCE extends HCodeElement> {
18 pnkfelix 1.1.2.1     
19 pnkfelix 1.1.2.2     /** Return all the <code>Temp</code>s used by <code>hce</code>. */ 
20 cananian 1.2.2.1     public Temp[] use(HCE hce) {
21 cananian 1.5             Collection<Temp> c = useC(hce);
22 pnkfelix 1.1.2.1         return (Temp[]) c.toArray(new Temp[c.size()]);
23 pnkfelix 1.1.2.1     }
24 pnkfelix 1.1.2.2 
25 pnkfelix 1.1.2.2     /** Return all the <code>Temp</code>s defined by
26 pnkfelix 1.1.2.2         <code>hce</code>. 
27 pnkfelix 1.1.2.2     */  
28 cananian 1.2.2.1     public Temp[] def(HCE hce) {
29 cananian 1.5             Collection<Temp> c = defC(hce);
30 pnkfelix 1.1.2.1         return (Temp[]) c.toArray(new Temp[c.size()]);
31 pnkfelix 1.1.2.1     }
32 pnkfelix 1.1.2.1 
33 pnkfelix 1.1.2.2     /** Returns a <code>Collection</code> of all the
34 pnkfelix 1.1.2.2         <code>Temp</code>s that may be read by <code>hce</code>. 
35 pnkfelix 1.1.2.2     */
36 cananian 1.2.2.1     public abstract Collection<Temp> useC(HCE hce);
37 pnkfelix 1.1.2.2 
38 pnkfelix 1.1.2.2     /** Returns a <code>Collection</code> of all the
39 pnkfelix 1.1.2.2         <code>Temp</code>s that are defined by <code>hce</code>. 
40 pnkfelix 1.1.2.2     */
41 cananian 1.2.2.1     public abstract Collection<Temp> defC(HCE hce);
42 pnkfelix 1.1.2.1     
43 pnkfelix 1.1.2.2     /** Default <code>UseDefer</code> for <code>HCodeElement</code>s
44 cananian 1.1.2.4         which implement <code>UseDefable</code>.  Does nothing but cast
45 pnkfelix 1.1.2.2         the supplied <code>HCodeElement</code> to a
46 cananian 1.1.2.4         <code>UseDefable</code> and invoke the appropriate corresponding
47 cananian 1.1.2.4         method in the <code>UseDefable</code> interface.
48 pnkfelix 1.1.2.2         @see java.util.Comparator
49 pnkfelix 1.1.2.2         @see java.lang.Comparable
50 cananian 1.4             @see net.cscott.jutil.Default.comparator
51 pnkfelix 1.1.2.2     */
52 cananian 1.2.2.1     // see commentary on CFGrapher.DEFAULT.
53 pnkfelix 1.1.2.2     public static final UseDefer DEFAULT = new UseDefer() {
54 cananian 1.2.2.1         public Collection<Temp> useC(HCodeElement hce) {
55 cananian 1.1.2.4             return ((UseDefable)hce).useC();
56 pnkfelix 1.1.2.2         }
57 cananian 1.2.2.1         public Collection<Temp> defC(HCodeElement hce) {
58 cananian 1.1.2.4             return ((UseDefable)hce).defC();
59 pnkfelix 1.1.2.2         }
60 pnkfelix 1.1.2.2     };
61 pnkfelix 1.1.2.1 
62 cananian 1.2     }