Package containsLinda

Source Code of containsLinda.ContainsLinda

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);
  }

}
TOP

Related Classes of containsLinda.ContainsLinda

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.