From b201e82cddce1d9eaf5ea9eb29e8b31db71b1623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 21 Jun 2018 14:39:48 +0200 Subject: [PATCH] Fix some methods --- tree_node.cpp | 17 ++++++++--------- tree_node.h | 21 ++++++++++++++++----- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/tree_node.cpp b/tree_node.cpp index 2c131a9fa..edc4beee7 100644 --- a/tree_node.cpp +++ b/tree_node.cpp @@ -7,18 +7,17 @@ void TreeNode::release() { m_referenceCounter--; if (m_referenceCounter == 0) { if (numberOfChildren() != 0) { - int lastIdentifier = lastDescendant()->identifier(); + int lastIdentifier = lastChild()->identifier(); TreeNode * child = next(); - do { - bool childWillBeDeleted = (child->m_referenceCounter == 1); + bool lastChildReleased = false; + while (!lastChildReleased) { + lastChildReleased = child->identifier() == lastIdentifier; + int nextSiblingIdentifier = lastChildReleased ? -1 : child->nextSibling()->identifier(); child->release(); - if (!childWillBeDeleted) { - printf("Incrementing iterator\n"); - child = child->next(); - } else { - printf("Keeping iterator\n"); + if (nextSiblingIdentifier != -1) { + child = TreePool::sharedPool()->node(nextSiblingIdentifier); } - } while (child->identifier() != lastIdentifier); + } } printf("Delete %d(%p)\n", m_identifier, this); int identifier = m_identifier; diff --git a/tree_node.h b/tree_node.h index de27920e4..059d19891 100644 --- a/tree_node.h +++ b/tree_node.h @@ -131,17 +131,17 @@ public: } TreeNode * nextSibling() const { - TreeNode * node = const_cast(this); - int remainingNodesToVisit = 0; - do { + int remainingNodesToVisit = numberOfChildren(); + TreeNode * node = const_cast(this)->next(); + while (remainingNodesToVisit > 0) { remainingNodesToVisit += node->numberOfChildren(); node = node->next(); remainingNodesToVisit--; - } while (remainingNodesToVisit > 0); + } return node; } - TreeNode * lastDescendant() const { + /*TreeNode * lastDescendant() const { TreeNode * node = const_cast(this); int remainingNodesToVisit = node->numberOfChildren(); while (remainingNodesToVisit > 0) { @@ -150,6 +150,17 @@ public: remainingNodesToVisit += node->numberOfChildren(); } return node; + }*/ + + TreeNode * lastChild() const { + if (numberOfChildren() == 0) { + return const_cast(this); + } + TreeNode * node = next(); + for (int i = 0; i < numberOfChildren() - 1; i++) { + node = node->nextSibling(); + } + return node; } size_t deepSize() const {