diff --git a/apps/tree/expression_node.h b/apps/tree/expression_node.h index fa88b5cfe..08cf1dfcd 100644 --- a/apps/tree/expression_node.h +++ b/apps/tree/expression_node.h @@ -1,10 +1,10 @@ #ifndef EXPRESSION_NODE_H #define EXPRESSION_NODE_H -#include "tree_node.h" +#include #include -class ExpressionNode : public TreeNode { +class ExpressionNode : public SerializableNode { public: enum class Type : uint8_t { AllocationFailure = 0, diff --git a/apps/tree/expression_reference.h b/apps/tree/expression_reference.h index e9ce93dd6..947727e8c 100644 --- a/apps/tree/expression_reference.h +++ b/apps/tree/expression_reference.h @@ -1,15 +1,15 @@ -#ifndef EXPRESSION_REFERENCE_H -#define EXPRESSION_REFERENCE_H +#ifndef POINCARE_EXPRESSION_REFERENCE_H +#define POINCARE_EXPRESSION_REFERENCE_H -#include "tree_reference.h" -#include "expression_node.h" +#include +#include #include template -class ExpressionReference : public TreeReference { +class ExpressionReference : public SerializableReference { public: - using TreeReference::TreeReference; + using SerializableReference::SerializableReference; /* Allow every ExpressionReference to be transformed into an * ExpressionReference, i.e. ExpressionRef */ diff --git a/poincare/Makefile b/poincare/Makefile index a874f8e7f..9c3d83e95 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -2,6 +2,10 @@ SFLAGS += -Ipoincare/include #include poincare/src/simplify/Makefile #include poincare/src/simplification/Makefile +objs += $(addprefix poincare/src/,\ + tree_node.o\ + tree_pool.o\ +) objs += $(addprefix poincare/src/,\ char_layout_node.o\ @@ -92,8 +96,6 @@ objs += $(addprefix poincare/src/,\ sum.o\ symbol.o\ tangent.o\ - tree_node.o\ - tree_pool.o\ trigonometry.o\ undefined.o\ variable_context.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index 5fa0199b3..869b79e98 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -72,6 +72,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/poincare/include/poincare/layout_engine.h b/poincare/include/poincare/layout_engine.h index 8481c13f6..0e790c9e7 100644 --- a/poincare/include/poincare/layout_engine.h +++ b/poincare/include/poincare/layout_engine.h @@ -53,8 +53,8 @@ public: bool writeFirstChild = true); /* LayoutReference to Text */ - static int writeInfixTreeRefTextInBuffer( - const TreeRef treeRef, + static int writeInfixSerializableRefTextInBuffer( + const SerializableRef serializableRef, char * buffer, int bufferSize, int numberOfDigits, @@ -71,7 +71,7 @@ private: static int writeInfixExpressionOrExpressionLayoutTextInBuffer(const Expression * expression, const ExpressionLayout * expressionLayout, char * buffer, int bufferSize, int numberOfDigits, const char * operatorName, int firstChildIndex, int lastChildIndex, ChildNeedsParenthesis childNeedsParenthesis); static int writePrefixExpressionOrExpressionLayoutTextInBuffer(const Expression * expression, const ExpressionLayout * expressionLayout, char * buffer, int bufferSize, int numberOfDigits, const char * operatorName, bool writeFirstChild = true); - static void writeChildTreeInBuffer(TreeRef childRef, TreeRef parentRef, char * buffer, int bufferSize, int numberOfDigits, int * numberOfChar); + static void writeChildTreeInBuffer(SerializableRef childRef, SerializableRef parentRef, char * buffer, int bufferSize, int numberOfDigits, int * numberOfChar); }; } diff --git a/poincare/include/poincare/layout_node.h b/poincare/include/poincare/layout_node.h index 10e159afe..b7a1f71c7 100644 --- a/poincare/include/poincare/layout_node.h +++ b/poincare/include/poincare/layout_node.h @@ -1,7 +1,7 @@ #ifndef POINCARE_LAYOUT_NODE_H #define POINCARE_LAYOUT_NODE_H -#include +#include #include #include @@ -9,7 +9,7 @@ namespace Poincare { class LayoutCursor; -class LayoutNode : public TreeNode { +class LayoutNode : public SerializableNode { public: enum class VerticalDirection { Up, @@ -22,7 +22,7 @@ public: // Constructor LayoutNode() : - TreeNode(), + SerializableNode(), m_baseline(0), m_frame(KDRectZero), m_baselined(false), diff --git a/poincare/include/poincare/layout_reference.h b/poincare/include/poincare/layout_reference.h index 342b9a679..868217d4b 100644 --- a/poincare/include/poincare/layout_reference.h +++ b/poincare/include/poincare/layout_reference.h @@ -1,18 +1,18 @@ #ifndef POINCARE_LAYOUT_REFERENCE_H #define POINCARE_LAYOUT_REFERENCE_H -#include "tree_reference.h" -#include "layout_node.h" +#include +#include namespace Poincare { class LayoutCursor; template -class LayoutReference : public TreeReference { +class LayoutReference : public SerializableReference { friend class LayoutCursor; public: - using TreeReference::TreeReference; + using SerializableReference::SerializableReference; // Operators diff --git a/poincare/include/poincare/serializable_node.h b/poincare/include/poincare/serializable_node.h new file mode 100644 index 000000000..d1e5da497 --- /dev/null +++ b/poincare/include/poincare/serializable_node.h @@ -0,0 +1,19 @@ +#ifndef POINCARE_SERIALIZABLE_NODE_H +#define POINCARE_SERIALIZABLE_NODE_H + +#include +#include + +namespace Poincare { + +class SerializableNode : public TreeNode { +public: + using TreeNode::TreeNode; + virtual bool needsParenthesisWithParent(SerializableNode * parentNode) { return false; } //TODO + virtual int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const = 0; + +}; + +} + +#endif diff --git a/poincare/include/poincare/serializable_reference.h b/poincare/include/poincare/serializable_reference.h new file mode 100644 index 000000000..db6998885 --- /dev/null +++ b/poincare/include/poincare/serializable_reference.h @@ -0,0 +1,35 @@ +#ifndef POINCARE_SERIALIZABLE_REFERENCE_H +#define POINCARE_SERIALIZABLE_REFERENCE_H + +#include +#include + +namespace Poincare { + +template +class SerializableReference : public TreeReference { +public: + using TreeReference::TreeReference; + + // Serialization + bool needsParenthesisWithParent(SerializableReference parentRef) { + assert(this->isDefined()); + return this->typedNode()->needsParenthesisWithParent(parentRef.typedNode()); + } + int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const { + assert(this->isDefined()); + return this->typedNode()->writeTextInBuffer(buffer, bufferSize, numberOfSignificantDigits); + } + + // Tree + SerializableReference serializableChildAtIndex(int i) { + TreeReference treeRefChild = TreeReference::treeChildAtIndex(i); + return SerializableReference(treeRefChild.node()); + } +}; + +typedef SerializableReference SerializableRef; + +} + +#endif diff --git a/poincare/include/poincare/tree_node.h b/poincare/include/poincare/tree_node.h index cad2af8c8..9a28f50a1 100644 --- a/poincare/include/poincare/tree_node.h +++ b/poincare/include/poincare/tree_node.h @@ -1,8 +1,6 @@ #ifndef POINCARE_TREE_NODE_H #define POINCARE_TREE_NODE_H -#include - #include #include #include @@ -37,10 +35,6 @@ public: virtual const char * description() const { return "UNKNOWN";} - // Serialization - virtual bool needsParenthesisWithParent(TreeNode * parentNode) { return false; } //TODO virtual pure and override on expresionNode/layoutNode - virtual int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const { return 0; } //TODO virtual pure - // Allocation failure virtual bool isAllocationFailure() const { return false; } virtual TreeNode * failedAllocationStaticNode() = 0; diff --git a/poincare/include/poincare/tree_reference.h b/poincare/include/poincare/tree_reference.h index bcf7a1f6d..fdcacf249 100644 --- a/poincare/include/poincare/tree_reference.h +++ b/poincare/include/poincare/tree_reference.h @@ -82,16 +82,6 @@ public: return node()->numberOfDescendants(includeSelf); } - // Serialization - bool needsParenthesisWithParent(TreeReference parentRef) { - assert(isDefined()); - return node()->needsParenthesisWithParent(parentRef.node()); - } - int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const { - assert(isDefined()); - return node()->writeTextInBuffer(buffer, bufferSize, numberOfSignificantDigits); - } - // Hierarchy bool hasChild(TreeReference t) const { assert(isDefined()); diff --git a/poincare/src/horizontal_layout_node.cpp b/poincare/src/horizontal_layout_node.cpp index 98ab80a5e..7f8ac7d61 100644 --- a/poincare/src/horizontal_layout_node.cpp +++ b/poincare/src/horizontal_layout_node.cpp @@ -142,7 +142,7 @@ int HorizontalLayoutNode::writeTextInBuffer(char * buffer, int bufferSize, int n buffer[0] = 0; return 0; } - return LayoutEngine::writeInfixTreeRefTextInBuffer(TreeRef(const_cast(this)), buffer, bufferSize, numberOfSignificantDigits, ""); + return LayoutEngine::writeInfixSerializableRefTextInBuffer(SerializableRef(const_cast(this)), buffer, bufferSize, numberOfSignificantDigits, ""); } void HorizontalLayoutNode::moveCursorLeft(LayoutCursor * cursor, bool * shouldRecomputeLayout) { diff --git a/poincare/src/layout_engine.cpp b/poincare/src/layout_engine.cpp index fc096b3de..e3c8ff6ec 100644 --- a/poincare/src/layout_engine.cpp +++ b/poincare/src/layout_engine.cpp @@ -213,8 +213,8 @@ int LayoutEngine::writePrefixExpressionOrExpressionLayoutTextInBuffer(const Expr } /* LayoutReference to Text */ -int LayoutEngine::writeInfixTreeRefTextInBuffer( - const TreeRef treeRef, +int LayoutEngine::writeInfixSerializableRefTextInBuffer( + const SerializableRef serializableRef, char * buffer, int bufferSize, int numberOfDigits, @@ -223,7 +223,7 @@ int LayoutEngine::writeInfixTreeRefTextInBuffer( int lastChildIndex) { // If buffer has size 0 or 1, put a zero if it fits and return - assert(treeRef.isDefined()); + assert(serializableRef.isDefined()); if (bufferSize == 0) { return -1; } @@ -233,13 +233,13 @@ int LayoutEngine::writeInfixTreeRefTextInBuffer( return 0; } - // Get some information on the TreeRef + // Get some information on the SerializableRef int numberOfChar = 0; - int numberOfOperands = treeRef.numberOfChildren(); + int numberOfOperands = serializableRef.numberOfChildren(); assert(numberOfOperands > 0); // Write the first child, with parentheses if needed - writeChildTreeInBuffer(treeRef.treeChildAtIndex(firstChildIndex), treeRef, buffer, bufferSize, numberOfDigits, &numberOfChar); + writeChildTreeInBuffer((const_cast(&serializableRef))->serializableChildAtIndex(firstChildIndex), serializableRef, buffer, bufferSize, numberOfDigits, &numberOfChar); if (numberOfChar >= bufferSize-1) { return bufferSize-1; } @@ -252,7 +252,7 @@ int LayoutEngine::writeInfixTreeRefTextInBuffer( return bufferSize-1; } // Write the child, with parentheses if needed - writeChildTreeInBuffer(treeRef.treeChildAtIndex(i), treeRef, buffer, bufferSize, numberOfDigits, &numberOfChar); + writeChildTreeInBuffer((const_cast(&serializableRef))->serializableChildAtIndex(i), serializableRef, buffer, bufferSize, numberOfDigits, &numberOfChar); if (numberOfChar >= bufferSize-1) { return bufferSize-1; } @@ -263,7 +263,7 @@ int LayoutEngine::writeInfixTreeRefTextInBuffer( return numberOfChar; } -void LayoutEngine::writeChildTreeInBuffer(TreeRef childRef, TreeRef parentRef, char * buffer, int bufferSize, int numberOfDigits, int * numberOfChar) { +void LayoutEngine::writeChildTreeInBuffer(SerializableRef childRef, SerializableRef parentRef, char * buffer, int bufferSize, int numberOfDigits, int * numberOfChar) { // Write the child with parentheses if needed bool addParentheses = childRef.needsParenthesisWithParent(parentRef); if (addParentheses) {