From 59c7405b88a8a128b6a14e4b045bfed12fa377a6 Mon Sep 17 00:00:00 2001 From: dismine Date: Sat, 26 Apr 2014 09:01:41 +0300 Subject: [PATCH] QStack instead QmuParserStack. --HG-- branch : feature --- src/libs/qmuparser/qmuparser.pro | 1 - src/libs/qmuparser/qmuparserbase.cpp | 49 +++++---- src/libs/qmuparser/qmuparserbase.h | 22 ++-- src/libs/qmuparser/qmuparserbytecode.cpp | 2 +- src/libs/qmuparser/qmuparserstack.h | 122 ----------------------- 5 files changed, 32 insertions(+), 164 deletions(-) delete mode 100644 src/libs/qmuparser/qmuparserstack.h diff --git a/src/libs/qmuparser/qmuparser.pro b/src/libs/qmuparser/qmuparser.pro index 31b59f338..d65bfa546 100644 --- a/src/libs/qmuparser/qmuparser.pro +++ b/src/libs/qmuparser/qmuparser.pro @@ -45,7 +45,6 @@ HEADERS += \ qmuparser_global.h \ qmuparsertokenreader.h \ qmuparsertoken.h \ - qmuparserstack.h \ qmuparserfixes.h \ qmuparsererror.h \ qmuparserdef.h \ diff --git a/src/libs/qmuparser/qmuparserbase.cpp b/src/libs/qmuparser/qmuparserbase.cpp index 40229e420..ac0846552 100644 --- a/src/libs/qmuparser/qmuparserbase.cpp +++ b/src/libs/qmuparser/qmuparserbase.cpp @@ -397,30 +397,32 @@ namespace qmu } } - //--------------------------------------------------------------------------- - /** \brief Set the formula. - \param a_strFormula Formula as string_type - \throw ParserException in case of syntax errors. +//--------------------------------------------------------------------------- +/** \brief Set the formula. + \param a_strFormula Formula as string_type + \throw ParserException in case of syntax errors. - Triggers first time calculation thus the creation of the bytecode and - scanning of used variables. - */ - void QmuParserBase::SetExpr(const string_type &a_sExpr) - { + Triggers first time calculation thus the creation of the bytecode and + scanning of used variables. +*/ +void QmuParserBase::SetExpr(const string_type &a_sExpr) +{ // Check locale compatibility std::locale loc; if (m_pTokenReader->GetArgSep()==std::use_facet >(loc).decimal_point()) - Error(ecLOCALE); + { + Error(ecLOCALE); + } // 20060222: Bugfix for Borland-Kylix: // adding a space to the expression will keep Borlands KYLIX from going wild - // when calling tellg on a stringstream created from the expression after + // when calling tellg on a stringstream created from the expression after // reading a value at the end of an expression. (mu::Parser::IsVal function) // (tellg returns -1 otherwise causing the parser to ignore the value) string_type sBuf(a_sExpr + " " ); m_pTokenReader->SetFormula(sBuf); ReInit(); - } +} //--------------------------------------------------------------------------- /** \brief Get the default symbols used for the built in operators. @@ -786,9 +788,7 @@ namespace qmu \post The function token is removed from the stack \throw exception_type if Argument count does not mach function requirements. */ - void QmuParserBase::ApplyFunc( QmuParserStack &a_stOpt, - QmuParserStack &a_stVal, - int a_iArgCount) const + void QmuParserBase::ApplyFunc( QStack &a_stOpt, QStack &a_stVal, int a_iArgCount) const { assert(m_pTokenReader.get()); @@ -866,8 +866,7 @@ namespace qmu } //--------------------------------------------------------------------------- - void QmuParserBase::ApplyIfElse(QmuParserStack &a_stOpt, - QmuParserStack &a_stVal) const + void QmuParserBase::ApplyIfElse(QStack &a_stOpt, QStack &a_stVal) const { // Check if there is an if Else clause to be calculated while (a_stOpt.size() && a_stOpt.top().GetCode()==cmELSE) @@ -900,8 +899,7 @@ namespace qmu /** \brief Performs the necessary steps to write code for the execution of binary operators into the bytecode. */ - void QmuParserBase::ApplyBinOprt(QmuParserStack &a_stOpt, - QmuParserStack &a_stVal) const + void QmuParserBase::ApplyBinOprt(QStack &a_stOpt, QStack &a_stVal) const { // is it a user defined binary operator? if (a_stOpt.top().GetCode()==cmOPRT_BIN) @@ -940,8 +938,7 @@ namespace qmu \param a_stOpt The operator stack \param a_stVal The value stack */ - void QmuParserBase::ApplyRemainingOprt(QmuParserStack &stOpt, - QmuParserStack &stVal) const + void QmuParserBase::ApplyRemainingOprt(QStack &stOpt, QStack &stVal) const { while (stOpt.size() && stOpt.top().GetCode() != cmBO && @@ -1179,8 +1176,8 @@ namespace qmu if (!m_pTokenReader->GetExpr().length()) Error(ecUNEXPECTED_EOF, 0); - QmuParserStack stOpt, stVal; - QmuParserStack stArgCount; + QStack stOpt, stVal; + QStack stArgCount; token_type opta, opt; // for storing operators token_type val, tval; // for storing value string_type strBuf; // buffer for string function arguments @@ -1604,10 +1601,10 @@ namespace qmu This function is used for debugging only. */ - void QmuParserBase::StackDump(const QmuParserStack &a_stVal, - const QmuParserStack &a_stOprt) const + void QmuParserBase::StackDump(const QStack &a_stVal, + const QStack &a_stOprt) const { - QmuParserStack stOprt(a_stOprt), + QStack stOprt(a_stOprt), stVal(a_stVal); mu::console() << "\nValue stack:\n"; diff --git a/src/libs/qmuparser/qmuparserbase.h b/src/libs/qmuparser/qmuparserbase.h index e5a50bb4f..8db8b044c 100644 --- a/src/libs/qmuparser/qmuparserbase.h +++ b/src/libs/qmuparser/qmuparserbase.h @@ -30,6 +30,7 @@ #include #include #include +#include //--- Parser includes -------------------------------------------------------------------------- #include "qmuparserdef.h" @@ -101,7 +102,7 @@ private: virtual ~QmuParserBase(); - qreal Eval() const; + qreal Eval() const; qreal* Eval(int &nStackSize) const; void Eval(qreal *results, int nBulkSize); @@ -239,17 +240,10 @@ private: funmap_type &a_Storage, const char_type *a_szCharSet ); - void ApplyRemainingOprt(QmuParserStack &a_stOpt, - QmuParserStack &a_stVal) const; - void ApplyBinOprt(QmuParserStack &a_stOpt, - QmuParserStack &a_stVal) const; - - void ApplyIfElse(QmuParserStack &a_stOpt, - QmuParserStack &a_stVal) const; - - void ApplyFunc(QmuParserStack &a_stOpt, - QmuParserStack &a_stVal, - int iArgCount) const; + void ApplyRemainingOprt(QStack &a_stOpt, QStack &a_stVal) const; + void ApplyBinOprt(QStack &a_stOpt, QStack &a_stVal) const; + void ApplyIfElse(QStack &a_stOpt, QStack &a_stVal) const; + void ApplyFunc(QStack &a_stOpt, QStack &a_stVal, int iArgCount) const; token_type ApplyStrFunc(const token_type &a_FunTok, const std::vector &a_vArg) const; @@ -268,8 +262,8 @@ private: const QmuParserCallback &a_Callback, const string_type &a_szCharSet) const; - void StackDump(const QmuParserStack &a_stVal, - const QmuParserStack &a_stOprt) const; + void StackDump(const QStack &a_stVal, + const QStack &a_stOprt) const; /** \brief Pointer to the parser function. diff --git a/src/libs/qmuparser/qmuparserbytecode.cpp b/src/libs/qmuparser/qmuparserbytecode.cpp index 34609b591..b19b398cb 100644 --- a/src/libs/qmuparser/qmuparserbytecode.cpp +++ b/src/libs/qmuparser/qmuparserbytecode.cpp @@ -424,7 +424,7 @@ namespace qmu rpn_type(m_vRPN).swap(m_vRPN); // shrink bytecode vector to fit // Determine the if-then-else jump offsets - QmuParserStack stIf, stElse; + QStack stIf, stElse; int idx; for (int i=0; i<(int)m_vRPN.size(); ++i) { diff --git a/src/libs/qmuparser/qmuparserstack.h b/src/libs/qmuparser/qmuparserstack.h deleted file mode 100644 index c5ba528d0..000000000 --- a/src/libs/qmuparser/qmuparserstack.h +++ /dev/null @@ -1,122 +0,0 @@ -/*************************************************************************************************** - ** - ** Original work Copyright (C) 2013 Ingo Berg - ** Modified work Copyright 2014 Roman Telezhinsky - ** - ** 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 QMUPARSERSTACK_H -#define QMUPARSERSTACK_H - -#include -#include -#include -#include - -#include "qmuparsererror.h" -#include "qmuparsertoken.h" - -/** \file - \brief This file defines the stack used by muparser. -*/ - -namespace qmu -{ - - /** \brief Parser stack implementation. - - Stack implementation based on a std::stack. The behaviour of pop() had been - slightly changed in order to get an error code if the stack is empty. - The stack is used within the Parser both as a value stack and as an operator stack. - - \author (C) 2004-2011 Ingo Berg - */ - template - class QmuParserStack - { - private: - - /** \brief Type of the underlying stack implementation. */ - typedef std::stack > impl_type; - - impl_type m_Stack; ///< This is the actual stack. - - public: - - //--------------------------------------------------------------------------- - QmuParserStack() - :m_Stack() - {} - - //--------------------------------------------------------------------------- - virtual ~QmuParserStack() - {} - - //--------------------------------------------------------------------------- - /** \brief Pop a value from the stack. - - Unlike the standard implementation this function will return the value that - is going to be taken from the stack. - - \throw ParserException in case the stack is empty. - \sa pop(int &a_iErrc) - */ - TValueType pop() - { - if (empty()) - throw QmuParserError( "stack is empty." ); - - TValueType el = top(); - m_Stack.pop(); - return el; - } - - /** \brief Push an object into the stack. - - \param a_Val object to push into the stack. - \throw nothrow - */ - void push(const TValueType& a_Val) - { - m_Stack.push(a_Val); - } - - /** \brief Return the number of stored elements. */ - unsigned size() const - { - return (unsigned)m_Stack.size(); - } - - /** \brief Returns true if stack is empty false otherwise. */ - bool empty() const - { - return m_Stack.size()==0; - } - - /** \brief Return reference to the top object in the stack. - - The top object is the one pushed most recently. - */ - TValueType& top() - { - return m_Stack.top(); - } - }; -} // namespace MathUtils - -#endif