From f67eb9c0a88f181f07fd372f0e0d31b76e7ecd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 26 Jun 2018 17:59:30 +0200 Subject: [PATCH] TreeReferences do not deepcopy unless asked --- addition_node.h | 7 ++----- char_layout_node.h | 4 ++-- cursor.h | 8 ++++++-- expression_reference.h | 2 +- float_node.h | 6 ++---- layout_reference.h | 2 +- test.cpp | 21 +++++++++++---------- tree_node.cpp | 1 + tree_reference.h | 23 ++++++++++++++++++----- 9 files changed, 44 insertions(+), 30 deletions(-) diff --git a/addition_node.h b/addition_node.h index b03278a70..4476a7374 100644 --- a/addition_node.h +++ b/addition_node.h @@ -36,9 +36,9 @@ public: */ }; -class Addition : public ExpressionReference { +class AdditionRef : public ExpressionReference { public: - Addition(Expression e1, Expression e2) : + AdditionRef(ExpressionRef e1, ExpressionRef e2) : ExpressionReference() { addOperand(e2); @@ -46,7 +46,4 @@ public: } }; - -//typedef ExpressionReference Addition; - #endif diff --git a/char_layout_node.h b/char_layout_node.h index f7f072a2a..3ea2f04ed 100644 --- a/char_layout_node.h +++ b/char_layout_node.h @@ -47,9 +47,9 @@ private: char m_char; }; -class CharLayout : public LayoutReference { +class CharLayoutRef : public LayoutReference { public: - CharLayout(char c) : LayoutReference() { + CharLayoutRef(char c) : LayoutReference() { this->node()->setChar(c); } }; diff --git a/cursor.h b/cursor.h index 6085509d7..d6ab875d5 100644 --- a/cursor.h +++ b/cursor.h @@ -10,8 +10,12 @@ class Cursor { public: TreeReference treeReference() { return m_treeReference; } int treeReferenceIdentifier() { return m_treeReference.identifier(); } - void setTreeReference(TreeReference t) { m_treeReference = t; } - void setTreeNode(TreeNode * t) { m_treeReference = TreeReference(t); } + void setTreeReference(TreeReference t) { + m_treeReference = t; + } + void setTreeNode(TreeNode * t) { + m_treeReference = TreeReference(t); + } bool isDefined() const { return m_treeReference.isDefined(); } protected: Cursor(TreeNode * node) : m_treeReference(node) {} diff --git a/expression_reference.h b/expression_reference.h index 072699f71..0ba47873c 100644 --- a/expression_reference.h +++ b/expression_reference.h @@ -44,6 +44,6 @@ public: */ }; -typedef ExpressionReference Expression; +typedef ExpressionReference ExpressionRef; #endif diff --git a/float_node.h b/float_node.h index 3385544f2..2074c19e7 100644 --- a/float_node.h +++ b/float_node.h @@ -28,13 +28,11 @@ private: float m_value; }; -class Float : public ExpressionReference { +class FloatRef : public ExpressionReference { public: - Float(float f) : ExpressionReference() { + FloatRef(float f) : ExpressionReference() { this->node()->setFloat(f); } }; -//typedef ExpressionReference Float; - #endif diff --git a/layout_reference.h b/layout_reference.h index b9659ab8f..a6178a95a 100644 --- a/layout_reference.h +++ b/layout_reference.h @@ -47,6 +47,6 @@ public: } }; -typedef LayoutReference Layout; +typedef LayoutReference LayoutRef; #endif diff --git a/test.cpp b/test.cpp index 9207edbf4..d2d9d31f8 100644 --- a/test.cpp +++ b/test.cpp @@ -5,10 +5,10 @@ #include "cursor.h" #include -Addition buildAddition() { - Float smallFloat(0.2f); - Float bigFloat(3.4f); - Addition a(smallFloat, bigFloat); +AdditionRef buildAddition() { + FloatRef smallFloat(0.2f); + FloatRef bigFloat(3.4f); + AdditionRef a(smallFloat, bigFloat); TreePool::sharedPool()->log(); return a; } @@ -23,21 +23,22 @@ int main() { TreePool::sharedPool()->log();*/ printf("\nCHAR LAYOUT\n"); - CharLayout aChar('c'); - CharLayout bChar('b'); + CharLayoutRef aChar('c'); + CharLayoutRef bChar('b'); TreePool::sharedPool()->log(); - HorizontalLayout h(aChar, bChar); + HorizontalLayoutRef h(aChar, bChar); TreePool::sharedPool()->log(); LayoutCursor cursor = h.childAtIndex(1).cursor(); - LayoutCursor cursor2 = aChar.cursor(); - cursor.log(); + // LayoutCursor cursor2 = aChar.cursor(); + /*cursor.log(); bool recompute = false; cursor.moveLeft(&recompute); cursor.log(); cursor.moveLeft(&recompute); - cursor.log(); + cursor.log();*/ + TreePool::sharedPool()->log(); /*cursor.log(); bool recompute = false; diff --git a/tree_node.cpp b/tree_node.cpp index 605cc43a2..d4ae12a57 100644 --- a/tree_node.cpp +++ b/tree_node.cpp @@ -1,6 +1,7 @@ #include "tree_node.h" #include "tree_pool.h" #include "expression_node.h" +#include // Node operations diff --git a/tree_reference.h b/tree_reference.h index d99894089..e3d035f70 100644 --- a/tree_reference.h +++ b/tree_reference.h @@ -18,9 +18,22 @@ class TreeReference { friend class LayoutReference; public: TreeReference(const TreeReference & tr) { - int trNodeIdentifier = tr.identifier(); - TreeNode * nodeCopy = TreePool::sharedPool()->deepCopy(TreePool::sharedPool()->node(trNodeIdentifier)); - m_identifier = nodeCopy->identifier(); + setTo(tr); + } + + TreeReference& operator=(const TreeReference& tr) { + setTo(tr); + return *this; + } + + void setTo(const TreeReference & tr) { + m_identifier = tr.identifier(); + TreePool::sharedPool()->node(m_identifier)->retain(); + } + + TreeReference clone() const { + TreeNode * nodeCopy = TreePool::sharedPool()->deepCopy(node()); + return TreeReference(nodeCopy); } ~TreeReference() { @@ -63,8 +76,8 @@ public: // Hierarchy operations void addChild(TreeReference t) { - TreeNode * deepCopy = TreePool::sharedPool()->deepCopy(t.node()); - TreePool::sharedPool()->move(deepCopy, node()->next()); + t.node()->retain(); + TreePool::sharedPool()->move(t.node(), node()->next()); } void removeChild(TreeReference t) {