Numworks Epsilon  1.4.1
Graphing Calculator Operating System
complex.h
Go to the documentation of this file.
1 #ifndef POINCARE_COMPLEX_H
2 #define POINCARE_COMPLEX_H
3 
4 #include <poincare/preferences.h>
6 #include <poincare/integer.h>
7 #include <assert.h>
8 
9 namespace Poincare {
10 
11 template<typename T>
12 class Complex : public StaticHierarchy<0> {
13 public:
14  Complex() : m_a(0), m_b(0) {}
15  static Complex<T> Float(T x);
16  static Complex<T> Cartesian(T a, T b);
17  static Complex<T> Polar(T r, T theta);
18  Complex(const char * integralPart, int integralPartLength, bool integralNegative,
19  const char * fractionalPart, int fractionalPartLength,
20  const char * exponent, int exponentLength, bool exponentNegative);
21  Complex(const Complex & other);
22  Complex& operator=(const Complex& other);
23 
24  T a() const;
25  T b() const;
26  T r() const;
27  T th() const;
28  Complex<T> conjugate() const;
29  T toScalar() const;
30 
31  /* Expression */
32  Expression::Type type() const override;
33  Complex<T> * clone() const override;
34  int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override;
35 
36  /* Properties */
37  bool needParenthesisWithParent(const Expression * e) const override;
38 
39  /* Simplification: complex does not implement simplificationOrderSameType
40  * because Complex expressions are always transformed into an addition of
41  * Decimal and I symbol before compared with another Expression. */
42 
43 private:
44  Complex(T a, T b);
45  /* Layout */
46  ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat) const override;
47  /* Simplification */
48  static Expression * CreateDecimal(T f);
49  Expression * shallowReduce(Context & context, AngleUnit angleUnit) override;
50  /* Evaluation */
51  Expression * privateApproximate(Expression::SinglePrecision p, Context& context, Expression::AngleUnit angleUnit) const override { return templatedApproximate<float>(context, angleUnit); }
52  Expression * privateApproximate(Expression::DoublePrecision p, Context& context, Expression::AngleUnit angleUnit) const override { return templatedApproximate<double>(context, angleUnit); }
53  template<typename U> Complex<U> * templatedApproximate(Context& context, Expression::AngleUnit angleUnit) const;
54  /* convertComplexToText and convertFloatToTextPrivate return the string length
55  * of the buffer (does not count the 0 last char)*/
56  int convertComplexToText(char * buffer, int bufferSize, int numberOfSignificantDigits, PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat, char multiplicationSign) const;
57  ExpressionLayout * createPolarLayout(PrintFloat::Mode floatDisplayMode) const;
58  ExpressionLayout * createCartesianLayout(PrintFloat::Mode floatDisplayMode) const;
59  T m_a;
60  T m_b;
61 };
62 
63 }
64 
65 #endif
T th() const
Definition: complex.cpp:145
Expression::Type type() const override
Definition: complex.cpp:163
T toScalar() const
Definition: complex.cpp:173
static Complex< T > Cartesian(T a, T b)
Definition: complex.cpp:28
int writeTextInBuffer(char *buffer, int bufferSize, int numberOfSignificantDigits=PrintFloat::k_numberOfStoredSignificantDigits) const override
Definition: complex.cpp:181
#define T(x)
Definition: events.cpp:26
T a() const
Definition: complex.cpp:99
static Complex< T > Polar(T r, T theta)
Definition: complex.cpp:33
Complex< T > * clone() const override
Definition: complex.cpp:168
Complex & operator=(const Complex &other)
Definition: complex.cpp:57
Complex< T > conjugate() const
Definition: complex.cpp:158
static Complex< T > Float(T x)
Definition: complex.cpp:23
bool needParenthesisWithParent(const Expression *e) const override
Definition: complex.cpp:186