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 032525b..3d8cf58 100644 --- a/core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt +++ b/core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt @@ -10,13 +10,8 @@ abstract class BasicTree : Tree where T : BasicTree { protected abstract val self: T private val _parent = AtomicReference() - final override var parent: T? + final override val parent: T? get() = synchronized(this) { _parent.get() } - private set(value) { - synchronized(this) { - _parent.set(value) - } - } protected val childrenMap = AtomicReference(sortedMapOf()) final override val children: List @@ -25,25 +20,25 @@ abstract class BasicTree : Tree where T : BasicTree { fun addChild(child: T) { synchronized(this) { val newChildrenMap = childrenMap.get() - newChildrenMap[newChildrenMap.size] = child.also { it.parent = self } + newChildrenMap[newChildrenMap.size] = child.also { it.setParentTo(self) } childrenMap.set(newChildrenMap) } } - fun setChildren(children: List) = + fun setChildrenTo(children: List) = with(childrenMap) { synchronized(this) { val newChildrenMap = sortedMapOf() children.forEachIndexed { i, child -> - newChildrenMap[i] = child.also { it.parent = self } + newChildrenMap[i] = child.also { it.setParentTo(self) } } this.set(newChildrenMap) } } - fun setParent(parent: T?) { + fun setParentTo(parent: T?) { synchronized(this) { - this.parent = parent + _parent.set(parent) } } 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 10582e1..b19f4e0 100644 --- a/core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt +++ b/core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt @@ -19,7 +19,7 @@ class GumTree : BasicTree(), Traversable, Comparable } val newChildrenMap = childrenMap.get() - newChildrenMap[pos] = child.also { it.setParent(this) } + newChildrenMap[pos] = child.also { it.setParentTo(this) } childrenMap.set(newChildrenMap) } }