diff --git a/poincare/Makefile b/poincare/Makefile index da0f614ec..937ee09e2 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -54,6 +54,7 @@ objs += $(addprefix poincare/src/,\ division.o\ division_quotient.o\ division_remainder.o\ + empty_expression.o\ evaluation.o\ expression.o\ expression_lexer.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index 4251de540..e294551d5 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -120,6 +120,7 @@ #include #include #include +#include #include #include #include diff --git a/poincare/include/poincare/empty_expression.h b/poincare/include/poincare/empty_expression.h index bf7830ac7..c2e5012d2 100644 --- a/poincare/include/poincare/empty_expression.h +++ b/poincare/include/poincare/empty_expression.h @@ -1,28 +1,45 @@ #ifndef POINCARE_EMPTY_EXPRESSION_H #define POINCARE_EMPTY_EXPRESSION_H -#include -#include +#include namespace Poincare { -/* An empty expression awaits completion by the user. */ +// An empty expression awaits completion by the user. -class EmptyExpression : public StaticHierarchy<0> { +class EmptyExpressionNode : public ExpressionNode { public: - Type type() const override { - return Type::EmptyExpression; + // Allocation Failure + static EmptyExpressionNode * FailedAllocationStaticNode(); + EmptyExpressionNode * failedAllocationStaticNode() override { return FailedAllocationStaticNode(); } + + // TreeNode + size_t size() const override { return sizeof(EmptyExpressionNode); } + int numberOfChildren() const override { return 0; } +#if POINCARE_TREE_LOG + virtual void logNodeName(std::ostream & stream) const override { + stream << "EmptyExpression"; } +#endif + + // Properties + Type type() const override { return Type::EmptyExpression; } int serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; private: - /* Layout */ - LayoutRef createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; - /* Evaluation */ + // Layout + LayoutReference createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; + // Evaluation Evaluation approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } Evaluation approximate(DoublePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } template Evaluation templatedApproximate(Context& context, Preferences::AngleUnit angleUnit) const; }; +class EmptyExpression : public Expression { +public: + EmptyExpression() : Expression(TreePool::sharedPool()->createTreeNode()) {} + EmptyExpression(const EmptyExpressionNode * n) : Expression(n) {} +}; + } #endif diff --git a/poincare/src/empty_expression.cpp b/poincare/src/empty_expression.cpp index c27247ca4..fb324553e 100644 --- a/poincare/src/empty_expression.cpp +++ b/poincare/src/empty_expression.cpp @@ -1,25 +1,28 @@ #include +#include +#include #include -#include +#include #include -#include namespace Poincare { -Expression * EmptyExpression::clone() const { - return new EmptyExpression(); +EmptyExpressionNode * EmptyExpressionNode::FailedAllocationStaticNode() { + static AllocationFailureExpressionNode failure; + TreePool::sharedPool()->registerStaticNodeIfRequired(&failure); + return &failure; } -int EmptyExpression::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { +int EmptyExpressionNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { return SerializationHelper::Char(buffer, bufferSize, Ion::Charset::Empty); } -LayoutRef EmptyExpression::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { +LayoutRef EmptyExpressionNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { return EmptyLayoutRef(); } -template Complex * EmptyExpression::templatedApproximate(Context& context, Preferences::AngleUnit angleUnit) const { - return new Complex(Complex::Undefined()); +template Evaluation EmptyExpressionNode::templatedApproximate(Context& context, Preferences::AngleUnit angleUnit) const { + return Complex::Undefined(); } } diff --git a/poincare/src/expression_lexer.l b/poincare/src/expression_lexer.l index 53b03f49d..ab558f35e 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -189,10 +189,7 @@ inf { poincare_expression_yylval.expression = Undefined(); return UNDEFINED; } \] { return RIGHT_BRACKET; } \, { return COMMA; } \_ { return UNDERSCORE; } - /* -\x97 { poincare_expression_yylval.expression = new EmptyExpression(); return EMPTY; } - */ - +\x97 { poincare_expression_yylval.expression = EmptyExpression(); return EMPTY; } [ ]+ /* Ignore whitespaces */ . { return UNDEFINED_SYMBOL; }