From d1ec00d2a5c23b172702781eb82f313d1f74f313 Mon Sep 17 00:00:00 2001 From: Xanonymous Date: Sat, 17 Aug 2024 18:14:30 +0100 Subject: [PATCH] =?UTF-8?q?perf:=20=E2=9A=A1=EF=B8=8F=20avoid=20calling=20?= =?UTF-8?q?recursive=20copy=20constructors=20many=20times?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt | 2 +- core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt | 8 ++++---- core/src/main/kotlin/tw/xcc/gumtree/model/GumTreeView.kt | 8 ++++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt b/core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt index bee6f19..6ae4cb4 100644 --- a/core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt +++ b/core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt @@ -74,7 +74,7 @@ abstract class BasicTree : Serializable, Tree, Traversable where T : Basic synchronized(this) { val newChildrenList = mutableListOf() newChildrenList.addAll(children) - newChildrenList.forEach { it.setParentTo(self) } + newChildrenList.forEach { it.parent.set(self) } this.set(newChildrenList) } } diff --git a/core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt b/core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt index 21e07a5..04043ca 100644 --- a/core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt +++ b/core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt @@ -73,10 +73,10 @@ open class GumTree( open fun toNewFrozen(): GumTreeView = synchronized(this) { - val children = childrenList.get() - children.replaceAll { it.toNewFrozen() } - childrenList.set(children) - return GumTreeView.from(this) + val frozen = GumTreeView.from(this) + val children = getChildren() + frozen.setChildrenToImpl(children.map { it.toNewFrozen() }) + return frozen } infix fun hasSameTypeAs(other: GumTree): Boolean = info.type == other.info.type diff --git a/core/src/main/kotlin/tw/xcc/gumtree/model/GumTreeView.kt b/core/src/main/kotlin/tw/xcc/gumtree/model/GumTreeView.kt index 19ea058..00d01d2 100644 --- a/core/src/main/kotlin/tw/xcc/gumtree/model/GumTreeView.kt +++ b/core/src/main/kotlin/tw/xcc/gumtree/model/GumTreeView.kt @@ -1,6 +1,10 @@ package tw.xcc.gumtree.model -class GumTreeView private constructor(target: GumTree) : GumTree(target) { +class GumTreeView private constructor(target: GumTree) : GumTree(target.info.copy()) { + init { + super.idRef.set(target.id) + } + private val frozenPreOrdered by lazy { super.preOrdered() } private val frozenPostOrdered by lazy { super.postOrdered() } private val frozenDescendents by lazy { frozenPreOrdered.drop(1) } @@ -64,6 +68,6 @@ class GumTreeView private constructor(target: GumTree) : GumTree(target) { companion object { fun from(gumTree: GumTree): GumTreeView = GumTreeView(gumTree) - fun frozeEntireTreeFrom(gumTree: GumTree): GumTreeView = GumTree(gumTree).toNewFrozen() + fun frozeEntireTreeFrom(gumTree: GumTree): GumTreeView = gumTree.toNewFrozen() } } \ No newline at end of file