From c282911a3c24582967539d3bd490a66215ee73b8 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Thu, 30 Jul 2020 17:00:18 +0200 Subject: [PATCH] Provide support for tracking usages number of MutableLogical. --- .../reactor/core/internal/LogicalImpl.kt | 28 +++++++++++++++---- .../logic/reactor/logical/MutableLogical.java | 4 +++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/LogicalImpl.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/LogicalImpl.kt index 7e21e72b..0c08d26c 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/LogicalImpl.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/LogicalImpl.kt @@ -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 : MutableLogical { var rank = 0 + var usagesCount = 0 + val valueObservers = ArrayList, LogicalObserver>>() val parentObservers = ArrayList, LogicalObserver>>() @@ -99,22 +102,22 @@ internal class LogicalImpl : MutableLogical { // 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 : MutableLogical { } 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) { @@ -157,6 +163,14 @@ internal class LogicalImpl : MutableLogical { find().parentObservers.remove(this to observer) } + override fun incUsagesCount(logicalOwner: LogicalOwner?) { + incUsages() + } + + override fun usagesCount(): Int { + return usagesCount + } + private fun find(): LogicalImpl { val tmp = _parent if (tmp == null) return this @@ -171,6 +185,8 @@ internal class LogicalImpl : MutableLogical { private fun incRank() { rank++ } + private fun incUsages() { usagesCount++ } + private fun setParent(parent: LogicalImpl) { this._parent = parent notifyParentUpdated() diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/logical/MutableLogical.java b/reactor/Core/src/jetbrains/mps/logic/reactor/logical/MutableLogical.java index c841a740..74f7f513 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/logical/MutableLogical.java +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/logical/MutableLogical.java @@ -49,6 +49,10 @@ public interface MutableLogical extends Logical { */ void setValue(T newValue); + void incUsagesCount(LogicalOwner logicalOwner); + + int usagesCount(); + interface ValueReconciler { void reconcile(T valueA, T valueB);