diff --git a/poincare/include/poincare/allocation_failed_layout_node.h b/poincare/include/poincare/allocation_failed_layout_node.h index b5fb6e5a6..1f4253bfc 100644 --- a/poincare/include/poincare/allocation_failed_layout_node.h +++ b/poincare/include/poincare/allocation_failed_layout_node.h @@ -22,6 +22,7 @@ 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 b01de28f7..ac2613bd2 100644 --- a/poincare/include/poincare/binomial_coefficient_layout_node.h +++ b/poincare/include/poincare/binomial_coefficient_layout_node.h @@ -23,6 +23,7 @@ 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 f8a032062..3b3272524 100644 --- a/poincare/include/poincare/bracket_layout_node.h +++ b/poincare/include/poincare/bracket_layout_node.h @@ -22,6 +22,7 @@ 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 193f8eebd..1c167e088 100644 --- a/poincare/include/poincare/bracket_pair_layout_node.h +++ b/poincare/include/poincare/bracket_pair_layout_node.h @@ -26,6 +26,7 @@ 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 93c1e4f6f..f57023d76 100644 --- a/poincare/include/poincare/char_layout_node.h +++ b/poincare/include/poincare/char_layout_node.h @@ -28,6 +28,7 @@ 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 3e3fecb4b..76489bb5a 100644 --- a/poincare/include/poincare/condensed_sum_layout_node.h +++ b/poincare/include/poincare/condensed_sum_layout_node.h @@ -27,6 +27,7 @@ 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 e206f56e4..b95a33def 100644 --- a/poincare/include/poincare/conjugate_layout_node.h +++ b/poincare/include/poincare/conjugate_layout_node.h @@ -19,6 +19,7 @@ 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 6de80aeb0..b0fc1937d 100644 --- a/poincare/include/poincare/empty_layout_node.h +++ b/poincare/include/poincare/empty_layout_node.h @@ -39,6 +39,7 @@ 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 4227d482e..87e0a5e82 100644 --- a/poincare/include/poincare/fraction_layout_node.h +++ b/poincare/include/poincare/fraction_layout_node.h @@ -33,6 +33,7 @@ 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 792d5518a..b825d4450 100644 --- a/poincare/include/poincare/grid_layout_node.h +++ b/poincare/include/poincare/grid_layout_node.h @@ -19,6 +19,7 @@ class GridLayoutNode : public LayoutNode { public: GridLayoutNode() : LayoutNode(), + m_numberOfChildren(0), m_numberOfRows(0), m_numberOfColumns(0) {} @@ -41,8 +42,20 @@ 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 { - LayoutNode::eraseNumberOfChildren(); + m_numberOfChildren = 0; m_numberOfRows = 0; m_numberOfColumns = 0; } @@ -65,6 +78,7 @@ 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 232caffa8..d26b2a2c1 100644 --- a/poincare/include/poincare/horizontal_layout_node.h +++ b/poincare/include/poincare/horizontal_layout_node.h @@ -13,7 +13,10 @@ namespace Poincare { class HorizontalLayoutNode : public LayoutNode { friend class LayoutReference; public: - using LayoutNode::LayoutNode; + HorizontalLayoutNode() : + LayoutNode(), + m_numberOfChildren(0) + {} // LayoutNode void moveCursorLeft(LayoutCursor * cursor, bool * shouldRecomputeLayout) override; @@ -23,11 +26,18 @@ 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 numberOfChildren() == 1 && const_cast(this)->childAtIndex(0)->isEmpty(); } - bool isCollapsable(int * numberOfOpenParenthesis, bool goingLeft) const override { return numberOfChildren() != 0; } + 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; } // 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"; @@ -47,6 +57,7 @@ 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 cda5e46f0..0ebb572f4 100644 --- a/poincare/include/poincare/integral_layout_node.h +++ b/poincare/include/poincare/integral_layout_node.h @@ -30,6 +30,7 @@ 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 6292fc40d..709d45ab0 100644 --- a/poincare/include/poincare/nth_root_layout_node.h +++ b/poincare/include/poincare/nth_root_layout_node.h @@ -12,7 +12,10 @@ public: constexpr static KDCoordinate k_leftRadixHeight = 8; constexpr static KDCoordinate k_leftRadixWidth = 5; - using LayoutNode::LayoutNode; + NthRootLayoutNode() : + LayoutNode(), + m_numberOfChildren(0) + {} // LayoutNode void moveCursorLeft(LayoutCursor * cursor, bool * shouldRecomputeLayout) override; @@ -25,7 +28,16 @@ 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"; @@ -54,6 +66,7 @@ private: assert(numberOfChildren() == 1 || numberOfChildren() == 2); return numberOfChildren() == 2 ? 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 36b6b8bbc..73700e8d2 100644 --- a/poincare/include/poincare/sequence_layout_node.h +++ b/poincare/include/poincare/sequence_layout_node.h @@ -28,6 +28,7 @@ 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 2dddfe725..784757056 100644 --- a/poincare/include/poincare/tree_node.h +++ b/poincare/include/poincare/tree_node.h @@ -53,12 +53,10 @@ public: // Hierarchy TreeNode * parent() const; TreeNode * root(); - 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; } + 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 numberOfDescendants(bool includeSelf) const; TreeNode * childAtIndex(int i) const; int indexOfChildByIdentifier(int childID) const; @@ -175,7 +173,6 @@ 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 5040bd96d..ed7bed12d 100644 --- a/poincare/include/poincare/vertical_offset_layout_node.h +++ b/poincare/include/poincare/vertical_offset_layout_node.h @@ -35,6 +35,7 @@ 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 e94cf6525..7856f70ed 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 (numberOfChildren() > 0) { + if (m_numberOfChildren > 0) { *index = HorizontalLayoutRef(this).removeEmptyChildBeforeInsertionAtIndex(*index, !childAtIndex(0)->mustHaveLeftSibling(), cursor); }