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 }