diff --git a/addition_node.h b/addition_node.h index 3639c7098..7c7d1cecc 100644 --- a/addition_node.h +++ b/addition_node.h @@ -44,10 +44,10 @@ public: } int numberOfChildren() const override { return m_numberOfChildren; } - void incrementNumberOfChildren() override { m_numberOfChildren++; } - void decrementNumberOfChildren() override { + void incrementNumberOfChildren(int increment = 1) override { m_numberOfChildren+= increment; } + void decrementNumberOfChildren(int decrement = 1) override { assert(m_numberOfChildren > 0); - m_numberOfChildren--; + m_numberOfChildren-= decrement; } void eraseNumberOfChildren() override { m_numberOfChildren = 0; diff --git a/expression_node.h b/expression_node.h index 444fc17ba..d0e45c238 100644 --- a/expression_node.h +++ b/expression_node.h @@ -8,7 +8,8 @@ public: enum class Type : uint8_t { AllocationFailure = 0, Float = 1, - Addition + Addition, + SimplificationRoot }; // Expression diff --git a/horizontal_layout_node.h b/horizontal_layout_node.h index f412b20d8..53d332976 100644 --- a/horizontal_layout_node.h +++ b/horizontal_layout_node.h @@ -17,10 +17,10 @@ public: } int numberOfChildren() const override { return m_numberOfChildren; } - void incrementNumberOfChildren() override { m_numberOfChildren++; } - void decrementNumberOfChildren() override { + void incrementNumberOfChildren(int increment = 1) override { m_numberOfChildren+= increment; } + void decrementNumberOfChildren(int decrement = 1) override { assert(m_numberOfChildren > 0); - m_numberOfChildren--; + m_numberOfChildren-= decrement; } void eraseNumberOfChildren() override { m_numberOfChildren = 0; diff --git a/refs.h b/refs.h index 7135baceb..b5892885b 100644 --- a/refs.h +++ b/refs.h @@ -1,6 +1,7 @@ #include "addition_node.h" #include "allocation_failed_expression_node.h" #include "float_node.h" +#include "simplification_root_node.h" #include "char_layout_node.h" #include "horizontal_layout_node.h" diff --git a/test.cpp b/test.cpp index 98fdaeaa2..cd43a074b 100644 --- a/test.cpp +++ b/test.cpp @@ -232,7 +232,7 @@ void testSimplify() { FloatRef(2.0f)); assert_expression_approximates_to(a, 3); - + SimplificationRootRef b(a); a.deepReduce(); assert_expression_approximates_to(a, 3); @@ -277,7 +277,8 @@ int main() { runTest(testPoolExpressionAllocationFail); runTest(testPoolExpressionAllocationFail2); runTest(testPoolExpressionAllocationFailOnImbricatedAdditions); - //runTest(testStealOperand); + runTest(testStealOperand); + runTest(testSimplify); printf("\n*******************\nEnd of tests\n*******************\n\n"); return 0; } diff --git a/tree_node.h b/tree_node.h index 1bf1de357..0d73a11bd 100644 --- a/tree_node.h +++ b/tree_node.h @@ -51,8 +51,8 @@ public: TreeNode * parentTree() const; TreeNode * editableRootTree(); virtual int numberOfChildren() const = 0; - virtual void incrementNumberOfChildren() {} //TODO Put an assert false - virtual void decrementNumberOfChildren() {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ? + virtual void incrementNumberOfChildren(int increment = 1) {} //TODO Put an assert false + virtual void decrementNumberOfChildren(int decrement = 1) {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ? virtual void eraseNumberOfChildren() {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ? int numberOfDescendants(bool includeSelf) const; TreeNode * childTreeAtIndex(int i) const; diff --git a/tree_pool.h b/tree_pool.h index 0ae8bf3c1..11d8c71de 100644 --- a/tree_pool.h +++ b/tree_pool.h @@ -141,7 +141,7 @@ private: // Pool memory void * alloc(size_t size); void dealloc(TreeNode * ptr); - static inline bool insert(char * destination, char * source, size_t length); + bool insert(char * destination, char * source, size_t length); void moveNodes(TreeNode * source, TreeNode * destination, size_t moveLength); // Identifiers diff --git a/tree_reference.h b/tree_reference.h index 55223f73c..a9c25bde2 100644 --- a/tree_reference.h +++ b/tree_reference.h @@ -61,8 +61,8 @@ public: bool isAllocationFailure() const { return node()->isAllocationFailure(); } int nodeRetainCount() const { return node()->retainCount(); } - void incrementNumberOfChildren() { return node()->incrementNumberOfChildren(); } - void decrementNumberOfChildren() { return node()->decrementNumberOfChildren(); } + void incrementNumberOfChildren(int increment = 1) { return node()->incrementNumberOfChildren(increment); } + void decrementNumberOfChildren(int decrement = 1) { return node()->decrementNumberOfChildren(decrement); } operator TreeReference() const { return TreeReference(this->node()); @@ -209,11 +209,14 @@ public: void mergeChildren(TreeReference t) { // Steal operands - TreePool::sharedPool()->moveChildren(t.node(), node()->lastDescendant()); + int numberOfNewChildren = t.numberOfChildren(); + TreePool::sharedPool()->moveChildren(t.node(), node()->lastDescendant()->next()); + t.node()->eraseNumberOfChildren(); // If t is a child, remove it if (node()->hasChild(t.node())) { removeChild(t); } + node()->incrementNumberOfChildren(numberOfNewChildren); } protected: