Improving documantation and little refactoring changes in class Calculator.
--HG-- branch : develop
This commit is contained in:
parent
17fa00ba75
commit
074ca3a4e0
|
@ -37,7 +37,7 @@ using namespace qmu;
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief Calculator class constructor. Make easy initialization math parser.
|
* @brief Calculator class wraper for QMuParser. Make easy initialization math parser.
|
||||||
*
|
*
|
||||||
* This constructor hide initialization variables, operators, character sets.
|
* This constructor hide initialization variables, operators, character sets.
|
||||||
* Use this constuctor for evaluation formula. All formulas must be converted to internal look.
|
* Use this constuctor for evaluation formula. All formulas must be converted to internal look.
|
||||||
|
@ -99,11 +99,17 @@ Calculator::~Calculator()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief eval calculate formula.
|
* @brief eval calculate formula.
|
||||||
|
*
|
||||||
|
* First we try eval expression without adding variables. If it fail, we take tokens from expression and add variables
|
||||||
|
* to parser and try again.
|
||||||
|
*
|
||||||
* @param formula string of formula.
|
* @param formula string of formula.
|
||||||
* @return value of formula.
|
* @return value of formula.
|
||||||
*/
|
*/
|
||||||
qreal Calculator::EvalFormula(const QString &formula)
|
qreal Calculator::EvalFormula(const QString &formula)
|
||||||
{
|
{
|
||||||
|
// Parser doesn't know any variable on this stage. So, we just use variable factory that for each unknown variable
|
||||||
|
// set value to 0.
|
||||||
SetVarFactory(AddVariable, this);
|
SetVarFactory(AddVariable, this);
|
||||||
SetSepForEval();//Reset separators options
|
SetSepForEval();//Reset separators options
|
||||||
|
|
||||||
|
@ -119,20 +125,29 @@ qreal Calculator::EvalFormula(const QString &formula)
|
||||||
|
|
||||||
if (tokens.isEmpty())
|
if (tokens.isEmpty())
|
||||||
{
|
{
|
||||||
return result;
|
return result; // We have found only numbers in expression.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add variables
|
// Add variables to parser because we have deal with expression with variables.
|
||||||
InitVariables(data, tokens, formula);
|
InitVariables(data, tokens, formula);
|
||||||
return Eval();
|
return Eval();
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief Calculator::InitVariables add variables to parser.
|
||||||
|
*
|
||||||
|
* For optimization purpose we try don't add variables that we don't need.
|
||||||
|
*
|
||||||
|
* @param data pointer to a variable container. Hold all informations about variables.
|
||||||
|
* @param tokens all tokens (measurements names, variables with lengths) that parser have found in expression.
|
||||||
|
* @param formula expression, need for throwing better error message.
|
||||||
|
*/
|
||||||
void Calculator::InitVariables(const VContainer *data, const QMap<int, QString> &tokens, const QString &formula)
|
void Calculator::InitVariables(const VContainer *data, const QMap<int, QString> &tokens, const QString &formula)
|
||||||
{
|
{
|
||||||
if (qApp->patternType() == MeasurementsType::Standard)
|
if (qApp->patternType() == MeasurementsType::Standard)
|
||||||
{
|
{
|
||||||
vVarVal = new qreal[2];
|
vVarVal = new qreal[2]; //stabdard measurements table have two additional variables
|
||||||
}
|
}
|
||||||
|
|
||||||
SCASSERT(data != nullptr)
|
SCASSERT(data != nullptr)
|
||||||
|
@ -173,7 +188,7 @@ void Calculator::InitVariables(const VContainer *data, const QMap<int, QString>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (builInFunctions.contains(i.value()))
|
if (builInFunctions.contains(i.value()))
|
||||||
{// We found built-in function
|
{// We have found built-in function
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +201,13 @@ void Calculator::InitVariables(const VContainer *data, const QMap<int, QString>
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief Calculator::InitCharacterSets init character set for parser.
|
||||||
|
*
|
||||||
|
* QMuParser require setting character set for legal characters. Because we try make our expresion language independent
|
||||||
|
* we set all posible unique characters from all alphabets.
|
||||||
|
*
|
||||||
|
*/
|
||||||
void Calculator::InitCharacterSets()
|
void Calculator::InitCharacterSets()
|
||||||
{
|
{
|
||||||
//String with all unique symbols for supported alpabets.
|
//String with all unique symbols for supported alpabets.
|
||||||
|
@ -218,6 +240,9 @@ qreal* Calculator::AddVariable(const QString &a_szName, void *a_pUserData)
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief Calculator::SetSepForEval set separators for eval. Each expression eval in internal (C) locale.
|
||||||
|
*/
|
||||||
void Calculator::SetSepForEval()
|
void Calculator::SetSepForEval()
|
||||||
{
|
{
|
||||||
SetArgSep(',');
|
SetArgSep(',');
|
||||||
|
@ -225,6 +250,10 @@ void Calculator::SetSepForEval()
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief Calculator::SetSepForTr set separators for translation expression.
|
||||||
|
* @param fromUser true if expression come from user (from dialog).
|
||||||
|
*/
|
||||||
void Calculator::SetSepForTr(bool fromUser)
|
void Calculator::SetSepForTr(bool fromUser)
|
||||||
{
|
{
|
||||||
if (fromUser)
|
if (fromUser)
|
||||||
|
@ -233,29 +262,30 @@ void Calculator::SetSepForTr(bool fromUser)
|
||||||
|
|
||||||
if (osSeparatorValue)
|
if (osSeparatorValue)
|
||||||
{
|
{
|
||||||
QLocale loc = QLocale::system();
|
const QLocale loc = QLocale::system();
|
||||||
SetDecSep(loc.decimalPoint().toLatin1());
|
SetDecSep(loc.decimalPoint().toLatin1());
|
||||||
SetThousandsSep(loc.groupSeparator().toLatin1());
|
SetThousandsSep(loc.groupSeparator().toLatin1());
|
||||||
SetArgSep(';');
|
SetArgSep(';');
|
||||||
}
|
return;
|
||||||
else
|
|
||||||
{
|
|
||||||
SetArgSep(',');
|
|
||||||
SetDecSep('.');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
SetArgSep(',');
|
SetSepForEval();//Same separators (internal) as for eval.
|
||||||
SetDecSep('.');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief Calculator::RemoveAll remove token from token list.
|
||||||
|
*
|
||||||
|
* Standard Qt class QMap doesn't have method RemoveAll.
|
||||||
|
* Example: remove "-" from tokens list if exist. If don't do that unary minus operation will broken.
|
||||||
|
*
|
||||||
|
* @param map map with tokens
|
||||||
|
* @param val token that need delete
|
||||||
|
*/
|
||||||
void Calculator::RemoveAll(QMap<int, QString> &map, const QString &val)
|
void Calculator::RemoveAll(QMap<int, QString> &map, const QString &val)
|
||||||
{
|
{
|
||||||
QList<int> listKeys = map.keys(val);
|
const QList<int> listKeys = map.keys(val);//Take all keys that contain token.
|
||||||
if (listKeys.size() > 0)
|
if (listKeys.size() > 0)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < listKeys.size(); ++i)
|
for (int i = 0; i < listKeys.size(); ++i)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user