From 1ede897a37e9a56d95189f085a9cd1ffac1127ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 6 Oct 2017 10:16:18 +0200 Subject: [PATCH] [poincare] Create a class undefined Change-Id: I0d30b907179f38b77ed65136fddede6e16fb08e1 --- poincare/Makefile | 1 + poincare/include/poincare.h | 1 + poincare/include/poincare/undefined.h | 20 ++++++++++++++++ poincare/src/addition.cpp | 8 +++---- poincare/src/multiplication.cpp | 8 +++---- poincare/src/undefined.cpp | 33 +++++++++++++++++++++++++++ 6 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 poincare/include/poincare/undefined.h create mode 100644 poincare/src/undefined.cpp diff --git a/poincare/Makefile b/poincare/Makefile index f154a804f..0c600a04d 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -77,6 +77,7 @@ objs += $(addprefix poincare/src/,\ sum.o\ symbol.o\ tangent.o\ + undefined.o\ variable_context.o\ ) diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index 0d7a00c24..8ece7db33 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -67,6 +67,7 @@ #include #include #include +#include #include #endif diff --git a/poincare/include/poincare/undefined.h b/poincare/include/poincare/undefined.h new file mode 100644 index 000000000..7f2dc3eac --- /dev/null +++ b/poincare/include/poincare/undefined.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_UNDEFINED_H +#define POINCARE_UNDEFINED_H + +#include + +namespace Poincare { + +class Undefined : public StaticHierarchy<0> { +public: + Type type() const override; + Expression * clone() const override; +private: + ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + Evaluation * privateEvaluate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override; + Evaluation * privateEvaluate(DoublePrecision p, Context& context, AngleUnit angleUnit) const override; +}; + +} + +#endif diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index fda9245d5..fd82755fd 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -1,6 +1,7 @@ #include #include #include +#include extern "C" { #include #include @@ -28,11 +29,10 @@ void Addition::immediateSimplify() { if (o->type() == Type::Addition) { mergeOperands(static_cast(o)); index = 0; + } else if (o->type() == Type::Undefined) { + replaceWith(new Undefined(), true); + return; } - /* if (o->type() == Type::Undefined) { - * replaceWith(new Undefined(), true); - * return; - * }*/ } sortChildren(); for (int i = 0; i < numberOfOperands()-1; i++) { diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index 66f333018..791044d3e 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -9,6 +9,7 @@ extern "C" { #include #include #include +#include #include "layout/string_layout.h" #include "layout/horizontal_layout.h" #include "layout/parenthesis_layout.h" @@ -79,11 +80,10 @@ void Multiplication::immediateSimplify() { } else if (o->type() == Type::Rational && static_cast(o)->isZero()) { replaceWith(new Rational(Integer(0)), true); return; + } else if (o->type() == Type::Undefined) { + replaceWith(new Undefined(), true); + return; } - /* if (o->type() == Type::Undefined) { - * replaceWith(new Undefined(), true); - * return; - * }*/ } /* Second loop, distribute addition */ for (int i=0; i +#include +extern "C" { +#include +} +#include "layout/string_layout.h" + +namespace Poincare { + +Expression::Type Undefined::type() const { + return Type::Undefined; +} + +Expression * Undefined::clone() const { + return new Undefined(); +} + +Evaluation * Undefined::privateEvaluate(SinglePrecision p, Context& context, AngleUnit angleUnit) const { + return new Complex(Complex::Float(NAN)); +} + +Evaluation * Undefined::privateEvaluate(DoublePrecision p, Context& context, AngleUnit angleUnit) const { + return new Complex(Complex::Float(NAN)); +} + +ExpressionLayout * Undefined::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { + char buffer[16]; + int numberOfChars = Complex::convertFloatToText(NAN, buffer, 16, 0, floatDisplayMode); + return new StringLayout(buffer, numberOfChars); +} + +} +