From 074ca3a4e0df85a8006b530fc7359619d99a05c9 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sun, 8 Feb 2015 13:48:27 +0200 Subject: [PATCH] Improving documantation and little refactoring changes in class Calculator. --HG-- branch : develop --- src/app/container/calculator.cpp | 64 +++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/src/app/container/calculator.cpp b/src/app/container/calculator.cpp index 175ec14a3..0e984658b 100644 --- a/src/app/container/calculator.cpp +++ b/src/app/container/calculator.cpp @@ -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. * Use this constuctor for evaluation formula. All formulas must be converted to internal look. @@ -99,11 +99,17 @@ Calculator::~Calculator() //--------------------------------------------------------------------------------------------------------------------- /** * @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. * @return value of 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); SetSepForEval();//Reset separators options @@ -119,20 +125,29 @@ qreal Calculator::EvalFormula(const QString &formula) 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); 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 &tokens, const QString &formula) { if (qApp->patternType() == MeasurementsType::Standard) { - vVarVal = new qreal[2]; + vVarVal = new qreal[2]; //stabdard measurements table have two additional variables } SCASSERT(data != nullptr) @@ -173,7 +188,7 @@ void Calculator::InitVariables(const VContainer *data, const QMap } if (builInFunctions.contains(i.value())) - {// We found built-in function + {// We have found built-in function found = true; } @@ -186,6 +201,13 @@ void Calculator::InitVariables(const VContainer *data, const QMap } //--------------------------------------------------------------------------------------------------------------------- +/** + * @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() { //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() { 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) { if (fromUser) @@ -233,29 +262,30 @@ void Calculator::SetSepForTr(bool fromUser) if (osSeparatorValue) { - QLocale loc = QLocale::system(); + const QLocale loc = QLocale::system(); SetDecSep(loc.decimalPoint().toLatin1()); SetThousandsSep(loc.groupSeparator().toLatin1()); SetArgSep(';'); - } - else - { - SetArgSep(','); - SetDecSep('.'); + return; } } - else - { - SetArgSep(','); - SetDecSep('.'); - } + SetSepForEval();//Same separators (internal) as for eval. } //--------------------------------------------------------------------------------------------------------------------- +/** + * @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 &map, const QString &val) { - QList listKeys = map.keys(val); + const QList listKeys = map.keys(val);//Take all keys that contain token. if (listKeys.size() > 0) { for (int i = 0; i < listKeys.size(); ++i)