package com.juliasoft.beedeedee.factories; import java.util.Arrays; public class RenameWithLeaderCache { private int[] bdds; private EquivalenceRelation[] ers; private int[] results; private final Object[] locks = new Object[100]; RenameWithLeaderCache(int size) { bdds = new int[size]; ers = new EquivalenceRelation[size]; results = new int[size]; clear(); for (int i = 0; i < locks.length; i++) locks[i] = new Object(); } void clear() { Arrays.fill(bdds, -1); } public int get(int bdd, EquivalenceRelation er) { int pos = hash(bdd, er); synchronized (locks[pos % locks.length]) { return bdds[pos] == bdd && ers[pos] == er ? results[pos] : -1; } } public void put(int bdd, EquivalenceRelation er, int res) { int pos = hash(bdd, er); synchronized (locks[pos % locks.length]) { bdds[pos] = bdd; ers[pos] = er; results[pos] = res; } } private int hash(int bdd, EquivalenceRelation er) { return Math.abs((bdd ^ er.hashCode()) % bdds.length); } }