diff --git a/poincare/include/poincare/allocation_failed_layout_node.h b/poincare/include/poincare/allocation_failed_layout_node.h index b1a6c0eab..5d69dc95e 100644 --- a/poincare/include/poincare/allocation_failed_layout_node.h +++ b/poincare/include/poincare/allocation_failed_layout_node.h @@ -22,7 +22,6 @@ public: // TreeNode size_t size() const override { return sizeof(AllocationFailedLayoutNode); } const char * description() const override { return "Allocation Failed"; } - int numberOfChildren() const override { return 0; } bool isAllocationFailure() const override { return true; } protected: diff --git a/poincare/include/poincare/binomial_coefficient_layout_node.h b/poincare/include/poincare/binomial_coefficient_layout_node.h index 5bc521fdf..8a878c446 100644 --- a/poincare/include/poincare/binomial_coefficient_layout_node.h +++ b/poincare/include/poincare/binomial_coefficient_layout_node.h @@ -22,7 +22,6 @@ public: // TreeNode size_t size() const override { return sizeof(BinomialCoefficientLayoutNode); } - int numberOfChildren() const override { return 2; } #if TREE_LOG const char * description() const override { return "BinomialCoefficientLayout"; diff --git a/poincare/include/poincare/bracket_layout_node.h b/poincare/include/poincare/bracket_layout_node.h index 3b3272524..f8a032062 100644 --- a/poincare/include/poincare/bracket_layout_node.h +++ b/poincare/include/poincare/bracket_layout_node.h @@ -22,7 +22,6 @@ public: // TreeNode size_t size() const override { return sizeof(BracketLayoutNode); } - int numberOfChildren() const override { return 0; } #if TREE_LOG const char * description() const override { return "BracketLayout"; } #endif diff --git a/poincare/include/poincare/bracket_pair_layout_node.h b/poincare/include/poincare/bracket_pair_layout_node.h index 851851e13..c5b1a04f0 100644 --- a/poincare/include/poincare/bracket_pair_layout_node.h +++ b/poincare/include/poincare/bracket_pair_layout_node.h @@ -24,7 +24,6 @@ public: // TreeNode size_t size() const override { return sizeof(BracketPairLayoutNode); } - int numberOfChildren() const override { return 1; } #if TREE_LOG const char * description() const override { return "BracketPairLayout"; } #endif diff --git a/poincare/include/poincare/char_layout_node.h b/poincare/include/poincare/char_layout_node.h index bd331370e..8c5751d05 100644 --- a/poincare/include/poincare/char_layout_node.h +++ b/poincare/include/poincare/char_layout_node.h @@ -28,7 +28,6 @@ public: // TreeNode size_t size() const override { return sizeof(CharLayoutNode); } - int numberOfChildren() const override { return 0; } #if TREE_LOG const char * description() const override { static char Description[] = "Char a"; diff --git a/poincare/include/poincare/condensed_sum_layout_node.h b/poincare/include/poincare/condensed_sum_layout_node.h index 2cd0980f2..5798caa33 100644 --- a/poincare/include/poincare/condensed_sum_layout_node.h +++ b/poincare/include/poincare/condensed_sum_layout_node.h @@ -27,7 +27,6 @@ public: // TreeNode size_t size() const override { return sizeof(CondensedSumLayoutNode); } - int numberOfChildren() const override { return 3; } #if TREE_LOG const char * description() const override { return "CondensedSumLayout"; diff --git a/poincare/include/poincare/conjugate_layout_node.h b/poincare/include/poincare/conjugate_layout_node.h index 4ffd7d043..0c4ab786c 100644 --- a/poincare/include/poincare/conjugate_layout_node.h +++ b/poincare/include/poincare/conjugate_layout_node.h @@ -19,7 +19,6 @@ public: // TreeNode size_t size() const override { return sizeof(ConjugateLayoutNode); } - int numberOfChildren() const override { return 1; } #if TREE_LOG const char * description() const override { return "ConjugateLayout"; diff --git a/poincare/include/poincare/empty_layout_node.h b/poincare/include/poincare/empty_layout_node.h index 5322af1b2..ed7e36b98 100644 --- a/poincare/include/poincare/empty_layout_node.h +++ b/poincare/include/poincare/empty_layout_node.h @@ -39,7 +39,6 @@ public: // TreeNode size_t size() const override { return sizeof(EmptyLayoutNode); } - int numberOfChildren() const override { return 0; } #if TREE_LOG const char * description() const override { return "Empty"; } #endif diff --git a/poincare/include/poincare/fraction_layout_node.h b/poincare/include/poincare/fraction_layout_node.h index cd1be1a5d..5fdf40cd4 100644 --- a/poincare/include/poincare/fraction_layout_node.h +++ b/poincare/include/poincare/fraction_layout_node.h @@ -33,7 +33,6 @@ public: // TreeNode size_t size() const override { return sizeof(FractionLayoutNode); } - int numberOfChildren() const override { return 2; } #if TREE_LOG const char * description() const override { return "FractionLayout"; diff --git a/poincare/include/poincare/grid_layout_node.h b/poincare/include/poincare/grid_layout_node.h index 9efce6c3c..15900d1e6 100644 --- a/poincare/include/poincare/grid_layout_node.h +++ b/poincare/include/poincare/grid_layout_node.h @@ -17,7 +17,6 @@ class GridLayoutNode : public LayoutNode { public: GridLayoutNode() : LayoutNode(), - m_numberOfChildren(0), m_numberOfRows(0), m_numberOfColumns(0) {} @@ -40,20 +39,8 @@ public: // TreeNode size_t size() const override { return sizeof(GridLayoutNode); } - int numberOfChildren() const override { return m_numberOfChildren; } - void incrementNumberOfChildren(int increment = 1) override { - assert(increment >= 0); - m_numberOfChildren += increment; - } - void decrementNumberOfChildren(int decrement = 1) override { - m_numberOfChildren -= decrement; - if (m_numberOfChildren < 0) { - m_numberOfChildren = 0; - } - } - void eraseNumberOfChildren() override { - m_numberOfChildren = 0; + LayoutNode::eraseNumberOfChildren(); m_numberOfRows = 0; m_numberOfColumns = 0; } @@ -76,7 +63,6 @@ protected: int rowAtChildIndex(int index) const; int columnAtChildIndex(int index) const; int indexAtRowColumn(int rowIndex, int columnIndex) const; - int m_numberOfChildren; int m_numberOfRows; int m_numberOfColumns; diff --git a/poincare/include/poincare/horizontal_layout_node.h b/poincare/include/poincare/horizontal_layout_node.h index 6082dc5a0..6e56874c3 100644 --- a/poincare/include/poincare/horizontal_layout_node.h +++ b/poincare/include/poincare/horizontal_layout_node.h @@ -14,10 +14,7 @@ class HorizontalLayoutNode : public LayoutNode { template friend class LayoutReference; public: - HorizontalLayoutNode() : - LayoutNode(), - m_numberOfChildren(0) - {} + using LayoutNode::LayoutNode; // LayoutNode void moveCursorLeft(LayoutCursor * cursor, bool * shouldRecomputeLayout) override; @@ -27,18 +24,11 @@ public: int writeTextInBuffer(char * buffer, int bufferSize, PrintFloat::Mode floatDisplayMode, int numberOfSignificantDigits) const override; bool isHorizontal() const override { return true; } - bool isEmpty() const override { return m_numberOfChildren == 1 && const_cast(this)->childAtIndex(0)->isEmpty(); } - bool isCollapsable(int * numberOfOpenParenthesis, bool goingLeft) const override { return m_numberOfChildren != 0; } + bool isEmpty() const override { return numberOfChildren() == 1 && const_cast(this)->childAtIndex(0)->isEmpty(); } + bool isCollapsable(int * numberOfOpenParenthesis, bool goingLeft) const override { return numberOfChildren() != 0; } // TreeNode size_t size() const override { return sizeof(HorizontalLayoutNode); } - int numberOfChildren() const override { return m_numberOfChildren; } - void incrementNumberOfChildren(int increment = 1) override { m_numberOfChildren+= increment; } - void decrementNumberOfChildren(int decrement = 1) override { - assert(m_numberOfChildren >= decrement); - m_numberOfChildren-= decrement; - } - void eraseNumberOfChildren() override { m_numberOfChildren = 0; } #if TREE_LOG const char * description() const override { return "Horizontal Layout"; @@ -58,7 +48,6 @@ private: void didRemoveChildAtIndex(int index, LayoutCursor * cursor, bool force) override; bool willReplaceChild(LayoutNode * oldChild, LayoutNode * newChild, LayoutCursor * cursor, bool force) override; void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override {} - int m_numberOfChildren; }; class HorizontalLayoutRef : public LayoutReference { diff --git a/poincare/include/poincare/integral_layout_node.h b/poincare/include/poincare/integral_layout_node.h index a5cc08af5..361988c89 100644 --- a/poincare/include/poincare/integral_layout_node.h +++ b/poincare/include/poincare/integral_layout_node.h @@ -29,7 +29,6 @@ public: // TreeNode size_t size() const override { return sizeof(IntegralLayoutNode); } - int numberOfChildren() const override { return 3; } #if TREE_LOG const char * description() const override { return "IntegralLayout"; diff --git a/poincare/include/poincare/nth_root_layout_node.h b/poincare/include/poincare/nth_root_layout_node.h index 1a1ad596b..60cfde3db 100644 --- a/poincare/include/poincare/nth_root_layout_node.h +++ b/poincare/include/poincare/nth_root_layout_node.h @@ -12,10 +12,7 @@ public: constexpr static KDCoordinate k_leftRadixHeight = 8; constexpr static KDCoordinate k_leftRadixWidth = 5; - NthRootLayoutNode() : - LayoutNode(), - m_numberOfChildren(0) - {} + using LayoutNode::LayoutNode; // LayoutNode void moveCursorLeft(LayoutCursor * cursor, bool * shouldRecomputeLayout) override; @@ -28,16 +25,7 @@ public: bool hasUpperLeftIndex() const override { return numberOfChildren() > 1; } // TreeNode - void incrementNumberOfChildren(int increment = 1) override { - assert(increment == 1); - m_numberOfChildren+= increment; - } - void decrementNumberOfChildren(int decrement = 1) override { - assert(m_numberOfChildren >= decrement); - m_numberOfChildren-= decrement; - } size_t size() const override { return sizeof(NthRootLayoutNode); } - int numberOfChildren() const override { return m_numberOfChildren; } #if TREE_LOG const char * description() const override { return "NthRootLayout"; @@ -60,7 +48,6 @@ private: void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; LayoutNode * radicandLayout() { return childAtIndex(0);} LayoutNode * indexLayout() { return numberOfChildren() > 1 ? childAtIndex(1) : nullptr; } - int m_numberOfChildren; }; class NthRootLayoutRef : public LayoutReference { diff --git a/poincare/include/poincare/sequence_layout_node.h b/poincare/include/poincare/sequence_layout_node.h index 85d06b9ec..63fb24d13 100644 --- a/poincare/include/poincare/sequence_layout_node.h +++ b/poincare/include/poincare/sequence_layout_node.h @@ -28,7 +28,6 @@ public: // TreeNode size_t size() const override { return sizeof(SequenceLayoutNode); } - int numberOfChildren() const override { return 3; } #if TREE_LOG const char * description() const override { return "Sequence Layout"; diff --git a/poincare/include/poincare/tree_node.h b/poincare/include/poincare/tree_node.h index 8b305fdb7..9574e7d15 100644 --- a/poincare/include/poincare/tree_node.h +++ b/poincare/include/poincare/tree_node.h @@ -56,10 +56,12 @@ public: // Hierarchy TreeNode * parentTree() const; TreeNode * rootTree(); - virtual int numberOfChildren() const = 0; - virtual void incrementNumberOfChildren(int increment = 1) {} // Do no put an assert(false), we need this method for instance in GridLayout::removeRow - virtual void decrementNumberOfChildren(int decrement = 1) {} // Do no put an assert(false), we need this method for instance in GridLayout::removeRow - virtual void eraseNumberOfChildren() {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ? + int numberOfChildren() const { return m_numberOfChildren; } + void incrementNumberOfChildren(int increment = 1) { m_numberOfChildren += increment; } + void decrementNumberOfChildren(int decrement = 1) { + m_numberOfChildren = m_numberOfChildren > decrement ? m_numberOfChildren - decrement : 0; + } + virtual void eraseNumberOfChildren() { m_numberOfChildren = 0; } int numberOfDescendants(bool includeSelf) const; TreeNode * childTreeAtIndex(int i) const; int indexOfChildByIdentifier(int childID) const; @@ -176,6 +178,7 @@ protected: private: int m_identifier; int m_referenceCounter; + int m_numberOfChildren; }; } diff --git a/poincare/include/poincare/vertical_offset_layout_node.h b/poincare/include/poincare/vertical_offset_layout_node.h index e4def7bbe..4eb5b0f94 100644 --- a/poincare/include/poincare/vertical_offset_layout_node.h +++ b/poincare/include/poincare/vertical_offset_layout_node.h @@ -35,7 +35,6 @@ public: // TreeNode size_t size() const override { return sizeof(VerticalOffsetLayoutNode); } - int numberOfChildren() const override { return 1; } #if TREE_LOG const char * description() const override { return m_type == Type::Subscript ? "Subscript" : "Superscript"; diff --git a/poincare/src/horizontal_layout_node.cpp b/poincare/src/horizontal_layout_node.cpp index 08e69912a..5e0ed494d 100644 --- a/poincare/src/horizontal_layout_node.cpp +++ b/poincare/src/horizontal_layout_node.cpp @@ -217,7 +217,7 @@ KDPoint HorizontalLayoutNode::positionOfChild(LayoutNode * l) { // Private bool HorizontalLayoutNode::willAddChildAtIndex(LayoutNode * l, int * index, LayoutCursor * cursor) { - if (m_numberOfChildren > 0) { + if (numberOfChildren() > 0) { *index = HorizontalLayoutRef(this).removeEmptyChildBeforeInsertionAtIndex(*index, !childAtIndex(0)->mustHaveLeftSibling(), cursor); }