X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.runtime%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fruntime%2Fchr%2FCHRPriorityFactContainer.java;fp=bundles%2Forg.simantics.scl.runtime%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fruntime%2Fchr%2FCHRPriorityFactContainer.java;h=bedb8e0e1349ed712e10dd49230d4b2f4037ee56;hp=0000000000000000000000000000000000000000;hb=a2df536f7fc878982c6c960a79ed49f350cddc6f;hpb=5f0ad7a26810df602600c5eddad317588fce0ac4 diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/CHRPriorityFactContainer.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/CHRPriorityFactContainer.java new file mode 100644 index 000000000..bedb8e0e1 --- /dev/null +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/CHRPriorityFactContainer.java @@ -0,0 +1,59 @@ +package org.simantics.scl.runtime.chr; + +import java.util.Arrays; + +import org.simantics.scl.runtime.reporting.SCLReporting; + +public abstract class CHRPriorityFactContainer extends CHRPriority { + private static final boolean CLEANUP_ENABLED = true; + private static final int INITIAL_FACT_ARRAY_SIZE = 4; + + private CHRFact[] facts = new CHRFact[INITIAL_FACT_ARRAY_SIZE]; + private int size; + + public CHRPriorityFactContainer(int priority) { + super(priority); + } + + public boolean isEmpty() { + return size == 0; + } + + public void addFact(CHRContext context, CHRFact item) { + //SCLReporting.print("added " + item + " to " + this); + ensureInContext(context); + if(size == facts.length) + increaseCapacity(); + facts[size++] = item; + } + + private void increaseCapacity() { + if(CLEANUP_ENABLED) { + // Cleanup dead facts + int j=0; + for(int i=0;i= 0) + facts[j++] = fact; + } + size = j; + } + + // Resize if necessary + if(size >= facts.length*3/4) + facts = Arrays.copyOf(facts, size*2); + } + + @Override + public void activate(CHRContext context) { + while(size > 0) { + --size; + CHRFact fact = facts[size]; + facts[size] = null; + if(fact.id >= 0) + activate(context, fact); + } + } + + protected abstract void activate(CHRContext context, CHRFact fact); +}