From ba3eb94be735b49dc0624c140d31bbc5d8bf93c0 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Fri, 7 Oct 2016 17:11:34 +0200 Subject: [PATCH] [poincare] Add a Logarithm expression Change-Id: Iaf10dec4b298811edaef1cebd04ac0b0175d9025 --- poincare/Makefile | 1 + poincare/include/poincare.h | 1 + poincare/include/poincare/expression.h | 2 +- poincare/include/poincare/logarithm.h | 15 ++++++++++++++ poincare/src/expression_lexer.l | 1 + poincare/src/logarithm.cpp | 28 ++++++++++++++++++++++++++ 6 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 poincare/include/poincare/logarithm.h create mode 100644 poincare/src/logarithm.cpp diff --git a/poincare/Makefile b/poincare/Makefile index 0170decbf..0501ae727 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -16,6 +16,7 @@ objs += $(addprefix poincare/src/,\ function.o\ integer.o\ leaf_expression.o\ + logarithm.o\ power.o\ product.o\ sine.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index 21b774e7c..8be3aebce 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 89815ae3e..0235e199c 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -13,7 +13,7 @@ class Expression { Cosine, Float, Integer, - Log, + Logarithm, Fraction, Power, Product, diff --git a/poincare/include/poincare/logarithm.h b/poincare/include/poincare/logarithm.h new file mode 100644 index 000000000..fe81ddb0d --- /dev/null +++ b/poincare/include/poincare/logarithm.h @@ -0,0 +1,15 @@ +#ifndef POINCARE_LOGARITHM_H +#define POINCARE_LOGARITHM_H + +#include + +class Logarithm : public Function { +public: + Logarithm(); + float approximate(Context & context) const override; + Type type() const override; + Expression * cloneWithDifferentOperands(Expression ** newOperands, + int numberOfOperands, bool cloneOperands = true) const override; +}; + +#endif diff --git a/poincare/src/expression_lexer.l b/poincare/src/expression_lexer.l index feabd550f..3dbce6476 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -70,6 +70,7 @@ sin { poincare_expression_yylval.expression = new Sine(); return FUNCTION; } cos { poincare_expression_yylval.expression = new Cosine(); return FUNCTION; } tan { poincare_expression_yylval.expression = new Tangent(); return FUNCTION; } +log { poincare_expression_yylval.expression = new Logarithm(); return FUNCTION; } [A-Za-z]+ { poincare_expression_yylval.string = yytext; return(SYMBOL); } \+ { return(PLUS); } \- { return(MINUS); } diff --git a/poincare/src/logarithm.cpp b/poincare/src/logarithm.cpp new file mode 100644 index 000000000..813bc65b5 --- /dev/null +++ b/poincare/src/logarithm.cpp @@ -0,0 +1,28 @@ +#include + +extern "C" { +#include +#include +} + +Logarithm::Logarithm() : + Function("log") +{ +} + +Expression::Type Logarithm::type() const { + return Expression::Type::Logarithm; +} + +Expression * Logarithm::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + Logarithm * c = new Logarithm(); + c->setArgument(*newOperands, cloneOperands); + return c; +} + +float Logarithm::approximate(Context& context) const { + return log10f(m_arg->approximate(context)); +}