aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2018-03-18 17:40:47 +0100
committerRenaud G <renaud@rolisteam.org>2018-03-18 17:40:47 +0100
commit23900ee4a93c79451425864f2743a856d57461b9 (patch)
tree390400811833d6dbe7ec8278160086a76213cd38
parent5ff5516c8cab5599375234a9a1898b737e8541f2 (diff)
downloadOneRoll-23900ee4a93c79451425864f2743a856d57461b9.tar.gz
OneRoll-23900ee4a93c79451425864f2743a856d57461b9.zip
-Add node as parameter of condition
-rw-r--r--booleancondition.cpp46
-rw-r--r--booleancondition.h9
-rw-r--r--operationcondition.cpp39
-rw-r--r--operationcondition.h12
4 files changed, 78 insertions, 28 deletions
diff --git a/booleancondition.cpp b/booleancondition.cpp
index 5b2212f..83e4ee9 100644
--- a/booleancondition.cpp
+++ b/booleancondition.cpp
@@ -26,6 +26,15 @@ BooleanCondition::BooleanCondition()
: m_operator(Equal)
{
}
+
+BooleanCondition::~BooleanCondition()
+{
+ if(m_value!= nullptr)
+ {
+ delete m_value;
+ m_value = nullptr;
+ }
+}
qint64 BooleanCondition::hasValid(Die* b,bool recursive,bool unhighlight) const
{
QList<qint64> listValues;
@@ -39,27 +48,28 @@ qint64 BooleanCondition::hasValid(Die* b,bool recursive,bool unhighlight) const
}
qint64 sum= 0;
+ auto valueScalar = valueToScalar();
for(qint64 value: listValues)
{
switch(m_operator)
{
case Equal:
- sum+=(value==m_value)?1:0;
+ sum+=(value==valueScalar)?1:0;
break;
case GreaterThan:
- sum+= (value>m_value)?1:0;
+ sum+= (value>valueScalar)?1:0;
break;
case LesserThan:
- sum+= (value<m_value)?1:0;
+ sum+= (value<valueScalar)?1:0;
break;
case GreaterOrEqual:
- sum+= (value>=m_value)?1:0;
+ sum+= (value>=valueScalar)?1:0;
break;
case LesserOrEqual:
- sum+= (value<=m_value)?1:0;
+ sum+= (value<=valueScalar)?1:0;
break;
case Different:
- sum+= (value!=m_value)?1:0;
+ sum+= (value!=valueScalar)?1:0;
break;
}
}
@@ -80,7 +90,7 @@ void BooleanCondition::setOperator(LogicOperator m)
m_operator = m;
}
-void BooleanCondition::setValue(qint64 v)
+void BooleanCondition::setValueNode(ExecutionNode* v)
{
m_value=v;
}
@@ -108,7 +118,7 @@ QString BooleanCondition::toString()
str.append(QStringLiteral("!="));
break;
}
- return QStringLiteral("[%1%2]").arg(str).arg(m_value);
+ return QStringLiteral("[%1%2]").arg(str).arg(valueToScalar());
}
quint64 BooleanCondition::getValidRangeSize(quint64 faces) const
{
@@ -117,13 +127,13 @@ quint64 BooleanCondition::getValidRangeSize(quint64 faces) const
case Equal:
return 1;
case GreaterThan:
- return faces-m_value;
+ return faces-valueToScalar();
case LesserThan:
- return m_value-1;
+ return valueToScalar()-1;
case GreaterOrEqual:
- return faces-(m_value-1);
+ return faces-(valueToScalar()-1);
case LesserOrEqual:
- return m_value;
+ return valueToScalar();
case Different:
return faces-1;
}
@@ -133,9 +143,15 @@ Validator* BooleanCondition::getCopy() const
{
BooleanCondition* val = new BooleanCondition();
val->setOperator(m_operator);
- val->setValue(m_value);
-
-
+ val->setValueNode(m_value);
return val;
+}
+qint64 BooleanCondition::valueToScalar() const
+{
+ if(m_value == nullptr)
+ return 0;
+ m_value->run(nullptr);
+ auto result = m_value->getResult();
+ return result->getResult(Result::SCALAR).toInt();
}
diff --git a/booleancondition.h b/booleancondition.h
index 86dad72..b7282ad 100644
--- a/booleancondition.h
+++ b/booleancondition.h
@@ -24,6 +24,7 @@
#include <Qt>
#include "validator.h"
+#include "node/executionnode.h"
/**
* @brief The BooleanCondition class is a Validator class checking validity from logic expression.
* It manages many operators (see : @ref LogicOperator).
@@ -33,11 +34,12 @@ class BooleanCondition : public Validator
public:
enum LogicOperator { Equal, GreaterThan, LesserThan, GreaterOrEqual, LesserOrEqual, Different};
BooleanCondition();
+ virtual ~BooleanCondition();
virtual qint64 hasValid(Die* b,bool recursive, bool unhighlight = false) const;
void setOperator(LogicOperator m);
- void setValue(qint64);
+ void setValueNode(ExecutionNode*);
QString toString();
virtual quint64 getValidRangeSize(quint64 faces) const;
@@ -46,10 +48,11 @@ public:
* @return
*/
virtual Validator* getCopy() const;
-
+private:
+ qint64 valueToScalar() const;
private:
LogicOperator m_operator;
- qint64 m_value;
+ ExecutionNode* m_value;
};
#endif // BOOLEANCONDITION_H
diff --git a/operationcondition.cpp b/operationcondition.cpp
index 220e810..86c013a 100644
--- a/operationcondition.cpp
+++ b/operationcondition.cpp
@@ -25,7 +25,14 @@ OperationCondition::OperationCondition()
{
}
-
+OperationCondition::~OperationCondition()
+{
+ if(m_value!= nullptr)
+ {
+ delete m_value;
+ m_value = nullptr;
+ }
+}
BooleanCondition *OperationCondition::getBoolean() const
{
return m_boolean;
@@ -58,7 +65,10 @@ qint64 OperationCondition::hasValid(Die* b,bool recursive,bool unhighlight) cons
{
Die die;
die.setMaxValue(b->getMaxValue());
- die.insertRollValue(value%m_value);
+ auto valueScalar = valueToScalar();
+ if(valueScalar==0)
+ valueScalar = 1;
+ die.insertRollValue(value%valueScalar);
sum+=m_boolean->hasValid(&die,recursive,false);
}
break;
@@ -82,10 +92,11 @@ void OperationCondition::setOperator(ConditionOperator m)
m_operator = m;
}
-void OperationCondition::setValue(qint64 v)
+void OperationCondition::setValueNode(ExecutionNode *node)
{
- m_value=v;
+ m_value = node;
}
+
QString OperationCondition::toString()
{
QString str(QStringLiteral(""));
@@ -95,19 +106,33 @@ QString OperationCondition::toString()
str.append(QStringLiteral("\%"));
break;
}
- return QStringLiteral("[%1%2%3]").arg(str).arg(m_value).arg(m_boolean->toString());
+ return QStringLiteral("[%1%2%3]").arg(str).arg(valueToScalar()).arg(m_boolean->toString());
}
quint64 OperationCondition::getValidRangeSize(quint64 faces) const
{
- return faces/m_value;
+ auto value = valueToScalar();
+ if(value==0)
+ return 0;
+ return faces/value;
+
}
Validator* OperationCondition::getCopy() const
{
OperationCondition* val = new OperationCondition();
val->setOperator(m_operator);
- val->setValue(m_value);
+ val->setValueNode(m_value->getCopy());
BooleanCondition* boolean = dynamic_cast<BooleanCondition*>(m_boolean->getCopy());
val->setBoolean(boolean);
return val;
}
+
+qint64 OperationCondition::valueToScalar() const
+{
+ if(m_value == nullptr)
+ return 0;
+
+ m_value->run(nullptr);
+ auto result = m_value->getResult();
+ return result->getResult(Result::SCALAR).toInt();
+}
diff --git a/operationcondition.h b/operationcondition.h
index c3da827..2c4c4e7 100644
--- a/operationcondition.h
+++ b/operationcondition.h
@@ -24,17 +24,20 @@
#include <Qt>
#include "validator.h"
#include "booleancondition.h"
+#include "node/executionnode.h"
class OperationCondition : public Validator
{
public:
enum ConditionOperator { Modulo };
OperationCondition();
+ virtual ~OperationCondition();
virtual qint64 hasValid(Die* b,bool recursive, bool unhighlight = false) const;
void setOperator(ConditionOperator m);
- void setValue(qint64);
+ //void setValue(qint64);
+ void setValueNode(ExecutionNode* node);
QString toString();
virtual quint64 getValidRangeSize(quint64 faces) const;
@@ -44,9 +47,12 @@ public:
virtual Validator* getCopy() const;
private:
+ qint64 valueToScalar() const;
+private:
ConditionOperator m_operator;
- BooleanCondition* m_boolean;
- qint64 m_value;
+ BooleanCondition* m_boolean = nullptr;
+ //qint64 m_value;
+ ExecutionNode* m_value = nullptr;
};
#endif // OPERATIONCONDITION_H