package containsLinda;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import linda.ILinda;
import linda.LindaArgs;
public class ContainsLinda implements ILinda {
protected HashMap<List<Integer>, ArrayList<LindaArgs>> tuplespace =
new HashMap<List<Integer>, ArrayList<LindaArgs>>();
@Override
public void output(LindaArgs args) {
List<Integer> typesPath = args.getTypesPath();
if (!tuplespace.containsKey(typesPath)) {
tuplespace.put(typesPath, new ArrayList<LindaArgs>());
}
ArrayList<LindaArgs> tuplespaceEx = tuplespace.get(typesPath);
synchronized (tuplespaceEx) {
tuplespaceEx.add(args);
}
}
private boolean auxiliaryGet(LindaArgs pattern, boolean remove, boolean block) {
List<Integer> typesPath = pattern.getTypesPath();
if (!tuplespace.containsKey(typesPath)) {
tuplespace.put(typesPath, new ArrayList<LindaArgs>());
}
ArrayList<LindaArgs> tuplespaceEx = tuplespace.get(typesPath);
while (true) {
synchronized (tuplespaceEx) {
// Look for sub patterns (may be speedup)
if (tuplespaceEx.contains(pattern)) {
LindaArgs result = new LindaArgs(pattern);
pattern.applyResult(result);
if (remove) {
tuplespaceEx.remove(pattern);
}
return true;
}
// More general search
for (Iterator<LindaArgs> iterator = tuplespaceEx.iterator(); iterator.hasNext();) {
LindaArgs tuple = iterator.next();
if (tuple.matchTuples(pattern)) {
LindaArgs result = new LindaArgs(tuple);
pattern.applyResult(result);
if (remove) {
iterator.remove();
}
return true;
}
}
if (!block) {
break;
}
}
}
return false;
}
@Override
public void input(LindaArgs pattern) {
auxiliaryGet(pattern, true, true);
}
@Override
public void read(LindaArgs pattern) {
auxiliaryGet(pattern, false, true);
}
@Override
public boolean tryInput(LindaArgs pattern) {
return auxiliaryGet(pattern, true, false);
}
@Override
public boolean tryRead(LindaArgs pattern) {
return auxiliaryGet(pattern, false, false);
}
}