65 using EqnPtr = std::shared_ptr<Equation>;
72 class Node :
public std::enable_shared_from_this<Node>
86 enum Select { NONE, START, END, ALL };
111 m_parent(parent), m_sign(!fNeg), m_select(s) {}
130 virtual std::string toString()
const=0;
137 virtual bool isLeaf()
const {
return true; }
154 virtual Node* findNode(
int x,
int y);
162 virtual Node* findNode(
const Box& b);
189 virtual bool less(
NodePtr b)
const {
return this->toString() < b->toString(); }
195 virtual const std::string& getName()
const=0;
201 virtual std::type_index getType()
const=0;
289 Node* getNextRight();
354 static bool createNodeByName(std::string name,
Equation& eqn);
363 std::shared_ptr<Node> sp;
365 sp = this->shared_from_this();
367 catch (std::exception& ex) {
368 sp = std::shared_ptr<Node>(
this);
418 virtual void calcOrig(
UI::Graphics& gc,
int x,
int y)=0;
430 virtual Complex getNodeValue()
const=0;
445 return (!m_parent) ? depth : m_parent->getDepth(++depth);
454 bool m_fDrawParenthesis =
false;
494 Node((
Node*) parent, fNeg), factors(node)
520 std::string toString()
const;
540 Node* findNode(
int x,
int y);
554 int numFactors()
const;
574 const std::string&
getName()
const {
return name; }
580 std::type_index
getType()
const {
return type; }
584 static const std::type_index
type;
613 void setParent() {
for (
auto f : factors ) f->setParent(
this); }
644 void multiply(
double n);
650 void multiply(
TermPtr old_term);
765 setDrawParenthesis(
true);
775 term->
setParent(
this); setDrawParenthesis(
true);
784 Node(parent), terms(new
Term(factor, this))
786 factor->
setParent(terms[0]); setDrawParenthesis(
true);
802 std::string toString()
const;
816 Node* findNode(
int x,
int y);
830 int numFactors()
const;
850 const std::string&
getName()
const {
return name; }
856 std::type_index
getType()
const {
return type; }
860 static const std::type_index
type;
871 void setParent() {
for (
auto t : terms ) t->setParent(
this); }
1003 class NodeIterator :
public std::iterator< std::bidirectional_iterator_tag, Node* >
1082 class FactorIterator :
public std::iterator< std::bidirectional_iterator_tag, Node* >
1224 void mergeNextTerm();
1231 Term* splitTerm(
bool fNeg =
false);
1237 void replace(
Term* term);
1243 void replace(
Node* node);
1250 void insert(
Node* node);
1258 void insertAfter(
Node* node);
1265 void insert(
Term* node,
bool sign =
true);
1272 void insertAfter(
Term* term,
bool sign =
true);
1278 bool isBegin() {
return m_factor_index == 0 && m_term_index == 0; }
1303 void setNode(
int factor,
int term);
1373 std::string
toString()
const {
return m_root->toString(); }
1379 void xml_out(std::ostream& os)
const;
1385 void xml_out(std::string& str)
const;
1404 bool blink() {
return m_input_index >= 0; }
1411 void getCursorOrig(
int& x,
int& y);
1417 void setCurrentInput(
int in_sn);
1429 void removeInput(
Input* in);
1436 if (m_inputs.empty() || m_input_index < 0)
1439 return m_inputs[m_input_index];
1445 void nextInput(
bool fShift);
1472 void setSelect(
Node* start,
Node* end =
nullptr);
1478 void selectNodeOrInput(
Node* node);
1487 void setSelectFromNode(
Node* node);
1522 void eraseSelection(
Node* node);
1529 bool simplify() { m_root->normalize();
return m_root->simplify(); }
1559 Node* getRoot() {
return m_root; }
1561 Node* getSelectStart() {
return m_selectStart; }
1563 Node* getSelectEnd() {
return m_selectEnd; }
1567 int m_input_index = -1;
1580 void factor(std::string text,
NodeVector& factors,
Node* parent);
1620 Input(
Equation& eqn, std::string txt = std::string(),
bool current =
true,
Node* parent =
nullptr,
1621 bool neg =
false,
Node::Select s = Node::Select::NONE);
1640 std::string toString()
const;
1652 const std::string&
getName()
const {
return name; }
1667 bool empty()
const {
return m_typed.empty(); }
1673 void add(
char ch) { m_typed += std::string(1, ch); }
1679 void add(
const std::string& s) { m_typed += s; }
1684 void remove() { m_typed.erase(m_typed.end() - 1); }
Term(Node *node, Expression *parent=nullptr, bool fNeg=false)
Definition: milo.h:493
~Expression()
Definition: milo.h:792
const std::string & getName() const
Definition: milo.h:574
virtual Node * downRight()
Definition: milo.h:388
virtual Node * getRightSibling(Node *)
Definition: milo.h:402
TermVector terms
Expression owns this tree a list of terms.
Definition: milo.h:925
void negative()
Definition: milo.h:334
FactorIterator getBegin()
Definition: milo.h:1309
Box m_internal
Bounding box of this node.
Definition: milo.h:665
bool getSign() const
Definition: milo.h:340
virtual int numFactors() const
Definition: milo.h:170
static void xml_in(const string &fname)
Definition: milo_test.cpp:280
FactorIterator getLast()
Definition: milo.h:1315
bool isLeaf() const
Definition: milo.h:808
FactorIterator & operator--()
Definition: milo.h:1194
Node *& operator*()
Definition: milo.h:1025
void setDrawParenthesis(bool fDrawPar)
Definition: milo.h:253
TermVector::iterator begin()
Definition: milo.h:877
std::shared_ptr< Equation > EqnPtr
Shared pointer for equation.
Definition: milo.h:65
static const std::type_index type
Type of this class.
Definition: milo.h:860
Term(Parser &p, Expression *parent=nullptr)
Definition: milo.h:470
std::complex< double > Complex
Specialized as complex double.
Definition: milo.h:58
void setParent(Node *parent)
Definition: milo.h:294
typename std::vector< SmartPtr< Node > >::iterator iterator
Definition: smart.h:88
virtual void normalize()
Definition: milo.h:175
static const std::string name
Name of Term class.
Definition: milo.h:583
Expression * m_gpExpr
Grandparent expresson of current factor.
Definition: milo.h:1087
Term(NodeVector &f, Expression *parent)
Definition: milo.h:485
Node * getParent() const
Definition: milo.h:300
bool isLeaf() const
Definition: milo.h:526
void multNth(int n)
Definition: milo.h:323
static void simplify(const string &)
Definition: milo_test.cpp:345
TermVector::iterator end()
Definition: milo.h:883
NodeVector factors
Term owns this tree.
Definition: milo.h:664
NodeIterator & operator--()
Definition: milo.h:1066
bool m_sign
True if positve.
Definition: milo.h:449
const Frame & getFrame() const
Definition: milo.h:265
Definition: parser.cpp:85
Input * getCurrentInput()
Definition: milo.h:1435
bool operator==(const NodeIterator &rhs)
Definition: milo.h:1039
Select m_select
Select state of this node.
Definition: milo.h:450
~Term()
Definition: milo.h:502
static void parse(const string &eqn_str)
EqnPanel class object.
Definition: milo_test.cpp:271
static void xml_out(const string &)
Definition: milo_test.cpp:288
NodeIterator operator++(int)
Definition: milo.h:1060
std::shared_ptr< Term > getSharedPtr()
Definition: milo.h:657
void setNode(int factor, int term)
Definition: milo.cpp:437
Node * downRight()
Definition: milo.h:942
virtual bool simplify()
Definition: milo.h:181
unsigned int m_factor_index
Index of current factor in parent term.
Definition: milo.h:1088
std::type_index getType() const
Definition: milo.h:856
void addInput(Input *in)
Definition: milo.h:1423
bool isEnd()
Definition: milo.h:1284
Box m_parenthesis
Rectangle that contains paranthesis of this node.
Definition: milo.h:452
Expression(Parser &p, Node *parent=nullptr)
Definition: milo.h:762
void setParent(Expression *parent)
Definition: milo.h:619
std::vector< std::string > m_eqns
List of pointer to equation objects in undo history.
Definition: milo.h:1824
const std::string & getName() const
Definition: milo.h:850
NodePtr m_root
Equation owns this tree.
Definition: milo.h:1565
void addNth(int n)
Definition: milo.h:317
static const std::vector< std::string > select_tags
Definition: milo.h:92
Node * m_node
Current factor.
Definition: milo.h:1085
std::vector< Input * > m_inputs
List of input nodes in equation.
Definition: milo.h:1566
FactorIterator operator++(int)
Definition: milo.h:1188
virtual bool isLeaf() const
Definition: milo.h:137
Node *& operator->()
Definition: milo.h:1132
bool blink()
Definition: milo.h:1404
unsigned int m_term_index
Term index of current factor in grandparent expression.
Definition: milo.h:1089
NodeIterator operator--(int)
Definition: milo.h:1074
int getDepth(int depth) const
Definition: milo.h:444
bool isBegin()
Definition: milo.h:1278
NodeIterator last()
Definition: milo.h:1549
int getDepth() const
Definition: milo.h:306
Frame m_frame
Frame of this node includes enclosing rect and vertical offset.
Definition: milo.h:451
void setSelectStart(Node *start)
Definition: milo.h:1456
NodeIterator(Node *node)
Definition: milo.h:1017
FactorIterator & operator++()
Definition: milo.h:1180
bool getDrawParenthesis() const
Definition: milo.h:259
bool operator==(const FactorIterator &rhs)
Definition: milo.h:1139
Box m_internal
Bounding box of this node.
Definition: milo.h:926
bool simplify()
Definition: milo.h:1529
Node(Node *parent=nullptr, bool fNeg=false, Select s=NONE)
Definition: milo.h:110
static const std::string name
Name of this class.
Definition: milo.h:859
NodeIter begin()
Definition: milo.h:625
void setSelect(Select s)
Definition: milo.h:241
FactorIterator(NodeIterator n)
Definition: milo.h:1109
~Equation()
Definition: milo.h:1352
EqnUndoList()
Definition: milo.h:1804
Node * downLeft()
Definition: milo.h:935
virtual bool isFactor() const
Definition: milo.h:144
NodeIter end()
Definition: milo.h:631
Select getSelect() const
Definition: milo.h:247
Node *& operator->()
Definition: milo.h:1032
virtual bool less(NodePtr b) const
Definition: milo.h:189
bool isFactor() const
Definition: milo.h:532
virtual ~Node()
Abstract base class needs virtual desctructor.
Definition: milo.h:121
bool isBeginTerm()
Definition: milo.h:1290
Node *& operator*()
Definition: milo.h:1125
Node * m_parent
Parent node of this node. Can be null if root.
Definition: milo.h:448
bool operator!=(const NodeIterator &rhs)
Definition: milo.h:1046
Select
Definition: milo.h:86
static void normalize(const string &)
Definition: milo_test.cpp:338
NodeIterator begin()
Definition: milo.h:1539
int numTerms() const
Definition: milo.h:866
NodeIterator & operator++()
Definition: milo.h:1052
Expression(Term *term, Node *parent=nullptr)
Definition: milo.h:773
Equation(const Equation &eqn)
Definition: milo.h:1347
static const std::type_index type
Type of Term class.
Definition: milo.h:584
Term * m_pTerm
Parent term of current factor.
Definition: milo.h:1086
Node * m_node
Current node pointed to be iterator.
Definition: milo.h:1006
void setSelectEnd(Node *end)
Definition: milo.h:1462
FactorIterator operator--(int)
Definition: milo.h:1202
std::shared_ptr< Node > getSharedPtr()
Definition: milo.h:361
bool operator!=(const FactorIterator &rhs)
Definition: milo.h:1146
NodeVector::iterator NodeIter
Iterator into vector of node pointers.
Definition: milo.h:61
Expression(Node *factor, Node *parent=nullptr)
Definition: milo.h:783
Node * downRight()
Definition: milo.h:681
std::string toString() const
Definition: milo.h:1373
void setParent()
Definition: milo.h:871
virtual Node * getLeftSibling(Node *)
Definition: milo.h:395
Node * downLeft()
Definition: milo.h:674
void setNth(int n)
Definition: milo.h:329
int getNth() const
Definition: milo.h:311
void setParent()
Definition: milo.h:613
virtual Node * downLeft()
Definition: milo.h:381
std::type_index getType() const
Definition: milo.h:580
void normalize()
Definition: milo.h:1534
Definition: parser.cpp:43
NodeIterator end()
Definition: milo.h:1544