diff options
Diffstat (limited to 'node')
| -rw-r--r-- | node/mergenode.cpp | 70 | ||||
| -rw-r--r-- | node/mergenode.h | 7 |
2 files changed, 59 insertions, 18 deletions
diff --git a/node/mergenode.cpp b/node/mergenode.cpp index f9960b9..1cf6062 100644 --- a/node/mergenode.cpp +++ b/node/mergenode.cpp @@ -29,38 +29,62 @@ MergeNode::MergeNode() void MergeNode::run(ExecutionNode* previous) { m_previousNode = previous; - if(NULL!=previous) + m_result->setPrevious(previous->getResult()); + ExecutionNode* previousLast =nullptr; + for(auto start : *m_startList) { - m_result->setPrevious(previous->getResult()); - - Result* tmpResult = previous->getResult(); - while(NULL!=tmpResult) + ExecutionNode* last = getLatestNode(start); + if(nullptr!=last) { - DiceResult* dice = dynamic_cast<DiceResult*>(tmpResult); - if(NULL!=dice) + if(nullptr != previousLast) + { + auto startResult = start->getResult(); + startResult->setPrevious(previousLast->getResult()); + previousLast->setNextNode(start); + } + previousLast = last; + Result* tmpResult = last->getResult(); + while(nullptr!=tmpResult) { - ///@todo improve here to set homogeneous while is really - m_diceResult->setHomogeneous(false); - for(Die* die : dice->getResultList()) + DiceResult* dice = dynamic_cast<DiceResult*>(tmpResult); + if(nullptr!=dice) { - if(!m_diceResult->getResultList().contains(die)) + ///@todo improve here to set homogeneous while is really + m_diceResult->setHomogeneous(false); + for(Die* die : dice->getResultList()) { - Die* tmpdie = new Die(); - *tmpdie=*die; - die->displayed(); - m_diceResult->getResultList().append(tmpdie); + if(!m_diceResult->getResultList().contains(die)&&(!die->hasBeenDisplayed())) + { + Die* tmpdie = new Die(); + *tmpdie=*die; + die->displayed(); + m_diceResult->getResultList().append(tmpdie); + } } } + tmpResult = tmpResult->getPrevious(); } - tmpResult = tmpResult->getPrevious(); } } - if(NULL!=m_nextNode) + + auto first = m_startList->first(); + m_startList->clear(); + m_startList->append(first); + + if(nullptr!=m_nextNode) { m_nextNode->run(this); } } - +ExecutionNode* MergeNode::getLatestNode(ExecutionNode* node) +{ + ExecutionNode* next = node; + while(nullptr != next->getNextNode() && (next->getNextNode()!=this)) + { + next = next->getNextNode(); + } + return next; +} QString MergeNode::toString(bool withLabel) const { if(withLabel) @@ -91,3 +115,13 @@ ExecutionNode* MergeNode::getCopy() const return node; } + +QList<ExecutionNode *>* MergeNode::getStartList() const +{ + return m_startList; +} + +void MergeNode::setStartList(QList<ExecutionNode *>* startList) +{ + m_startList = startList; +} diff --git a/node/mergenode.h b/node/mergenode.h index aebf9e2..0626fb2 100644 --- a/node/mergenode.h +++ b/node/mergenode.h @@ -36,8 +36,15 @@ public: virtual QString toString(bool withLabel)const; virtual qint64 getPriority() const; virtual ExecutionNode *getCopy() const; + QList<ExecutionNode *>* getStartList() const; + void setStartList(QList<ExecutionNode *>* startList); + +private: + ExecutionNode *getLatestNode(ExecutionNode *node); + private: DiceResult* m_diceResult; + QList<ExecutionNode *>* m_startList; }; #endif // NUMBERNODE_H |