/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package datapath.graph; import datapath.graph.operations.Operation; import datapath.graph.operations.Dummy; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Set; /** * * @author Jens */ public class Mapping<E> { private HashMap<E, Operation> map; private HashMap<E, Dummy> dummys; private HashMap<Dummy, HashSet<E>> dummyKeys; public Mapping() { map = new HashMap<E, Operation>(); dummys = new HashMap<E, Dummy>(); dummyKeys = new HashMap<Dummy, HashSet<E>>(); } public void addToMap(E key, Operation tree) { assert key != null : "no declaration"; assert tree != null : "no operation"; assert !map.containsKey(key) : "new value for declaration " + key + " -> " + map.get(key) + " new: " + tree; HashSet<E> removedDummyKeys = null; if (dummys.containsKey(key)) { Dummy dummy = dummys.get(key); dummy.replaceWith(tree); //dummys.remove(key); removedDummyKeys = removeDummy(key); } if (tree instanceof Dummy) { addDummy(key, (Dummy) tree); } else { if(removedDummyKeys != null){ for(E k : removedDummyKeys) map.put(k, tree); } map.put(key, tree); } } public Operation getFromMap(E decl) { Operation ret = map.get(decl); if (ret == null) { ret = dummys.get(decl); if (ret == null) { ret = new Dummy(null); ret.setDebugMessage(decl.toString()); addDummy(decl, (Dummy) ret); } } return ret; } public Set<E> keySet() { return map.keySet(); } public Set<E> dummyKeySet() { return dummys.keySet(); } public Collection<Dummy> getDummys() { return dummys.values(); } private void addDummy(E key, Dummy dummy) { assert !dummys.containsKey(key); dummys.put(key, dummy); HashSet<E> keys = dummyKeys.get(dummy); if (keys == null) { keys = new HashSet<E>(); dummyKeys.put(dummy, keys); } keys.add(key); } private HashSet<E> removeDummy(E key) { assert dummys.containsKey(key); Dummy dummy = dummys.remove(key); HashSet<E> keys = dummyKeys.get(dummy); assert keys != null; for(E k : keys){ dummys.remove(k); } return dummyKeys.remove(dummy); } }