Ensure the data is associated with nodes using identity, except variables, which are identified by symbol

This commit is contained in:
Fedor Isakov 2015-03-22 15:10:41 +01:00
parent 004480ca70
commit 690e2929bb
1 changed files with 11 additions and 9 deletions

View File

@ -42,7 +42,7 @@ import java.util.*;
*/
public class UnionFindTermGraphUnifier {
private Map<Object, Data> myData = new HashMap<Object, Data>();
private Map<Object, Data> myData = new IdentityHashMap<Object, Data>();
public Substitution unify(Node a, Node b) {
if (!unifClosure(a, b)) {
@ -287,7 +287,16 @@ public class UnionFindTermGraphUnifier {
}
private boolean hasData(Node n) {
return myData.containsKey(n);
Object key = n.is(Node.Kind.VAR) ? String.valueOf(n.symbol()).intern() : n;
return myData.containsKey(key);
}
private Data getData(Node n) {
Object key = n.is(Node.Kind.VAR) ? String.valueOf(n.symbol()).intern() : n;
if (myData.containsKey(key)) return myData.get(key);
Data data = new Data(n);
myData.put(key, data);
return data;
}
private List<Node> collectVars(Node n) {
@ -297,13 +306,6 @@ public class UnionFindTermGraphUnifier {
return Collections.<Node>emptyList();
}
private Data getData(Node n) {
if (myData.containsKey(n)) return myData.get(n);
Data data = new Data(n);
myData.put(n, data);
return data;
}
private boolean eq(Object a, Object b) {
return a == null ? b == null : a.equals(b);
}