mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-01 22:15:37 +00:00
Fixes to testing if condition is always or never true
This commit is contained in:
parent
5315866f61
commit
20942e6658
2 changed files with 24 additions and 12 deletions
|
@ -706,6 +706,13 @@ bool CSMWorld::ConstInfoSelectWrapper::rangeContains(T1 value, std::pair<T2,T2>
|
||||||
return (value >= range.first && value <= range.second);
|
return (value >= range.first && value <= range.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2>
|
||||||
|
bool CSMWorld::ConstInfoSelectWrapper::rangeFullyContains(std::pair<T1,T1> containingRange,
|
||||||
|
std::pair<T2,T2> testRange) const
|
||||||
|
{
|
||||||
|
return (containingRange.first <= testRange.first) && (testRange.second <= containingRange.second);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
template <typename T1, typename T2>
|
||||||
bool CSMWorld::ConstInfoSelectWrapper::rangesOverlap(std::pair<T1,T1> range1, std::pair<T2,T2> range2) const
|
bool CSMWorld::ConstInfoSelectWrapper::rangesOverlap(std::pair<T1,T1> range1, std::pair<T2,T2> range2) const
|
||||||
{
|
{
|
||||||
|
@ -727,21 +734,22 @@ template <typename T1, typename T2>
|
||||||
bool CSMWorld::ConstInfoSelectWrapper::conditionIsAlwaysTrue(std::pair<T1,T1> conditionRange,
|
bool CSMWorld::ConstInfoSelectWrapper::conditionIsAlwaysTrue(std::pair<T1,T1> conditionRange,
|
||||||
std::pair<T2,T2> validRange) const
|
std::pair<T2,T2> validRange) const
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (mRelationType)
|
switch (mRelationType)
|
||||||
{
|
{
|
||||||
case Relation_Equal:
|
case Relation_Equal:
|
||||||
case Relation_Greater:
|
return false;
|
||||||
case Relation_GreaterOrEqual:
|
|
||||||
case Relation_Less:
|
|
||||||
case Relation_LessOrEqual:
|
|
||||||
// If ranges are same, it will always be true
|
|
||||||
return rangesMatch(conditionRange, validRange);
|
|
||||||
|
|
||||||
case Relation_NotEqual:
|
case Relation_NotEqual:
|
||||||
// If value is not within range, it will always be true
|
// If value is not within range, it will always be true
|
||||||
return !rangeContains(conditionRange.first, validRange);
|
return !rangeContains(conditionRange.first, validRange);
|
||||||
|
|
||||||
|
case Relation_Greater:
|
||||||
|
case Relation_GreaterOrEqual:
|
||||||
|
case Relation_Less:
|
||||||
|
case Relation_LessOrEqual:
|
||||||
|
// If the valid range is completely within the condition range, it will always be true
|
||||||
|
return rangeFullyContains(conditionRange, validRange);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw std::logic_error("InfoCondition: operator can not be used to compare");
|
throw std::logic_error("InfoCondition: operator can not be used to compare");
|
||||||
}
|
}
|
||||||
|
@ -756,6 +764,11 @@ bool CSMWorld::ConstInfoSelectWrapper::conditionIsNeverTrue(std::pair<T1,T1> con
|
||||||
switch (mRelationType)
|
switch (mRelationType)
|
||||||
{
|
{
|
||||||
case Relation_Equal:
|
case Relation_Equal:
|
||||||
|
return !rangeContains(conditionRange.first, validRange);
|
||||||
|
|
||||||
|
case Relation_NotEqual:
|
||||||
|
return false;
|
||||||
|
|
||||||
case Relation_Greater:
|
case Relation_Greater:
|
||||||
case Relation_GreaterOrEqual:
|
case Relation_GreaterOrEqual:
|
||||||
case Relation_Less:
|
case Relation_Less:
|
||||||
|
@ -763,10 +776,6 @@ bool CSMWorld::ConstInfoSelectWrapper::conditionIsNeverTrue(std::pair<T1,T1> con
|
||||||
// If ranges do not overlap, it will never be true
|
// If ranges do not overlap, it will never be true
|
||||||
return !rangesOverlap(conditionRange, validRange);
|
return !rangesOverlap(conditionRange, validRange);
|
||||||
|
|
||||||
case Relation_NotEqual:
|
|
||||||
// If the value is the only value withing the range, it will never be true
|
|
||||||
return rangesMatch(conditionRange, validRange);
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw std::logic_error("InfoCondition: operator can not be used to compare");
|
throw std::logic_error("InfoCondition: operator can not be used to compare");
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,6 +188,9 @@ namespace CSMWorld
|
||||||
template <typename Type1, typename Type2>
|
template <typename Type1, typename Type2>
|
||||||
bool rangesOverlap(std::pair<Type1,Type1> range1, std::pair<Type2,Type2> range2) const;
|
bool rangesOverlap(std::pair<Type1,Type1> range1, std::pair<Type2,Type2> range2) const;
|
||||||
|
|
||||||
|
template <typename Type1, typename Type2>
|
||||||
|
bool rangeFullyContains(std::pair<Type1,Type1> containing, std::pair<Type2,Type2> test) const;
|
||||||
|
|
||||||
template <typename Type1, typename Type2>
|
template <typename Type1, typename Type2>
|
||||||
bool rangesMatch(std::pair<Type1,Type1> range1, std::pair<Type2,Type2> range2) const;
|
bool rangesMatch(std::pair<Type1,Type1> range1, std::pair<Type2,Type2> range2) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue