aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/operationcondition.cpp
diff options
context:
space:
mode:
authorrenaud guezennec <renaud@rolisteam.org>2019-07-29 20:35:52 +0000
committerrenaud guezennec <renaud@rolisteam.org>2019-07-29 20:35:52 +0000
commit1a902d383eef1e042d4462cd07b9384fcdf4d118 (patch)
tree766b8ab720fa5da11730d2fc2388f51b9d14de49 /operationcondition.cpp
parentf5906125576a8323a731c9456ce3dfc53b67ef59 (diff)
parent0d4b68221bda594cc695d216dfa21306ddb69c85 (diff)
downloadOneRoll-1a902d383eef1e042d4462cd07b9384fcdf4d118.tar.gz
OneRoll-1a902d383eef1e042d4462cd07b9384fcdf4d118.zip
Merge branch 'liberation' into 'master'
Add fuzzer on the DiceParser See merge request kde/rolisteam-diceparser!2
Diffstat (limited to 'operationcondition.cpp')
-rw-r--r--operationcondition.cpp47
1 files changed, 38 insertions, 9 deletions
diff --git a/operationcondition.cpp b/operationcondition.cpp
index 53a994d..9ef8e1e 100644
--- a/operationcondition.cpp
+++ b/operationcondition.cpp
@@ -41,6 +41,10 @@ void OperationCondition::setBoolean(BooleanCondition* boolean)
qint64 OperationCondition::hasValid(Die* b, bool recursive, bool unhighlight) const
{
+ if(nullptr == m_boolean)
+ {
+ return 0;
+ }
QList<qint64> listValues;
if(recursive)
{
@@ -64,7 +68,7 @@ qint64 OperationCondition::hasValid(Die* b, bool recursive, bool unhighlight) co
if(valueScalar == 0)
valueScalar= 1;
die.insertRollValue(value % valueScalar);
- sum+= m_boolean->hasValid(&die, recursive, false);
+ sum+= m_boolean->hasValid(&die, recursive, false) ? 1 : 0;
}
break;
}
@@ -102,18 +106,26 @@ QString OperationCondition::toString()
}
return QStringLiteral("[%1%2%3]").arg(str).arg(valueToScalar()).arg(m_boolean->toString());
}
-bool OperationCondition::isValidRangeSize(std::pair<qint64, qint64>) const
+Dice::CONDITION_STATE OperationCondition::isValidRangeSize(const std::pair<qint64, qint64>& range) const
{
- auto value= valueToScalar();
- bool valid= true;
+ Dice::CONDITION_STATE valid= Dice::CONDITION_STATE::REACHABLE;
+
+ auto rangeIsClose= (range.first == range.second);
- if(value == 0)
- valid= false;
- /* else if(nullptr != m_boolean)
- valid = m_boolean->isValidRangeSize(range);*/
+ Die die;
+ die.insertRollValue(range.first);
+
+ if(nullptr == m_boolean)
+ return Dice::CONDITION_STATE::ERROR;
+
+ if(rangeIsClose && m_boolean->hasValid(&die, false, false))
+ valid= Dice::CONDITION_STATE::ALWAYSTRUE;
+ else if(rangeIsClose && !m_boolean->hasValid(&die, false, false))
+ valid= Dice::CONDITION_STATE::UNREACHABLE;
return valid;
}
+
Validator* OperationCondition::getCopy() const
{
OperationCondition* val= new OperationCondition();
@@ -131,5 +143,22 @@ qint64 OperationCondition::valueToScalar() const
m_value->run(nullptr);
auto result= m_value->getResult();
- return result->getResult(Result::SCALAR).toInt();
+ return result->getResult(Dice::RESULT_TYPE::SCALAR).toInt();
+}
+
+const std::set<qint64>& OperationCondition::getPossibleValues(const std::pair<qint64, qint64>& range)
+{
+ if(nullptr == m_boolean)
+ return m_values;
+
+ for(qint64 i= std::min(range.first, range.second); i <= std::max(range.first, range.second); ++i)
+ {
+ auto valueScalar= valueToScalar();
+ auto val= i % valueScalar;
+ Die die;
+ die.insertRollValue(val);
+ if(m_boolean->hasValid(&die, false, false))
+ m_values.insert(i);
+ }
+ return m_values;
}