Separate class Calculator.
--HG-- branch : feature
This commit is contained in:
parent
6380471267
commit
aec99643b3
110
src/libs/qmuparser/qmuformulabase.cpp
Normal file
110
src/libs/qmuparser/qmuformulabase.cpp
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/***************************************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2015 Roman Telezhynskyi
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
** software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
** without restriction, including without limitation the rights to use, copy, modify,
|
||||||
|
** merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
** permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
** substantial portions of the Software.
|
||||||
|
**
|
||||||
|
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||||
|
** NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
** NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
**
|
||||||
|
******************************************************************************************************/
|
||||||
|
|
||||||
|
#include "qmuformulabase.h"
|
||||||
|
|
||||||
|
namespace qmu
|
||||||
|
{
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QmuFormulaBase::QmuFormulaBase()
|
||||||
|
:QmuParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QmuFormulaBase::~QmuFormulaBase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief 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 QmuFormulaBase::InitCharacterSets()
|
||||||
|
{
|
||||||
|
//String with all unique symbols for supported alpabets.
|
||||||
|
// See script alphabets.py for generation and more information.
|
||||||
|
//Note. MSVC doen't support normal string concatenation for long string. Thats why we use QStringList in this place.
|
||||||
|
QStringList symbols = QStringList() << "ցЀĆЈVӧĎАғΕĖӅИқΝĞơРңњΥĦШҫ̆جگĮаҳѕεشԶиһνԾрυلՆӝшËՎҔPÓՖXӛӟŞӣզhëծpóӞնxßվāŁЃֆĉЋ"
|
||||||
|
<< "CŬđҐГΒęҘЛΚŘġҠУGاհЫدԱҰгβطԹõлκKՁÀуςهՉÈыvیՑÐSOřӘћաőcӐթèkàѓżűðsķչøӥӔĀփїІĈЎ"
|
||||||
|
<< "ґĐΗЖҙĘȚΟОҡĠآΧЦتЮұİزηжԸغοоÁՀقχцÉՈيюÑՐђӋіәťӆўáŠĺѐfөըnñŰӤӨӹոľЁրăЉŭċБӸēłΔҖ"
|
||||||
|
<< "ЙŤěΜӜDСձģΤӰЩīņحҮбưԳصδHйԻŇμӲӴсՃمτƠщՋєLQŹՓŕÖYśÞaգĽæiŽիӓîqճöyջþĂօЄӦĊЌΑĒДҗј"
|
||||||
|
<< "ΙȘĚМΡéĵĢФūӚΩبĪЬүќαذԲдҷιظԺмρՂфÇωوՊьÏՒTŚĻJբdçժlïӪղtպӫAւąЇčŃЏĕӯЗΖEțŮĝПΞأĥ"
|
||||||
|
<< "ثĹЧΦÆӳЯIسŲԵзζԽпξكՅÄчφNMՍӌяӢՕÔWÎŝÜџёźեägխoӒյôwĶBžսüЂĄև̈ЊČƏљΓВҕĔӮΛКĜΣТҥĤک"
|
||||||
|
<< "ЪƯخγвŅԴŪضλкԼĴσтÅՄنъÍՌRӕՔZÝŜbåդﻩjíլļrӵմzýռپêЅքćچЍďӱҒЕůėژșΘØҚНğńءΠFҢХħΨҪ"
|
||||||
|
<< "ЭųįҶرҲеԷňعθҺнԿفπÂхՇψÊэšՏÒUəÚѝŻşҤӑâeէŐımկòuշÕúտŔ";
|
||||||
|
|
||||||
|
// Defining identifier character sets
|
||||||
|
DefineNameChars(QStringLiteral("0123456789_@#") + symbols.join(""));
|
||||||
|
DefineOprtChars(symbols.join("") + QStringLiteral("+-*^/?<>=!$%&|~_"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Factory function for creating new parser variables
|
||||||
|
// This could as well be a function performing database queries.
|
||||||
|
qreal *QmuFormulaBase::AddVariable(const QString &a_szName, void *a_pUserData)
|
||||||
|
{
|
||||||
|
Q_UNUSED(a_szName)
|
||||||
|
Q_UNUSED(a_pUserData)
|
||||||
|
|
||||||
|
static qreal value = 0;
|
||||||
|
return &value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief SetSepForTr set separators for translation expression.
|
||||||
|
* @param fromUser true if expression come from user (from dialog).
|
||||||
|
*/
|
||||||
|
void QmuFormulaBase::SetSepForTr(bool osSeparator, bool fromUser)
|
||||||
|
{
|
||||||
|
if (fromUser)
|
||||||
|
{
|
||||||
|
if (osSeparator)
|
||||||
|
{
|
||||||
|
const QLocale loc = QLocale::system();
|
||||||
|
SetDecSep(loc.decimalPoint().toLatin1());
|
||||||
|
SetThousandsSep(loc.groupSeparator().toLatin1());
|
||||||
|
SetArgSep(';');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSepForEval();//Same separators (internal) as for eval.
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief SetSepForEval set separators for eval. Each expression eval in internal (C) locale.
|
||||||
|
*/
|
||||||
|
void QmuFormulaBase::SetSepForEval()
|
||||||
|
{
|
||||||
|
SetArgSep(';');
|
||||||
|
SetThousandsSep(',');
|
||||||
|
SetDecSep('.');
|
||||||
|
}
|
||||||
|
|
||||||
|
}// namespace qmu
|
49
src/libs/qmuparser/qmuformulabase.h
Normal file
49
src/libs/qmuparser/qmuformulabase.h
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/***************************************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2015 Roman Telezhynskyi
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
** software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
** without restriction, including without limitation the rights to use, copy, modify,
|
||||||
|
** merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
** permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
** substantial portions of the Software.
|
||||||
|
**
|
||||||
|
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||||
|
** NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
** NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
**
|
||||||
|
******************************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QMUFORMULABASE_H
|
||||||
|
#define QMUFORMULABASE_H
|
||||||
|
|
||||||
|
#include "qmuparser_global.h"
|
||||||
|
#include "qmuparser.h"
|
||||||
|
|
||||||
|
namespace qmu
|
||||||
|
{
|
||||||
|
|
||||||
|
class QMUPARSERSHARED_EXPORT QmuFormulaBase : public QmuParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QmuFormulaBase();
|
||||||
|
virtual ~QmuFormulaBase() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void InitCharacterSets();
|
||||||
|
static qreal* AddVariable(const QString &a_szName, void *a_pUserData);
|
||||||
|
void SetSepForTr(bool osSeparator, bool fromUser);
|
||||||
|
void SetSepForEval();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Q_DISABLE_COPY(QmuFormulaBase)
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace qmu
|
||||||
|
|
||||||
|
#endif // QMUFORMULABASE_H
|
|
@ -10,7 +10,9 @@ SOURCES += \
|
||||||
$$PWD/qmuparserbase.cpp \
|
$$PWD/qmuparserbase.cpp \
|
||||||
$$PWD/qmuparsertest.cpp \
|
$$PWD/qmuparsertest.cpp \
|
||||||
$$PWD/stable.cpp \
|
$$PWD/stable.cpp \
|
||||||
$$PWD/qmutranslation.cpp
|
$$PWD/qmutranslation.cpp \
|
||||||
|
$$PWD/qmuformulabase.cpp \
|
||||||
|
$$PWD/qmutokenparser.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$PWD/qmuparser.h\
|
$$PWD/qmuparser.h\
|
||||||
|
@ -26,4 +28,6 @@ HEADERS += \
|
||||||
$$PWD/qmuparsertest.h \
|
$$PWD/qmuparsertest.h \
|
||||||
$$PWD/stable.h \
|
$$PWD/stable.h \
|
||||||
$$PWD/qmutranslation.h \
|
$$PWD/qmutranslation.h \
|
||||||
$$PWD/qmudef.h
|
$$PWD/qmudef.h \
|
||||||
|
$$PWD/qmuformulabase.h \
|
||||||
|
$$PWD/qmutokenparser.h
|
||||||
|
|
|
@ -39,7 +39,7 @@ OBJECTS_DIR = obj
|
||||||
|
|
||||||
include(qmuparser.pri)
|
include(qmuparser.pri)
|
||||||
|
|
||||||
VERSION = 2.2.6
|
VERSION = 2.3.0
|
||||||
|
|
||||||
# Set "make install" command for Unix-like systems.
|
# Set "make install" command for Unix-like systems.
|
||||||
unix:!macx{
|
unix:!macx{
|
||||||
|
|
62
src/libs/qmuparser/qmutokenparser.cpp
Normal file
62
src/libs/qmuparser/qmutokenparser.cpp
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/***************************************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2015 Roman Telezhynskyi
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
** software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
** without restriction, including without limitation the rights to use, copy, modify,
|
||||||
|
** merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
** permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
** substantial portions of the Software.
|
||||||
|
**
|
||||||
|
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||||
|
** NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
** NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
**
|
||||||
|
******************************************************************************************************/
|
||||||
|
|
||||||
|
#include "qmutokenparser.h"
|
||||||
|
|
||||||
|
namespace qmu
|
||||||
|
{
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief QmuTokenParser class constructor. Make easy initialization math parser.
|
||||||
|
*
|
||||||
|
* This constructor hide initialization variables, operators, character sets.
|
||||||
|
* Use this constuctor to get tokens from formula. All formulas must be converted to external look.
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* QmuTokenParser *cal = new QmuTokenParser(formula, osSeparator, false);
|
||||||
|
* tokens = cal->GetTokens();
|
||||||
|
* numbers = cal->GetNumbers();
|
||||||
|
* delete cal;
|
||||||
|
*
|
||||||
|
* @param formula string with formula.
|
||||||
|
* @param fromUser true if we parse formula from user
|
||||||
|
*/
|
||||||
|
QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser)
|
||||||
|
:QmuFormulaBase()
|
||||||
|
{
|
||||||
|
InitCharacterSets();
|
||||||
|
setAllowSubexpressions(false);//Only one expression per time
|
||||||
|
SetVarFactory(AddVariable, this);
|
||||||
|
|
||||||
|
SetSepForTr(osSeparator, fromUser);
|
||||||
|
|
||||||
|
SetExpr(formula);
|
||||||
|
//Need run for making tokens. Don't catch exception here, because we want know if formula has error.
|
||||||
|
Eval();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QmuTokenParser::~QmuTokenParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}// namespace qmu
|
43
src/libs/qmuparser/qmutokenparser.h
Normal file
43
src/libs/qmuparser/qmutokenparser.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/***************************************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2015 Roman Telezhynskyi
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
** software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
** without restriction, including without limitation the rights to use, copy, modify,
|
||||||
|
** merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
** permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
** substantial portions of the Software.
|
||||||
|
**
|
||||||
|
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||||
|
** NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
** NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
**
|
||||||
|
******************************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QMUTOKENPARSER_H
|
||||||
|
#define QMUTOKENPARSER_H
|
||||||
|
|
||||||
|
#include "qmuparser_global.h"
|
||||||
|
#include "qmuformulabase.h"
|
||||||
|
|
||||||
|
namespace qmu
|
||||||
|
{
|
||||||
|
|
||||||
|
class QMUPARSERSHARED_EXPORT QmuTokenParser : public QmuFormulaBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser = true);
|
||||||
|
virtual ~QmuTokenParser() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Q_DISABLE_COPY(QmuTokenParser)
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace qmu
|
||||||
|
|
||||||
|
#endif // QMUTOKENPARSER_H
|
|
@ -49,7 +49,7 @@ using namespace qmu;
|
||||||
* @param data pointer to a variable container.
|
* @param data pointer to a variable container.
|
||||||
*/
|
*/
|
||||||
Calculator::Calculator(const VContainer *data, MeasurementsType patternType)
|
Calculator::Calculator(const VContainer *data, MeasurementsType patternType)
|
||||||
:QmuParser(), vVarVal(nullptr), data(data), patternType(patternType)
|
:QmuFormulaBase(), vVarVal(nullptr), data(data), patternType(patternType)
|
||||||
{
|
{
|
||||||
SCASSERT(data != nullptr)
|
SCASSERT(data != nullptr)
|
||||||
InitCharacterSets();
|
InitCharacterSets();
|
||||||
|
@ -58,36 +58,6 @@ Calculator::Calculator(const VContainer *data, MeasurementsType patternType)
|
||||||
SetSepForEval();
|
SetSepForEval();
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* @brief Calculator class constructor. Make easy initialization math parser.
|
|
||||||
*
|
|
||||||
* This constructor hide initialization variables, operators, character sets.
|
|
||||||
* Use this constuctor to get tokens from formula. All formulas must be converted to external look.
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* Calculator *cal = new Calculator(formula, osSeparator, false);
|
|
||||||
* tokens = cal->GetTokens();
|
|
||||||
* numbers = cal->GetNumbers();
|
|
||||||
* delete cal;
|
|
||||||
*
|
|
||||||
* @param formula string with formula.
|
|
||||||
* @param fromUser true if we parse formula from user
|
|
||||||
*/
|
|
||||||
Calculator::Calculator(const QString &formula, bool osSeparator, bool fromUser)
|
|
||||||
:QmuParser(), vVarVal(nullptr), data(nullptr), patternType(MeasurementsType::Standard)
|
|
||||||
{
|
|
||||||
InitCharacterSets();
|
|
||||||
setAllowSubexpressions(false);//Only one expression per time
|
|
||||||
SetVarFactory(AddVariable, this);
|
|
||||||
|
|
||||||
SetSepForTr(osSeparator, fromUser);
|
|
||||||
|
|
||||||
SetExpr(formula);
|
|
||||||
//Need run for making tokens. Don't catch exception here, because we want know if formula has error.
|
|
||||||
Eval();
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
Calculator::~Calculator()
|
Calculator::~Calculator()
|
||||||
{
|
{
|
||||||
|
@ -202,78 +172,6 @@ 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()
|
|
||||||
{
|
|
||||||
//String with all unique symbols for supported alpabets.
|
|
||||||
// See script alphabets.py for generation and more information.
|
|
||||||
//Note. MSVC doen't support normal string concatenation for long string. Thats why we use QStringList in this place.
|
|
||||||
QStringList symbols = QStringList() << "ցЀĆЈVӧĎАғΕĖӅИқΝĞơРңњΥĦШҫ̆جگĮаҳѕεشԶиһνԾрυلՆӝшËՎҔPÓՖXӛӟŞӣզhëծpóӞնxßվāŁЃֆĉЋ"
|
|
||||||
<< "CŬđҐГΒęҘЛΚŘġҠУGاհЫدԱҰгβطԹõлκKՁÀуςهՉÈыvیՑÐSOřӘћաőcӐթèkàѓżűðsķչøӥӔĀփїІĈЎ"
|
|
||||||
<< "ґĐΗЖҙĘȚΟОҡĠآΧЦتЮұİزηжԸغοоÁՀقχцÉՈيюÑՐђӋіәťӆўáŠĺѐfөըnñŰӤӨӹոľЁրăЉŭċБӸēłΔҖ"
|
|
||||||
<< "ЙŤěΜӜDСձģΤӰЩīņحҮбưԳصδHйԻŇμӲӴсՃمτƠщՋєLQŹՓŕÖYśÞaգĽæiŽիӓîqճöyջþĂօЄӦĊЌΑĒДҗј"
|
|
||||||
<< "ΙȘĚМΡéĵĢФūӚΩبĪЬүќαذԲдҷιظԺмρՂфÇωوՊьÏՒTŚĻJբdçժlïӪղtպӫAւąЇčŃЏĕӯЗΖEțŮĝПΞأĥ"
|
|
||||||
<< "ثĹЧΦÆӳЯIسŲԵзζԽпξكՅÄчφNMՍӌяӢՕÔWÎŝÜџёźեägխoӒյôwĶBžսüЂĄև̈ЊČƏљΓВҕĔӮΛКĜΣТҥĤک"
|
|
||||||
<< "ЪƯخγвŅԴŪضλкԼĴσтÅՄنъÍՌRӕՔZÝŜbåդﻩjíլļrӵմzýռپêЅքćچЍďӱҒЕůėژșΘØҚНğńءΠFҢХħΨҪ"
|
|
||||||
<< "ЭųįҶرҲеԷňعθҺнԿفπÂхՇψÊэšՏÒUəÚѝŻşҤӑâeէŐımկòuշÕúտŔ";
|
|
||||||
|
|
||||||
// Defining identifier character sets
|
|
||||||
DefineNameChars(QStringLiteral("0123456789_@#") + symbols.join(""));
|
|
||||||
DefineOprtChars(symbols.join("") + QStringLiteral("+-*^/?<>=!$%&|~_"));
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
// Factory function for creating new parser variables
|
|
||||||
// This could as well be a function performing database queries.
|
|
||||||
qreal* Calculator::AddVariable(const QString &a_szName, void *a_pUserData)
|
|
||||||
{
|
|
||||||
Q_UNUSED(a_szName)
|
|
||||||
Q_UNUSED(a_pUserData)
|
|
||||||
|
|
||||||
static qreal value = 0;
|
|
||||||
return &value;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* @brief Calculator::SetSepForEval set separators for eval. Each expression eval in internal (C) locale.
|
|
||||||
*/
|
|
||||||
void Calculator::SetSepForEval()
|
|
||||||
{
|
|
||||||
SetArgSep(';');
|
|
||||||
SetThousandsSep(',');
|
|
||||||
SetDecSep('.');
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* @brief Calculator::SetSepForTr set separators for translation expression.
|
|
||||||
* @param fromUser true if expression come from user (from dialog).
|
|
||||||
*/
|
|
||||||
void Calculator::SetSepForTr(bool osSeparator, bool fromUser)
|
|
||||||
{
|
|
||||||
if (fromUser)
|
|
||||||
{
|
|
||||||
if (osSeparator)
|
|
||||||
{
|
|
||||||
const QLocale loc = QLocale::system();
|
|
||||||
SetDecSep(loc.decimalPoint().toLatin1());
|
|
||||||
SetThousandsSep(loc.groupSeparator().toLatin1());
|
|
||||||
SetArgSep(';');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetSepForEval();//Same separators (internal) as for eval.
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief Calculator::RemoveAll remove token from token list.
|
* @brief Calculator::RemoveAll remove token from token list.
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#ifndef CALCULATOR_H
|
#ifndef CALCULATOR_H
|
||||||
#define CALCULATOR_H
|
#define CALCULATOR_H
|
||||||
|
|
||||||
#include "../qmuparser/qmuparser.h"
|
#include "../qmuparser/qmuformulabase.h"
|
||||||
#include "../vmisc/def.h"
|
#include "../vmisc/def.h"
|
||||||
|
|
||||||
class VContainer;
|
class VContainer;
|
||||||
|
@ -53,12 +53,11 @@ class VContainer;
|
||||||
* delete cal;//Here can be memory leak, but dialog already check this formula and probability very low.
|
* delete cal;//Here can be memory leak, but dialog already check this formula and probability very low.
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
class Calculator:public qmu::QmuParser
|
class Calculator:public qmu::QmuFormulaBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Calculator(const VContainer *data, MeasurementsType patternType);
|
Calculator(const VContainer *data, MeasurementsType patternType);
|
||||||
Calculator(const QString &formula, bool osSeparator, bool fromUser = true);
|
virtual ~Calculator();
|
||||||
~Calculator();
|
|
||||||
qreal EvalFormula(const QString &formula);
|
qreal EvalFormula(const QString &formula);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(Calculator)
|
Q_DISABLE_COPY(Calculator)
|
||||||
|
@ -66,10 +65,6 @@ private:
|
||||||
const VContainer *data;
|
const VContainer *data;
|
||||||
MeasurementsType patternType;
|
MeasurementsType patternType;
|
||||||
void InitVariables(const VContainer *data, const QMap<int, QString> &tokens, const QString &formula);
|
void InitVariables(const VContainer *data, const QMap<int, QString> &tokens, const QString &formula);
|
||||||
void InitCharacterSets();
|
|
||||||
static qreal* AddVariable(const QString &a_szName, void *a_pUserData);
|
|
||||||
void SetSepForEval();
|
|
||||||
void SetSepForTr(bool osSeparator, bool fromUser);
|
|
||||||
static void RemoveAll(QMap<int, QString> &map, const QString &val);
|
static void RemoveAll(QMap<int, QString> &map, const QString &val);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "calculator.h"
|
#include "calculator.h"
|
||||||
#include "../vmisc/def.h"
|
#include "../vmisc/def.h"
|
||||||
#include "../vgeometry/vgeometrydef.h"
|
#include "../vgeometry/vgeometrydef.h"
|
||||||
|
#include "../qmuparser/qmutokenparser.h"
|
||||||
|
|
||||||
using namespace qmu;
|
using namespace qmu;
|
||||||
|
|
||||||
|
@ -713,7 +714,7 @@ QString VTranslateVars::FormulaFromUser(const QString &formula, bool osSeparator
|
||||||
}
|
}
|
||||||
QString newFormula = formula;// Local copy for making changes
|
QString newFormula = formula;// Local copy for making changes
|
||||||
|
|
||||||
Calculator *cal = new Calculator(formula, osSeparator);// Eval formula
|
QmuTokenParser *cal = new QmuTokenParser(formula, osSeparator);// Eval formula
|
||||||
QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
|
QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
|
||||||
QMap<int, QString> numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
|
QMap<int, QString> numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
|
||||||
delete cal;
|
delete cal;
|
||||||
|
@ -820,7 +821,7 @@ QString VTranslateVars::FormulaToUser(const QString &formula) const
|
||||||
QMap<int, QString> numbers;
|
QMap<int, QString> numbers;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Calculator *cal = new Calculator(formula, false);// Eval formula
|
QmuTokenParser *cal = new QmuTokenParser(formula, false);// Eval formula
|
||||||
tokens = cal->GetTokens();// Tokens (variables, measurements)
|
tokens = cal->GetTokens();// Tokens (variables, measurements)
|
||||||
numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
|
numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
|
||||||
delete cal;
|
delete cal;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user