#ifndef SHARED_EXPRESSION_MODEL_H #define SHARED_EXPRESSION_MODEL_H #include #include #include namespace Shared { class ExpressionModel { public: ExpressionModel(); virtual ~ExpressionModel(); // Delete expression and layout, if needed ExpressionModel& operator=(const ExpressionModel& other); ExpressionModel& operator=(ExpressionModel&& other) = delete; ExpressionModel(const ExpressionModel& other) = delete; ExpressionModel(ExpressionModel&& other) = delete; const char * text() const; Poincare::Expression * expression(Poincare::Context * context) const; Poincare::ExpressionLayout * layout(); /* Here, isDefined is the exact contrary of isEmpty. However, for Sequence * inheriting from ExpressionModel, isEmpty and isDefined have not exactly * opposite meaning. For instance, u(n+1)=u(n) & u(0) = ... is not empty and * not defined. We thus have to keep both methods. */ virtual bool isDefined(); virtual bool isEmpty(); virtual bool shouldBeClearedBeforeRemove() { return !isEmpty(); } virtual void setContent(const char * c); virtual void tidy(); constexpr static int k_expressionBufferSize = TextField::maxBufferSize(); private: constexpr static size_t k_dataLengthInBytes = (TextField::maxBufferSize())*sizeof(char); static_assert((k_dataLengthInBytes & 0x3) == 0, "The expression model data size is not a multiple of 4 bytes (cannot compute crc)"); // Assert that dataLengthInBytes is a multiple of 4 char m_text[k_expressionBufferSize]; mutable Poincare::Expression * m_expression; mutable Poincare::ExpressionLayout * m_layout; }; } #endif