Provide support for tracking usages number of MutableLogical.

This commit is contained in:
Fedor Isakov 2020-07-30 17:00:18 +02:00
parent fe1df249d5
commit c282911a3c
2 changed files with 26 additions and 6 deletions

View File

@ -17,6 +17,7 @@
package jetbrains.mps.logic.reactor.core.internal
import jetbrains.mps.logic.reactor.core.LogicalObserver
import jetbrains.mps.logic.reactor.logical.LogicalOwner
import jetbrains.mps.logic.reactor.logical.MutableLogical
import jetbrains.mps.logic.reactor.logical.MetaLogical
import java.util.ArrayList
@ -37,6 +38,8 @@ internal class LogicalImpl<T> : MutableLogical<T> {
var rank = 0
var usagesCount = 0
val valueObservers = ArrayList<Pair<LogicalImpl<*>, LogicalObserver>>()
val parentObservers = ArrayList<Pair<LogicalImpl<*>, LogicalObserver>>()
@ -99,22 +102,22 @@ internal class LogicalImpl<T> : MutableLogical<T> {
// invariant: thisRepr.rank > otherRepr.rank
if (thisRepr.rank() < otherRepr.rank()) {
otherRepr.union(thisRepr, reconciler);
otherRepr.union(thisRepr, reconciler)
return
} else if (thisRepr.rank() == otherRepr.rank()) {
if (thisRepr._value == null && otherRepr._value != null) {
otherRepr.union(thisRepr, reconciler);
otherRepr.union(thisRepr, reconciler)
return
} else {
thisRepr.incRank();
thisRepr.incRank()
}
}
val thisVal = thisRepr.value();
val otherVal = otherRepr.value();
val thisVal = thisRepr.value()
val otherVal = otherRepr.value()
// first copy the value
if (thisVal == null && otherVal != null) {
@ -139,8 +142,11 @@ internal class LogicalImpl<T> : MutableLogical<T> {
} else if (thisVal != null && otherVal != null) {
// ground ground
reconciler.reconcile(thisVal, otherVal);
reconciler.reconcile(thisVal, otherVal)
}
// copy usages
thisRepr.usagesCount += otherRepr.usagesCount
}
override fun union(other: MutableLogical<T>) {
@ -157,6 +163,14 @@ internal class LogicalImpl<T> : MutableLogical<T> {
find().parentObservers.remove(this to observer)
}
override fun incUsagesCount(logicalOwner: LogicalOwner?) {
incUsages()
}
override fun usagesCount(): Int {
return usagesCount
}
private fun find(): LogicalImpl<T> {
val tmp = _parent
if (tmp == null) return this
@ -171,6 +185,8 @@ internal class LogicalImpl<T> : MutableLogical<T> {
private fun incRank() { rank++ }
private fun incUsages() { usagesCount++ }
private fun setParent(parent: LogicalImpl<T>) {
this._parent = parent
notifyParentUpdated()

View File

@ -49,6 +49,10 @@ public interface MutableLogical<T> extends Logical<T> {
*/
void setValue(T newValue);
void incUsagesCount(LogicalOwner logicalOwner);
int usagesCount();
interface ValueReconciler<T> {
void reconcile(T valueA, T valueB);