aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2019-04-23 11:01:43 +0200
committerRenaud G <renaud@rolisteam.org>2019-04-23 11:33:14 +0200
commit420262877bccd35e5bc8c87eb586ba73288fe9c8 (patch)
tree7037fc235ae9acb2e12b1155ed61fbda1d6b5724
parente01a80db01ee4afd9ce546fbad284c3aa56ea11c (diff)
downloadOneRoll-420262877bccd35e5bc8c87eb586ba73288fe9c8.tar.gz
OneRoll-420262877bccd35e5bc8c87eb586ba73288fe9c8.zip
Add unique operator
-rw-r--r--HelpMe.md5
-rw-r--r--cli/CMakeLists.txt1
-rw-r--r--diceparser.cpp9
-rw-r--r--diceparser.h3
-rw-r--r--diceparser.pri2
-rw-r--r--irc/CMakeLists.txt1
-rw-r--r--node/uniquenode.cpp97
-rw-r--r--node/uniquenode.h44
8 files changed, 159 insertions, 3 deletions
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<DiceResult*>(tmpResult);
+ if(nullptr != dice)
+ {
+ auto const& resultList = dice->getResultList();
+ std::vector<qint64> 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