From 420262877bccd35e5bc8c87eb586ba73288fe9c8 Mon Sep 17 00:00:00 2001 From: Renaud G Date: Tue, 23 Apr 2019 11:01:43 +0200 Subject: Add unique operator --- HelpMe.md | 5 +-- cli/CMakeLists.txt | 1 + diceparser.cpp | 9 +++++ diceparser.h | 3 +- diceparser.pri | 2 ++ irc/CMakeLists.txt | 1 + node/uniquenode.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++ node/uniquenode.h | 44 ++++++++++++++++++++++++ 8 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 node/uniquenode.cpp create mode 100644 node/uniquenode.h diff --git a/HelpMe.md b/HelpMe.md index a3ae8d1..94f6dce 100644 --- a/HelpMe.md +++ b/HelpMe.md @@ -298,10 +298,11 @@ Final result: `6+4+3 = 13` It makes exploded dice as new dice. -> 4d6e6uk3 +> 4d6e6u + Result: 6 4 3 3 2 -Final result: 6+4+3 = 13 +Final result: 6+4+3 = 13 ### Bind diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index f3dd61d..36bced4 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -106,6 +106,7 @@ SET( dice_sources ../node/groupnode.cpp ../node/bind.cpp ../node/occurencecountnode.cpp + ../node/uniquenode.cpp main.cpp displaytoolbox.cpp ../highlightdice.cpp diff --git a/diceparser.cpp b/diceparser.cpp index 0c6b23c..f5d543f 100644 --- a/diceparser.cpp +++ b/diceparser.cpp @@ -33,6 +33,7 @@ #include "node/groupnode.h" #include "node/helpnode.h" #include "node/ifnode.h" +#include "node/uniquenode.h" #include "node/jumpbackwardnode.h" #include "node/keepdiceexecnode.h" #include "node/listaliasnode.h" @@ -77,6 +78,7 @@ DiceParser::DiceParser() m_OptionOp->insert(QStringLiteral("p"), Painter); m_OptionOp->insert(QStringLiteral("f"), Filter); m_OptionOp->insert(QStringLiteral("y"), Split); + m_OptionOp->insert(QStringLiteral("u"), Unique); m_OptionOp->insert(QStringLiteral("g"), Group); m_OptionOp->insert(QStringLiteral("b"), Bind); m_OptionOp->insert(QStringLiteral("o"), Occurences); @@ -1140,6 +1142,13 @@ bool DiceParser::readOption(QString& str, ExecutionNode* previous) //, found= true; } break; + case Unique: + { + node= new UniqueNode(); + previous->setNextNode(node); + found= true; + } + break; case Painter: { PainterNode* painter= new PainterNode(); diff --git a/diceparser.h b/diceparser.h index ca50d10..afd6146 100644 --- a/diceparser.h +++ b/diceparser.h @@ -90,8 +90,9 @@ public: Filter, Split, Group, - Bind, Occurences + Unique, + Bind }; /** * @brief The CommandOperator enum diff --git a/diceparser.pri b/diceparser.pri index 5e5630c..933bed0 100644 --- a/diceparser.pri +++ b/diceparser.pri @@ -38,6 +38,7 @@ SOURCES += $$PWD/diceparser.cpp \ $$PWD/node/paintnode.cpp \ $$PWD/node/ifnode.cpp \ $$PWD/node/splitnode.cpp \ + $$PWD/node/uniquenode.cpp \ $$PWD/node/listsetrollnode.cpp\ $$PWD/node/variablenode.cpp\ $$PWD/node/bind.cpp\ @@ -83,6 +84,7 @@ HEADERS += \ $$PWD/node/ifnode.h \ $$PWD/node/bind.h\ $$PWD/node/splitnode.h \ + $$PWD/node/uniquenode.h \ $$PWD/node/paintnode.h \ $$PWD/node/listsetrollnode.h \ $$PWD/node/occurencecountnode.h\ diff --git a/irc/CMakeLists.txt b/irc/CMakeLists.txt index d7c31cd..990e0eb 100644 --- a/irc/CMakeLists.txt +++ b/irc/CMakeLists.txt @@ -72,6 +72,7 @@ add_executable( ../node/filternode.cpp ../node/splitnode.cpp ../node/groupnode.cpp + ../node/uniquenode.cpp ../node/bind.cpp botircdiceparser.cpp ../node/variablenode.cpp diff --git a/node/uniquenode.cpp b/node/uniquenode.cpp new file mode 100644 index 0000000..4ef7fa6 --- /dev/null +++ b/node/uniquenode.cpp @@ -0,0 +1,97 @@ +/*************************************************************************** + * Copyright (C) 2014 by Renaud Guezennec * + * http://www.rolisteam.org/contact * + * * + * This file is part of DiceParser * + * * + * DiceParser is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "uniquenode.h" + +UniqueNode::UniqueNode() : m_diceResult(new DiceResult()) +{ + m_result= m_diceResult; +} +void UniqueNode::run(ExecutionNode* previous) +{ + m_previousNode= previous; + if(nullptr != previous) + { + m_result->setPrevious(previous->getResult()); + + + Result* tmpResult= previous->getResult(); + if(nullptr != tmpResult) + { + DiceResult* dice= dynamic_cast(tmpResult); + if(nullptr != dice) + { + auto const& resultList = dice->getResultList(); + std::vector formerValues; + formerValues.reserve(resultList.size()); + for(auto& oldDie : resultList) + { + auto value=oldDie->getValue(); + auto it = std::find(formerValues.begin(), formerValues.end(), value); + + + if(it == formerValues.end()) + { + auto die = new Die(); + *die = *oldDie; + m_diceResult->insertResult(die); + formerValues.push_back(value); + } + oldDie->displayed(); + } + } + } + } + if(nullptr != m_nextNode) + { + m_nextNode->run(this); + } +} + +QString UniqueNode::toString(bool withLabel) const +{ + if(withLabel) + { + return QString("%1 [label=\"UniqueNode Node\"]").arg(m_id); + } + else + { + return m_id; + } +} +qint64 UniqueNode::getPriority() const +{ + qint64 priority= 0; + if(nullptr != m_nextNode) + { + priority= m_nextNode->getPriority(); + } + return priority; +} +ExecutionNode* UniqueNode::getCopy() const +{ + UniqueNode* node= new UniqueNode(); + if(nullptr != m_nextNode) + { + node->setNextNode(m_nextNode->getCopy()); + } + return node; +} diff --git a/node/uniquenode.h b/node/uniquenode.h new file mode 100644 index 0000000..514c0c6 --- /dev/null +++ b/node/uniquenode.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * Copyright (C) 2014 by Renaud Guezennec * + * http://www.rolisteam.org/contact * + * * + * This file is part of DiceParser * + * * + * DiceParser is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef UNIQUENODE_H +#define UNIQUENODE_H + +#include "node/executionnode.h" +#include "result/diceresult.h" + +/** + * @brief The UniqueNode class is an ExecutionNode. It is dedicated to unique result of one dice into one dimension array. + */ +class UniqueNode : public ExecutionNode +{ +public: + UniqueNode(); + void run(ExecutionNode* previous); + virtual QString toString(bool withLabel) const; + virtual qint64 getPriority() const; + virtual ExecutionNode* getCopy() const; + +private: + DiceResult* m_diceResult; +}; + +#endif // NUMBERNODE_H -- cgit v1.2.3-70-g09d2