1 cananian 1.1.2.1 // CloningTempMap.java, created Sat Jan 23 02:05:02 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.Temp;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 import harpoon.Util.Util;
 7 cananian 1.1.2.1 
 8 cananian 1.1.2.5 import java.util.Collections;
 9 cananian 1.1.2.4 import java.util.HashMap;
10 cananian 1.1.2.4 import java.util.Map;
11 cananian 1.1.2.1 /**
12 cananian 1.1.2.1  * A <code>CloningTempMap</code> maps <code>Temp</code>s from one
13 cananian 1.1.2.4  * <code>TempFactory</code> to equivalent <code>Temp</code>s in another,
14 cananian 1.1.2.4  * creating new <code>Temp</code>s as necessary.
15 cananian 1.1.2.1  * 
16 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
17 cananian 1.5      * @version $Id: CloningTempMap.java,v 1.5 2002/09/01 07:39:25 cananian Exp $
18 cananian 1.1.2.1  */
19 cananian 1.1.2.1 public class CloningTempMap implements TempMap {
20 cananian 1.5         private final Map<Temp,Temp> h = new HashMap<Temp,Temp>();
21 cananian 1.1.2.1     private final TempFactory old_tf;
22 cananian 1.1.2.1     private final TempFactory new_tf;
23 cananian 1.1.2.1     
24 cananian 1.1.2.1     /** Creates a <code>CloningTempMap</code>, given the
25 cananian 1.1.2.1      * source and destination <code>TempFactory</code>s.
26 cananian 1.1.2.1      */
27 cananian 1.1.2.1     public CloningTempMap(TempFactory old_tf, TempFactory new_tf) {
28 cananian 1.1.2.1         this.old_tf = old_tf; this.new_tf = new_tf;
29 cananian 1.3.2.1         assert old_tf != null : "old temp factory is null";
30 cananian 1.3.2.1         assert new_tf != null : "new temp factory is null";
31 cananian 1.1.2.1     }
32 cananian 1.1.2.1 
33 cananian 1.1.2.4     /** Return a <code>Temp</code> from the <code>new_tf</code>
34 cananian 1.1.2.4      *  <code>TempFactory</code> that corresponds to the specified
35 cananian 1.1.2.4      *  <code>Temp</code> <code>t</code> from the <code>old_tf</code>
36 cananian 1.1.2.4      *  <code>TempFactory</code>, creating it if necessary. */
37 cananian 1.1.2.1     public Temp tempMap(Temp t) {
38 cananian 1.3.2.1         assert t.tempFactory() == old_tf : "TempFactories should match";
39 cananian 1.5             Temp r = h.get(t);
40 cananian 1.1.2.1         if (r==null) {
41 cananian 1.1.2.1             r = t.clone(new_tf);
42 cananian 1.1.2.1             h.put(t, r);
43 cananian 1.1.2.1         }
44 cananian 1.3.2.1         assert r.tempFactory() == new_tf;
45 cananian 1.1.2.1         return r;
46 cananian 1.1.2.4     }
47 cananian 1.1.2.4 
48 cananian 1.1.2.4     /** Provide access to an unmodifiable version of this 
49 cananian 1.1.2.4      *  <code>TempMap</code. */
50 cananian 1.1.2.4     public TempMap unmodifiable() {
51 cananian 1.1.2.4         return new TempMap() {
52 cananian 1.5                 public Temp tempMap(Temp t) { return h.get(t); }
53 cananian 1.1.2.4         };
54 cananian 1.1.2.1     }
55 cananian 1.1.2.5     /** Provide access to an unmodifiable version of this
56 cananian 1.1.2.5      *  <code>Temp</code> mapping, as a <code>java.util.Map</code>. */
57 cananian 1.5         public Map<Temp,Temp> asMap() { return Collections.unmodifiableMap(h); }
58 cananian 1.2     }