From 4707459a19dd34bb71cb5766eb4864ae80aebf83 Mon Sep 17 00:00:00 2001 From: Felix Raimundo Date: Thu, 24 Mar 2016 16:54:53 +0100 Subject: [PATCH] Update functions to use the clone interface. Change-Id: I6b4d6be5b1d963bc7d97851432e40844d3619d8d --- poincare/include/poincare/cosinus.h | 3 ++- poincare/include/poincare/function.h | 4 +++- poincare/include/poincare/sinus.h | 3 ++- poincare/include/poincare/tangent.h | 3 ++- poincare/src/cosinus.cpp | 4 ++++ poincare/src/function.cpp | 25 +++++++++++++++++++++++++ poincare/src/sinus.cpp | 4 ++++ poincare/src/tangent.cpp | 4 ++++ 8 files changed, 46 insertions(+), 4 deletions(-) diff --git a/poincare/include/poincare/cosinus.h b/poincare/include/poincare/cosinus.h index 5d4fc4e7a..f23e66e4c 100644 --- a/poincare/include/poincare/cosinus.h +++ b/poincare/include/poincare/cosinus.h @@ -5,9 +5,10 @@ class Cosinus : public Function { public: - Cosinus(Expression * arg): Function(arg, (char*) "cos") {} + Cosinus(Expression * arg, bool clone_arg=true): Function(arg, (char*) "cos", clone_arg) {} float approximate(Context& context) override; Type type() override; + Expression * clone() override; }; #endif diff --git a/poincare/include/poincare/function.h b/poincare/include/poincare/function.h index 2a8fa67fe..e02e7e388 100644 --- a/poincare/include/poincare/function.h +++ b/poincare/include/poincare/function.h @@ -5,9 +5,11 @@ class Function : public Expression { public: - Function(Expression * arg, char* function_name): m_arg(arg), m_function_name(function_name) {} + Function(Expression * arg, char* function_name, bool clone_operands=true); ~Function(); ExpressionLayout * createLayout(ExpressionLayout * parent) override; + Expression * operand(int i) override; + int numberOfOperands() override; protected: Expression * m_arg; private: diff --git a/poincare/include/poincare/sinus.h b/poincare/include/poincare/sinus.h index 5378dd789..a970aac09 100644 --- a/poincare/include/poincare/sinus.h +++ b/poincare/include/poincare/sinus.h @@ -5,9 +5,10 @@ class Sinus : public Function { public: - Sinus(Expression * arg): Function(arg, (char*) "sin") {} + Sinus(Expression * arg, bool clone_arg=true): Function(arg, (char*) "sin", clone_arg) {} float approximate(Context& context) override; Type type() override; + Expression * clone() override; }; #endif diff --git a/poincare/include/poincare/tangent.h b/poincare/include/poincare/tangent.h index f77593878..06ffbae06 100644 --- a/poincare/include/poincare/tangent.h +++ b/poincare/include/poincare/tangent.h @@ -5,9 +5,10 @@ class Tangent : public Function { public: - Tangent(Expression * arg): Function(arg, (char*) "tan") {} + Tangent(Expression * arg, bool clone_arg=true): Function(arg, (char*) "tan", clone_arg) {} float approximate(Context& context) override; Type type() override; + Expression * clone() override; }; #endif diff --git a/poincare/src/cosinus.cpp b/poincare/src/cosinus.cpp index c21d00aa1..070b82a2a 100644 --- a/poincare/src/cosinus.cpp +++ b/poincare/src/cosinus.cpp @@ -1,6 +1,10 @@ #include #include "layout/horizontal_layout.h" +Expression * Cosinus::clone() { + return new Cosinus(m_arg, true); +} + Expression::Type Cosinus::type() { return Expression::Type::Cosinus; } diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index e7e230d11..e0ac86286 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -1,6 +1,19 @@ +extern "C" { +#include +} #include #include "layout/function_layout.h" +Function::Function(Expression * arg, char* function_name, bool clone_operands) { + m_arg = (Expression *)malloc(sizeof(Expression)); + m_function_name = function_name; + if (clone_operands) { + m_arg = arg->clone(); + } else { + m_arg = arg; + } +} + Function::~Function() { delete m_arg; } @@ -8,3 +21,15 @@ Function::~Function() { ExpressionLayout * Function::createLayout(ExpressionLayout * parent) { return new FunctionLayout(parent, m_function_name, m_arg); } + +Expression * Function::operand(int i) { + if (i==0) { + return m_arg; + } else { + return nullptr; + } +} + +int Function::numberOfOperands() { + return 1; +} diff --git a/poincare/src/sinus.cpp b/poincare/src/sinus.cpp index 6e831cb2e..9a73559a3 100644 --- a/poincare/src/sinus.cpp +++ b/poincare/src/sinus.cpp @@ -1,6 +1,10 @@ #include #include "layout/horizontal_layout.h" +Expression * Sinus::clone() { + return new Sinus(m_arg, true); +} + Expression::Type Sinus::type() { return Expression::Type::Sinus; } diff --git a/poincare/src/tangent.cpp b/poincare/src/tangent.cpp index 71e9d3191..6eb92af4c 100644 --- a/poincare/src/tangent.cpp +++ b/poincare/src/tangent.cpp @@ -1,6 +1,10 @@ #include #include "layout/horizontal_layout.h" +Expression * Tangent::clone() { + return new Tangent(m_arg, true); +} + Expression::Type Tangent::type() { return Expression::Type::Tangent; }