RationalNumberType::isImplicitlyConvertibleTo Refactor

This commit is contained in:
Khan M Rashedun-Naby 2018-06-24 08:15:25 +06:00
parent 9b67bdb3f4
commit 097a3fabf4

View File

@ -856,7 +856,9 @@ tuple<bool, rational> RationalNumberType::isValidLiteral(Literal const& _literal
bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const
{ {
if (_convertTo.category() == Category::Integer) switch (_convertTo.category())
{
case Category::Integer:
{ {
if (m_value == rational(0)) if (m_value == rational(0))
return true; return true;
@ -868,31 +870,33 @@ bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const
{ {
if (m_value.numerator() <= (u256(-1) >> (256 - targetType.numBits() + forSignBit))) if (m_value.numerator() <= (u256(-1) >> (256 - targetType.numBits() + forSignBit)))
return true; return true;
}
else if (targetType.isSigned() && -m_value.numerator() <= (u256(1) << (targetType.numBits() - forSignBit)))
return true;
return false; return false;
} }
else if (_convertTo.category() == Category::FixedPoint) if (targetType.isSigned())
{
if (-m_value.numerator() <= (u256(1) << (targetType.numBits() - forSignBit)))
return true;
}
return false;
}
case Category::FixedPoint:
{ {
if (auto fixed = fixedPointType()) if (auto fixed = fixedPointType())
return fixed->isImplicitlyConvertibleTo(_convertTo); return fixed->isImplicitlyConvertibleTo(_convertTo);
else
return false; return false;
} }
else if (_convertTo.category() == Category::FixedBytes) case Category::FixedBytes:
{ {
FixedBytesType const& fixedBytes = dynamic_cast<FixedBytesType const&>(_convertTo); FixedBytesType const& fixedBytes = dynamic_cast<FixedBytesType const&>(_convertTo);
if (!isFractional()) if (isFractional())
{ return false;
if (integerType()) if (integerType())
return fixedBytes.numBytes() * 8 >= integerType()->numBits(); return fixedBytes.numBytes() * 8 >= integerType()->numBits();
return false; return false;
} }
else default:
return false; return false;
} }
return false;
} }
bool RationalNumberType::isExplicitlyConvertibleTo(Type const& _convertTo) const bool RationalNumberType::isExplicitlyConvertibleTo(Type const& _convertTo) const