diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index cb4080b33..15795ee7b 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -14,6 +14,5 @@ float Addition::operateApproximatevelyOn(float a, float b) { } ExpressionLayout * Addition::createLayout(ExpressionLayout * parent) { - //FIXME: There can be more than two operands now! :-) - return new HorizontalLayout(parent, operand(0), '+', operand(1)); + return new HorizontalLayout(parent, m_operands, m_numberOfOperands, '+'); } diff --git a/poincare/src/commutative_operation.cpp b/poincare/src/commutative_operation.cpp index 929908076..37252e0a0 100644 --- a/poincare/src/commutative_operation.cpp +++ b/poincare/src/commutative_operation.cpp @@ -30,6 +30,7 @@ int CommutativeOperation::numberOfOperands() { } Expression * CommutativeOperation::operand(int i) { + assert(i < m_numberOfOperands); return m_operands[i]; } diff --git a/poincare/src/expression_lexer.l b/poincare/src/expression_lexer.l index 008e5fca5..4a92ec02c 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -42,10 +42,10 @@ class Expression; %% [0-9]+ { yylval->string = yytext; return(INTEGER); } -[A-Za-z]+ { yylval->string = yytext; return(SYMBOL); } sin {return(SINUS);} cos {return(COSINUS);} tan {return(TANGENT);} +[A-Za-z]+ { yylval->string = yytext; return(SYMBOL); } \+ { return(PLUS); } \- { return(MINUS); } \* { return(MULTIPLY); } diff --git a/poincare/src/layout/horizontal_layout.cpp b/poincare/src/layout/horizontal_layout.cpp index 0ba763f4b..eebc343b0 100644 --- a/poincare/src/layout/horizontal_layout.cpp +++ b/poincare/src/layout/horizontal_layout.cpp @@ -1,29 +1,28 @@ extern "C" { -#include #include +#include +#include } #include "horizontal_layout.h" #include "string_layout.h" -HorizontalLayout::HorizontalLayout(ExpressionLayout * parent, int number_of_operands, Expression ** operands, char symbol) { - m_number_of_operands = number_of_operands; - // FIXME: This implementation is not optimal as the operator layout is created and stored a lot of times. - // The reason for this is how the layouts are drawn. - m_children_layouts = (ExpressionLayout **)malloc((2*m_number_of_operands-)*sizeof(ExpressionLayout *)); - m_operator_layout = new StringLayout(this, string, 1); +HorizontalLayout::HorizontalLayout(ExpressionLayout * parent, Expression ** operands,int number_of_operands, char symbol) : ExpressionLayout(parent) { + assert(number_of_operands > 0); + m_number_of_children = 2*number_of_operands-1; + m_children_layouts = (ExpressionLayout **)malloc(m_number_of_children*sizeof(ExpressionLayout *)); char string[2] = {symbol, '\0'}; - for (int i=1; icreateLayout(); + m_children_layouts[0] = operands[0]->createLayout(this); + for (int i=1; icreateLayout(this); } } HorizontalLayout::~HorizontalLayout() { - for (int i(0); i= 2*m_number_of_operands) { + assert(index <= m_number_of_children); + if (index < m_number_of_children) { + return m_children_layouts[index]; + } else { return nullptr; } - return m_children_layouts[index]; } KDPoint HorizontalLayout::positionOfChild(ExpressionLayout * child) { KDPoint position = (KDPoint){.x = 0, .y = 0}; uint16_t index = 0; - for (int i=0;i<3;i++) { - if (m_children[i] == child) { + for (int i=0;i 0) { - ExpressionLayout * previousChild = m_children[index-1]; + ExpressionLayout * previousChild = m_children_layouts[index-1]; assert(previousChild != nullptr); position.x = previousChild->origin().x + previousChild->size().width; } diff --git a/poincare/src/layout/horizontal_layout.h b/poincare/src/layout/horizontal_layout.h index 4482aca87..0ee133f5c 100644 --- a/poincare/src/layout/horizontal_layout.h +++ b/poincare/src/layout/horizontal_layout.h @@ -6,7 +6,7 @@ class HorizontalLayout : public ExpressionLayout { public: - HorizontalLayout(ExpressionLayout * parent, int number_of_operands, Expression ** operands, char symbol); + HorizontalLayout(ExpressionLayout * parent, Expression ** operands, int number_of_children, char symbol); ~HorizontalLayout(); protected: void render(KDPoint point) override; @@ -14,9 +14,8 @@ class HorizontalLayout : public ExpressionLayout { ExpressionLayout * child(uint16_t index) override; KDPoint positionOfChild(ExpressionLayout * child) override; private: - int m_number_of_operands; + int m_number_of_children; ExpressionLayout ** m_children_layouts; - ExpressionLayout * m_operator_layout; }; #endif diff --git a/poincare/src/product.cpp b/poincare/src/product.cpp index fc888bfd8..36c93dcba 100644 --- a/poincare/src/product.cpp +++ b/poincare/src/product.cpp @@ -17,6 +17,5 @@ Expression::Type Product::type() { } ExpressionLayout * Product::createLayout(ExpressionLayout * parent) { - //FIXME: There can be more than two factors now! :-) - return new HorizontalLayout(parent, operand(0), '*', operand(1)); + return new HorizontalLayout(parent, m_operands, m_numberOfOperands, '*'); } diff --git a/poincare/src/subtraction.cpp b/poincare/src/subtraction.cpp index 7f82f02db..448553f2a 100644 --- a/poincare/src/subtraction.cpp +++ b/poincare/src/subtraction.cpp @@ -14,5 +14,5 @@ Expression::Type Subtraction::type() { } ExpressionLayout * Subtraction::createLayout(ExpressionLayout * parent) { - return new HorizontalLayout(parent, m_operands[0], '-', m_operands[1]); + return new HorizontalLayout(parent, m_operands, 2, '-'); }