Merge pull request #455 from Dmitry-Me/refactorNumberIsX
Reuse code in isXNumber() to avoid duplication and unneeded computations
This commit is contained in:
commit
e965d8de67
|
@ -8313,51 +8313,58 @@ void Tokenizer::cppcheckError(const Token *tok) const
|
||||||
printDebugOutput();
|
printDebugOutput();
|
||||||
throw InternalError(tok, "Analysis failed. If the code is valid then please report this failure.", InternalError::INTERNAL);
|
throw InternalError(tok, "Analysis failed. If the code is valid then please report this failure.", InternalError::INTERNAL);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Helper function to check whether number is equal to integer constant X
|
||||||
|
* or floating point pattern X.0
|
||||||
|
* @param s the string to check
|
||||||
|
* @param intConstant the integer constant to check against
|
||||||
|
* @param floatConstant the string with stringified float constant to check against
|
||||||
|
* @return true in case s is equal to X or X.0 and false otherwise.
|
||||||
|
*/
|
||||||
|
static bool isNumberOneOf(const std::string &s, const MathLib::bigint& intConstant, const char* floatConstant)
|
||||||
|
{
|
||||||
|
if (MathLib::isInt(s)) {
|
||||||
|
if (MathLib::toLongNumber(s) == intConstant)
|
||||||
|
return true;
|
||||||
|
} else if (MathLib::isFloat(s)) {
|
||||||
|
if (MathLib::toString(MathLib::toDoubleNumber(s)) == floatConstant)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Helper function to check wether number is zero (0 or 0.0 or 0E+0) or not?
|
// Helper function to check whether number is zero (0 or 0.0 or 0E+0) or not?
|
||||||
// @param s --> a string to check
|
// @param s the string to check
|
||||||
// @return true in case s is zero and false otherwise.
|
// @return true in case s is zero and false otherwise.
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
bool Tokenizer::isZeroNumber(const std::string &s)
|
bool Tokenizer::isZeroNumber(const std::string &s)
|
||||||
{
|
{
|
||||||
const bool isInteger = MathLib::isInt(s);
|
return isNumberOneOf(s, 0L, "0.0");
|
||||||
const bool isFloat = MathLib::isFloat(s);
|
|
||||||
const bool isZeroValue = ((isInteger && (MathLib::toLongNumber(s) == 0L)) // case: integer number
|
|
||||||
|| (isFloat && MathLib::toString(MathLib::toDoubleNumber(s)) == "0.0")); // case: float number
|
|
||||||
|
|
||||||
return isZeroValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Helper function to check wether number is one (1 or 0.1E+1 or 1E+0) or not?
|
// Helper function to check whether number is one (1 or 0.1E+1 or 1E+0) or not?
|
||||||
// @param s --> a string to check
|
// @param s the string to check
|
||||||
// @return true in case s is one and false otherwise.
|
// @return true in case s is one and false otherwise.
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
bool Tokenizer::isOneNumber(const std::string &s)
|
bool Tokenizer::isOneNumber(const std::string &s)
|
||||||
{
|
{
|
||||||
const bool isPositive = MathLib::isPositive(s);
|
if (!MathLib::isPositive(s))
|
||||||
const bool isInteger = MathLib::isInt(s);
|
return false;
|
||||||
const bool isFloat = MathLib::isFloat(s);
|
return isNumberOneOf(s, 1L, "1.0");
|
||||||
const bool isZeroValue = ((isPositive && isInteger && (MathLib::toLongNumber(s) == 1L)) // case: integer number
|
|
||||||
|| (isPositive && isFloat && MathLib::toString(MathLib::toDoubleNumber(s)) == "1.0")); // case: float number
|
|
||||||
|
|
||||||
return isZeroValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Helper function to check wether number is one (2 or 0.2E+1 or 2E+0) or not?
|
// Helper function to check whether number is two (2 or 0.2E+1 or 2E+0) or not?
|
||||||
// @param s --> a string to check
|
// @param s the string to check
|
||||||
// @return true in case s is two and false otherwise.
|
// @return true in case s is two and false otherwise.
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
bool Tokenizer::isTwoNumber(const std::string &s)
|
bool Tokenizer::isTwoNumber(const std::string &s)
|
||||||
{
|
{
|
||||||
const bool isPositive = MathLib::isPositive(s);
|
if (!MathLib::isPositive(s))
|
||||||
const bool isInteger = MathLib::isInt(s);
|
return false;
|
||||||
const bool isFloat = MathLib::isFloat(s);
|
return isNumberOneOf(s, 2L, "2.0");
|
||||||
const bool isZeroValue = ((isPositive && isInteger && (MathLib::toLongNumber(s) == 2L)) // case: integer number
|
|
||||||
|| (isPositive && isFloat && MathLib::toString(MathLib::toDoubleNumber(s)) == "2.0")); // case: float number
|
|
||||||
|
|
||||||
return isZeroValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------
|
// ------------------------------------------------------
|
||||||
|
|
|
@ -763,22 +763,22 @@ public:
|
||||||
static Token *copyTokens(Token *dest, const Token *first, const Token *last, bool one_line = true);
|
static Token *copyTokens(Token *dest, const Token *first, const Token *last, bool one_line = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function to check wether number is zero (0 or 0.0 or 0E+0) or not?
|
* Helper function to check whether number is zero (0 or 0.0 or 0E+0) or not?
|
||||||
* @param s --> a string to check
|
* @param s the string to check
|
||||||
* @return true in case is is zero and false otherwise.
|
* @return true in case is is zero and false otherwise.
|
||||||
*/
|
*/
|
||||||
static bool isZeroNumber(const std::string &s);
|
static bool isZeroNumber(const std::string &s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function to check wether number is one (1 or 0.1E+1 or 1E+0) or not?
|
* Helper function to check whether number is one (1 or 0.1E+1 or 1E+0) or not?
|
||||||
* @param s --> a string to check
|
* @param s the string to check
|
||||||
* @return true in case is is one and false otherwise.
|
* @return true in case is is one and false otherwise.
|
||||||
*/
|
*/
|
||||||
static bool isOneNumber(const std::string &s);
|
static bool isOneNumber(const std::string &s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function to check wether number is one (2 or 0.2E+1 or 2E+0) or not?
|
* Helper function to check whether number is two (2 or 0.2E+1 or 2E+0) or not?
|
||||||
* @param s --> a string to check
|
* @param s the string to check
|
||||||
* @return true in case is is two and false otherwise.
|
* @return true in case is is two and false otherwise.
|
||||||
*/
|
*/
|
||||||
static bool isTwoNumber(const std::string &s);
|
static bool isTwoNumber(const std::string &s);
|
||||||
|
|
Loading…
Reference in New Issue