From: stv Date: Fri, 25 May 2007 09:25:12 +0000 (+0000) Subject: Redisigned old class removed. Use QtxValidator.* instead QtxDblValidator.*, X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=56fb04163e0af52822bf95a068ac7cfb1b956120;p=modules%2Fgui.git Redisigned old class removed. Use QtxValidator.* instead QtxDblValidator.*, use QtxEvalExpr.* instead QtxParser.*, QtxOperations.*, QtxListOfOperations.* and QtxStdOperations.*. --- diff --git a/src/Qtx/QtxDblValidator.cxx b/src/Qtx/QtxDblValidator.cxx deleted file mode 100644 index b7dd3e9d0..000000000 --- a/src/Qtx/QtxDblValidator.cxx +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File: QtxDblValidator.cxx -// Author: Alexandre SOLOVYOV - -#include "QtxDblValidator.h" - -/*! - Constructor - \param bot - minimal possible value - \param top - maximal possible value - \param dec - number of digits - \param o - parent object - \param name - name of validator -*/ -QtxDblValidator::QtxDblValidator( const double bot, const double top, const int dec, - QObject* o, const char* name ) -: QDoubleValidator( bot, top, dec, o, name ) -{ -} - -/*! - Destructor -*/ -QtxDblValidator::~QtxDblValidator() -{ -} - -/*! - Corrects string: if it represent double value less then bottom, it becomes equal to bottom, - if it is more then top, it becomes equal to top, if it isn't number is becomes '0' -*/ -void QtxDblValidator::fixup( QString& str ) const -{ - bool ok = false; - double d = str.toDouble( &ok ); - if( ok ) - { - if( dtop() ) - str = QString::number( top() ); - } - else - str = "0"; -} diff --git a/src/Qtx/QtxDblValidator.h b/src/Qtx/QtxDblValidator.h deleted file mode 100644 index a5b389fd1..000000000 --- a/src/Qtx/QtxDblValidator.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File: QtxDblValidator.h -// Author: Alexandre SOLOVYOV - -#ifndef QTX_DOUBLE_VALIDATOR -#define QTX_DOUBLE_VALIDATOR - -#include "Qtx.h" - -#include - -class QTX_EXPORT QtxDblValidator : public QDoubleValidator -{ - Q_OBJECT - -public: - QtxDblValidator( const double, const double, const int, - QObject*, const char* = 0 ); - ~QtxDblValidator(); - - virtual void fixup( QString& ) const; -}; - -#endif diff --git a/src/Qtx/QtxListOfOperations.cxx b/src/Qtx/QtxListOfOperations.cxx deleted file mode 100644 index a6c2e6810..000000000 --- a/src/Qtx/QtxListOfOperations.cxx +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#include "QtxListOfOperations.h" -#include - -/*! - Constructor -*/ -QtxListOfOperations::QtxListOfOperations() -{ -} - -/*! - Destructor -*/ -QtxListOfOperations::~QtxListOfOperations() -{ -} - -/*! - \return fills list with brackets symbols - \param list - list to be filled - \param open - if it is true, it is necessary to fill with open brackets otherwise with close -*/ -void QtxListOfOperations::bracketsList( QStringList& list, bool open ) const -{ - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - QStringList custom; - for( ; anIt!=aLast; anIt++ ) - { - custom.clear(); - (*anIt).myOperations->bracketsList( custom, open ); - QStringList::const_iterator aSIt = custom.begin(), - aSLast = custom.end(); - for( ; aSIt!=aSLast; aSIt++ ) - if( list.contains( *aSIt )==0 ) - list.append( *aSIt ); - } -} - -/*! - Fills list with operation names -*/ -void QtxListOfOperations::opersList( QStringList& list ) const -{ - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - QStringList custom; - for( ; anIt!=aLast; anIt++ ) - { - custom.clear(); - (*anIt).myOperations->opersList( custom ); - QStringList::const_iterator aSIt = custom.begin(), - aSLast = custom.end(); - for( ; aSIt!=aSLast; aSIt++ ) - if( list.contains( *aSIt )==0 ) - list.append( *aSIt ); - } -} - -/*! - Create some value by it's string representation -*/ -bool QtxListOfOperations::createValue( const QString& str, QtxValue& val ) const -{ - bool ok; - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - for( ; anIt!=aLast; anIt++ ) - { - ok = (*anIt).myOperations->createValue( str, val ); - if( ok ) - break; - } - return ok; -} - -/*! - \return priority of operation -*/ -int QtxListOfOperations::prior( const QString& op, bool isBin ) const -{ - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - int prior = 0; - for( ; anIt!=aLast; anIt++ ) - { - prior = (*anIt).myOperations->prior( op, isBin ); - if( prior>0 ) - { - prior+=(*anIt).myAddPrior; - break; - } - } - return prior>0 ? prior : 0; -} - -/*! - \return whether values with passed types are valid for arguments of operation - \param op - name of operation - \param t1 - type of first argument - \param t2 - type of second argument -*/ -QtxParser::Error QtxListOfOperations::isValid( const QString& op, - const QVariant::Type t1, - const QVariant::Type t2 ) const -{ - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - QtxParser::Error err = QtxParser::OK; - for( ; anIt!=aLast; anIt++ ) - { - err = (*anIt).myOperations->isValid( op, t1, t2 ); - if( err==QtxParser::OK ) - break; - } - return err; -} - -/*! - Calculates result of operation - \return one of error states - \param op - name of operation - \param v1 - first operation argument (must be used also to store result) - \param v2 - second operation argument -*/ -QtxParser::Error QtxListOfOperations::calculate( const QString& op, - QtxValue& v1, - QtxValue& v2 ) const -{ - const char* deb = op.latin1(); - - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - QtxValue nv1, nv2; - for( ; anIt!=aLast; anIt++ ) - { - nv1 = v1; - nv2 = v2; - if( (*anIt).myOperations->isValid( op, v1.type(), v2.type() ) == QtxParser::OK ) - { - QtxParser::Error err = (*anIt).myOperations->calculate( op, nv1, nv2 ); - if( err==QtxParser::OK || err==QtxParser::InvalidResult ) - { - QString oop = (*anIt).myName; - const char* ooo = oop.latin1(); - v1 = nv1; v2 = nv2; - return err; - } - } - } - return QtxParser::InvalidOperation; -} - -/*! - Clears list of operations -*/ -void QtxListOfOperations::clear() -{ - mySets.clear(); -} - -/*! - \return true if list contains operations - \param name - name of operation -*/ -bool QtxListOfOperations::has( const QString& name ) const -{ - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - for( ; anIt!=aLast; anIt++ ) - if( (*anIt).myName == name ) - return true; - return false; -} - -/*! - Appends operations to list - \param name - name of operations - \param oper - operations - \param prior - additional prior -*/ -void QtxListOfOperations::append( const QString& name, QtxOperations* oper, - int prior ) -{ - insert( name, oper, prior ); -} - -/*! - Prepends operations to list - \param name - name of operations - \param oper - operations - \param prior - additional prior -*/ -void QtxListOfOperations::prepend( const QString& name, QtxOperations* oper, - int prior ) -{ - insert( name, oper, prior, 0 ); -} - -/*! - Inserts operations to list - \param name - name of operations - \param oper - operations - \param prior - additional prior - \param pos - insert position -*/ -void QtxListOfOperations::insert( const QString& name, QtxOperations* oper, - int prior, int pos ) -{ - if( has( name ) || oper==NULL || prior<0 ) - return; - - OperationSet op; - op.myName = name; - op.myOperations = oper; - op.myAddPrior = prior; - if( pos<0 ) - mySets.append( op ); - else - mySets.insert( mySets.at( pos ), op ); -} - -/*! - Removes operations from list - \param name - name of operations -*/ -void QtxListOfOperations::remove( const QString& name ) -{ - OperationSets::iterator anIt = mySets.begin(), - aLast = mySets.end(); - for( ; anIt!=aLast; anIt++ ) - if( (*anIt).myName == name ) - { - mySets.erase( anIt ); - break; - } -} - -/*! - \return count of operations in list -*/ -int QtxListOfOperations::count() const -{ - return mySets.count(); -} - -/*! - \return operations by name - \name - name of operations -*/ -QtxOperations* QtxListOfOperations::operations( const QString& name ) const -{ - OperationSetsIterator anIt = mySets.begin(), - aLast = mySets.end(); - for( ; anIt!=aLast; anIt++ ) - if( (*anIt).myName == name ) - return (*anIt).myOperations; - return NULL; -} diff --git a/src/Qtx/QtxListOfOperations.h b/src/Qtx/QtxListOfOperations.h deleted file mode 100644 index def9dd8c4..000000000 --- a/src/Qtx/QtxListOfOperations.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File: QtxListOfOperations.h -// Author: Alexander SOLOVYOV - -#ifndef __QTX_LIST_OF_OPERATIONS_HEADER__ -#define __QTX_LIST_OF_OPERATIONS_HEADER__ - -#include "Qtx.h" -#include "QtxOperations.h" - -#ifdef WIN32 -#pragma warning( disable:4251 ) -#endif - - -/*! - Class: QtxListOfOperations - - This class provides special variant of QtxOperations. It contains list of QtxOperations* with - fixed order. When it is necessary to calculate operation or get it's priority, this operation is - being found starting from first item. It makes possible to create unions of operations. Every QtxOperations* - has priority, which is added to priority of operation, so that it makes possible to increase priority of - whole group of operations -*/ -class QTX_EXPORT QtxListOfOperations : public QtxOperations -{ -public: - QtxListOfOperations(); - virtual ~QtxListOfOperations(); - - virtual void opersList( QStringList& ) const; - virtual void bracketsList( QStringList&, bool open ) const; - - virtual bool createValue( const QString&, QtxValue& ) const; - virtual int prior ( const QString&, bool isBin ) const; - virtual QtxParser::Error isValid( const QString&, - const QVariant::Type, - const QVariant::Type ) const; - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const; - - void clear (); - bool has ( const QString& ) const; - void append ( const QString&, QtxOperations*, int prior ); - void prepend( const QString&, QtxOperations*, int prior ); - void insert ( const QString&, QtxOperations*, int prior, int pos = -1 ); - void remove ( const QString& ); - int count () const; - QtxOperations* operations( const QString& ) const; - -private: - typedef struct - { - QString myName; - QtxOperations* myOperations; - int myAddPrior; - - } OperationSet; - - typedef QValueList< OperationSet > OperationSets; - typedef OperationSets::const_iterator OperationSetsIterator; - - OperationSets mySets; -}; - -#endif diff --git a/src/Qtx/QtxOperations.cxx b/src/Qtx/QtxOperations.cxx deleted file mode 100644 index ccf150007..000000000 --- a/src/Qtx/QtxOperations.cxx +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#include "QtxOperations.h" - -/*! - Default constructor -*/ -QtxOperations::QtxOperations() -{ -} - -/*! - Destructor -*/ -QtxOperations::~QtxOperations() -{ -} - -/*! - Creates QtxValue by it's string representation -*/ -bool QtxOperations::createValue( const QString& str, QtxValue& v ) const -{ - v = str; - return false; -} diff --git a/src/Qtx/QtxOperations.h b/src/Qtx/QtxOperations.h deleted file mode 100644 index 642a3bf31..000000000 --- a/src/Qtx/QtxOperations.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File: QtxOperations.h -// Author: Alexander SOLOVYOV - -#ifndef __QTX_OPERATIONS_HEADER__ -#define __QTX_OPERATIONS_HEADER__ - -#include "Qtx.h" -#include "QtxParser.h" - -class QTX_EXPORT QtxOperations -{ -public: - QtxOperations(); - virtual ~QtxOperations(); - - virtual void opersList( QStringList& ) const = 0; - //list of possible operations - - virtual void bracketsList( QStringList&, bool open ) const = 0; - //list of open/close brackets - - virtual bool createValue( const QString&, QtxValue& ) const; - //by default, the String value will be set, it corresponds to parameter - //base method returns false (always parameter) - //successor's method returns true if it has created custom value - //or call base if it hasn't - - virtual int prior( const QString&, bool isBin ) const = 0; - //returns prioritet of operation; - //if operation is impossible, it must return 0 or less - - virtual QtxParser::Error isValid( const QString&, - const QVariant::Type, - const QVariant::Type ) const = 0; - //return OK if this parameter types is valid for operation - //return OperandsNotMatch or InvalidOperation otherwise - - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const = 0; - //process binary operation with values - //for unary operation the second QtxValue will be passed as invalid -}; - -#endif diff --git a/src/Qtx/QtxParser.cxx b/src/Qtx/QtxParser.cxx deleted file mode 100644 index b4b32bb29..000000000 --- a/src/Qtx/QtxParser.cxx +++ /dev/null @@ -1,850 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -#include "QtxParser.h" -#include "QtxOperations.h" - -/*! - Constructor -*/ -QtxParser::QtxParser( QtxOperations* operations, const QString& expr ) -: myOperations( operations ) -{ - if( myOperations ) - { - setLastError( OK ); - setExpr( expr ); - } - else - setLastError( OperationsNull ); -} - -/*! - Destructor -*/ -QtxParser::~QtxParser() -{ -} - -/*! - Search elements of list as substrings starting on 'offset' - \returns the least position of substrings inside string - \param list - list of substrings - \param str - string where search - \param offset - starting index for search - \param matchLen - the length of appropriate substring - \param listind - list index of appropriate substring -*/ -int QtxParser::search( const QStringList& list, const QString& str, int offset, - int& matchLen, int& listind ) -{ - QStringList::const_iterator anIt = list.begin(), aLast = list.end(); - int min = -1; - for( int ind = 0; anIt!=aLast; anIt++, ind++ ) - { - //const char* where = str.latin1(), *what = (*anIt).latin1(); - int pos = str.find( *anIt, offset ); - if( pos>=0 && ( min < 0 || min > pos || - ( min==pos && matchLen< (int)(*anIt).length() ) ) ) - { - min = pos; - listind = ind; - matchLen = (*anIt).length(); - } - } - if( min<0 ) - matchLen = 0; - return min; -} - -/*! - \return substring - \param str - string - \param pos - start position of substring - \param len - length of substring -*/ -QString QtxParser::note( const QString& str, int pos, int len ) -{ - return str.mid( pos, len ).stripWhiteSpace(); -} - -/*! - First step of parsing: finding tokens, determining its types and creating of unsorted pseudo-postfix (with brackets) - \param expr - string expression - \param post - postfix to be created -*/ -bool QtxParser::prepare( const QString& expr, Postfix& post ) -{ - int pos = 0, len = expr.length(); - QValueStack< int > aBracketStack; - QStringList anOpers, anOpenBr, aCloseBr; - if( myOperations ) - { - myOperations->bracketsList( anOpenBr, true ); - myOperations->bracketsList( aCloseBr, false ); - myOperations->opersList( anOpers ); - } - else - { - setLastError( OperationsNull ); - return false; - } - - while( pos < len && lastError()==OK ) - { - PostfixItem item; - while( expr[ pos ].isSpace() && pos=len ) - break; - - int mBrLen = 0, mLen = 0, br_ind = -1, op_ind = -1; - int oPos = search( anOpenBr, expr, pos, mBrLen, br_ind ), - cPos = oPos==pos ? -1 : search( aCloseBr, expr, pos, mBrLen, br_ind ), - opPos = search( anOpers, expr, pos, mLen, op_ind ); - - if( expr[ pos ]=="'" ) - { - int vpos = pos+1; - while ( vpos< (int)expr.length() && expr[ vpos ]!="'" ) - vpos++; - - mLen = vpos-pos+1; - - int res = myOperations->createValue( note( expr, pos, mLen ), item.myValue ); - item.myType = res ? Value : Param; - post.append( item ); - pos = vpos+1; - continue; - } - - if( oPos==pos ) - { - aBracketStack.push( br_ind ); - item.myValue = note( expr, pos, mBrLen ); - item.myType = Open; - post.append( item ); - } - - else if( cPos==pos ) - { - if( aBracketStack.count()==0 ) - { - setLastError( ExcessClose ); - break; - } - if( br_ind!=aBracketStack.top() ) - { - setLastError( BracketsNotMatch ); - break; - } - else - { - aBracketStack.pop(); - item.myValue = note( expr, pos, mBrLen ); - item.myType = Close; - post.append( item ); - } - } - else - mBrLen = 0; - - if( opPos==pos ) - { - mBrLen = 0; - item.myValue = note( expr, pos, mLen ); - item.myType = Binary; - //the type is set by default; - //the method setOperationTypes will set correct types - - if( oPos==pos ) - post.insert( post.at( post.count()-1 ), item ); - else - post.append( item ); - } - else - { - mLen = 0; - if( oPos!=pos && cPos!=pos ) - { - int i; - for( i=pos+1; i<(int)expr.length(); i++ ) - if( expr[ i ].isSpace() ) - break; - - int vpos = i; - if( oPos>=0 && oPos=0 && cPos=0 && opPoscreateValue( note( expr, pos, mLen ), item.myValue ); - item.myType = res ? Value : Param; - post.append( item ); - } - } - - pos+=mBrLen+mLen; - } - - //Bracket checking - PostfixIterator anIt = post.begin(), - aLast = post.end(); - int brValue = 0; - for( ; anIt!=aLast; anIt++ ) - if( (*anIt).myType==Open ) - brValue++; - else if( (*anIt).myType==Close ) - if( brValue>0 ) - brValue--; - else - { - setLastError( ExcessClose ); - break; - } - if( brValue>0 ) - setLastError( CloseExpected ); - - return lastError()==OK; -} - -/*! - Second step of parsing: determining types of operations - \param post - unsorted postfix -*/ -bool QtxParser::setOperationTypes( Postfix& post ) -{ - Postfix::iterator aStart = post.begin(), - aLast = post.end(), - anIt = aStart, aPrev, aNext; - QStringList anOpen, aClose; - if( myOperations ) - { - myOperations->bracketsList( anOpen, true ); - myOperations->bracketsList( aClose, false ); - } - else - return false; - - for( ; anIt!=aLast; anIt++ ) - { - aPrev = anIt; aPrev--; - aNext = anIt; aNext++; - if( (*anIt).myType != Binary ) - continue; - - if( ( anIt==aStart || (*aPrev).myType == Open || - (*aPrev).myType == Pre || - (*aPrev).myType == Binary ) - && - aNext!=aLast && ( (*aNext).myType == Value || - (*aNext).myType == Param || - (*aNext).myType == Open || - (*aNext).myType == Binary ) ) - (*anIt).myType = Pre; - - else if( anIt!=aStart && ( (*aPrev).myType == Close || - (*aPrev).myType == Param || - (*aPrev).myType == Value || - (*aPrev).myType == Pre || - (*aPrev).myType == Post || - (*aPrev).myType == Binary ) - && - ( aNext==aLast || (*aNext).myType == Close ) ) - (*anIt).myType = Post; - - if( anOpen.contains( ( *anIt ).myValue.toString() )>0 ) - (*anIt).myType = Pre; - else if( aClose.contains( ( *anIt ).myValue.toString() )>0 ) - (*anIt).myType = Post; - } - - return lastError()==OK; -} - -/*! - \return how many global brackets there is (for example '((2+3))' has 2 global brackets) - \param post - postfix to be checked - \param f - start index to search - \param l - last index to search -*/ -int QtxParser::globalBrackets( const QtxParser::Postfix& post, int f, int l ) -{ - int i, - start_br = 0, - fin_br = 0, - br = 0, - br_num = 0, - min_br_num = (l-f+1)*5; - - for( i=f; i<=l; i++ ) - if( post[ i ].myType==QtxParser::Open ) - start_br++; - else - break; - for( i=l; i>=f; i-- ) - if( post[ i ].myType==QtxParser::Close ) - fin_br++; - else - break; - - br = start_br=0 ) - res.append( post[ f ] ); - if( l<=f ) - return true; - - if( myOperations ) - { - int min = -1; - QIntList argmin; - QValueList< PostfixItemType > min_types; - - //Find operation with minimal priority - //PostfixIterator anIt = post.at( f ), - // aLast = post.at( l+1 ); - for( int i=0, j=f; j<=l; i++, j++ ) - { - const PostfixItem& item = post[ j ]; - PostfixItemType tt = item.myType; - if( tt==Binary || tt==Pre || tt==Post ) - { - int cur_pr = myOperations->prior( item.myValue.toString(), tt==Binary ); - if( cur_pr>0 ) - { - if( min<0 || min>=cur_pr ) - { - if( min==cur_pr ) - { - argmin.append( f+i ); - min_types.append( tt ); - } - else - { - min = cur_pr; - argmin.clear(); argmin.append( f+i ); - min_types.clear(); min_types.append( tt ); - } - } - } - else - { - setLastError( InvalidOperation ); - break; - } - } - else if( tt==Open ) - { - QString opBr = item.myValue.toString(); - int ind = anOpen.findIndex( opBr ), brValue = 0; - while( j<=l ) - { - const PostfixItem& anItem = post[ j ]; - if( anItem.myType==Open ) - brValue++; - - if( anItem.myType==Close ) - { - brValue--; - QString clBr = anItem.myValue.toString(); - if( aClose.findIndex( clBr )==ind && brValue==0 ) - break; - } - i++; j++; - } - if( brValue>0 ) - { - setLastError( CloseExpected ); - break; - } - } - } - - if( lastError()==OK ) - if( min>=0 ) - { - QValueList< Postfix > parts; - QIntList::const_iterator anIt = argmin.begin(), - aLast = argmin.end(); - Postfix one; - bool ok = sort( post, one, anOpen, aClose, f, *anIt - 1 ); - parts.append( one ); - one.clear(); - for( ; anIt!=aLast && ok; anIt++ ) - { - QIntList::const_iterator aNext = anIt; aNext++; - ok = sort( post, one, anOpen, aClose, *anIt + 1, aNext==aLast ? l : *aNext - 1 ); - parts.append( one ); - one.clear(); - } - if( !ok ) - return false; - - QValueList< Postfix >::const_iterator aPIt = parts.begin(); - QValueList< PostfixItemType >::const_iterator aTIt = min_types.begin(); - QValueStack< PostfixItem > aStack; - res += (*aPIt); aPIt++; - anIt = argmin.begin(); - for( ; anIt!=aLast; anIt++, aPIt++, aTIt++ ) - { - if( *aTIt==Pre ) - if( anOpen.contains( post[ *anIt ].myValue.toString() )==0 ) - { - res+=(*aPIt); - aStack.push( post[ *anIt ] ); - } - else - { - res.append( post[ *anIt ] ); - res+=(*aPIt); - } - else - { - res+=(*aPIt); - while( !aStack.isEmpty() ) - { - res.append( aStack.top() ); - aStack.pop(); - } - res.append( post[ *anIt ] ); - } - } - while( !aStack.isEmpty() ) - { - res.append( aStack.top() ); - aStack.pop(); - } - } - else - { //there are no operations - PostfixIterator anIt = post.at( f ), - aLast = post.at( l+1 ); - for( ; anIt!=aLast; anIt++ ) - if( (*anIt).myType==Value || (*anIt).myType==Param ) - res.append( *anIt ); - } - } - else - setLastError( OperationsNull ); - - return lastError()==OK; -} - -/*! - Build posfix by expression - \param expr - string expression -*/ -bool QtxParser::parse( const QString& expr ) -{ - myPost.clear(); - - Postfix p; - QStringList opens, closes; - - if( myOperations ) - { - setLastError( OK ); - myOperations->bracketsList( opens, true ); - myOperations->bracketsList( closes, false ); - } - else - { - setLastError( OperationsNull ); - return false; - } - - //return prepare( expr, myPost ) && setOperationTypes( myPost ); - return prepare( expr, p ) && setOperationTypes( p ) && - sort( p, myPost, opens, closes ); -} - -/*! - Calculate operation - \param op - operation name - \param v1 - first argument (it is not valid for unary prefix operations and it is used to store result) - \param v2 - second argument (it is not valid for unary postfix operations) -*/ -bool QtxParser::calculate( const QString& op, QtxValue& v1, QtxValue& v2 ) -{ - Error err = myOperations->isValid( op, v1.type(), v2.type() ); - if( err==OK ) - setLastError( myOperations->calculate( op, v1, v2 ) ); - else - setLastError( err ); - - return lastError()==OK; -} - -/*! - Calculates expression without postfix rebuilding - \return QtxValue as result (it is invalid if there were errors during calculation) -*/ -QtxValue QtxParser::calculate() -{ - setLastError( OK ); - - QStringList anOpen, aClose; - if( myOperations ) - { - myOperations->bracketsList( anOpen, true ); - myOperations->bracketsList( aClose, false ); - } - else - { - setLastError( OperationsNull ); - return QtxValue(); - } - - QtxValueStack aStack; - PostfixIterator anIt = myPost.begin(), - aLast = myPost.end(); - for( ; anIt!=aLast && lastError()==OK; anIt++ ) - { - QString nn = (*anIt).myValue.toString(); - if( (*anIt).myType==Param ) - { - if( has( nn ) ) - { - QVariant& v = myParameters[ nn ]; - if( v.isValid() ) - aStack.push( v ); - else - setLastError( InvalidToken ); - } - else - setLastError( InvalidToken ); - } - - else if( (*anIt).myType==Value ) - aStack.push( (*anIt).myValue ); - - else if( (*anIt).myType==Pre || (*anIt).myType==Post ) - { - if( anOpen.contains( nn )>0 ) - { - QtxValue inv; - if( calculate( nn, inv, inv ) ) - aStack.push( QtxValue() ); - } - else if( aClose.contains( nn )>0 ) - { - QValueList< QtxValue > set; - while( true ) - { - if( aStack.count()==0 ) - { - setLastError( StackUnderflow ); - break; - } - if( aStack.top().isValid() ) - { - set.append( aStack.top() ); - aStack.pop(); - } - else - { - aStack.pop(); - break; - } - } - - QtxValue qSet = set, inv; - if( calculate( nn, qSet, inv ) ) - aStack.push( set ); - } - else if( aStack.count()>=1 ) - { - QtxValue inv; - QtxValue* v1 = &aStack.top(), *v2 = &inv; //"post-" case - if( (*anIt).myType==Pre ) - { - v2 = &aStack.top(); v1 = &inv; - } - - calculate( nn, *v1, *v2 ); - } - else - setLastError( StackUnderflow ); - } - - else if( (*anIt).myType==Binary ) - { - if( aStack.count()>=2 ) - { - QVariant v2 = aStack.top(); aStack.pop(); - calculate( nn, aStack.top(), v2 ); - } - else - setLastError( StackUnderflow ); - } - } - - QtxValue res; - if( lastError()==OK ) - { - int count = aStack.count(); - if( count==0 ) - setLastError( StackUnderflow ); - else if( count==1 ) - res = aStack.top(); - else - setLastError( ExcessData ); - } - return res; -} - -/*! - Change expression, rebuild postfix and calculate it - \return QtxValue as result (it is invalid if there were errors during calculation) -*/ -QtxValue QtxParser::calculate( const QString& expr ) -{ - setExpr( expr ); - return calculate(); -} - -/*! - Change expression and rebuild postfix -*/ -bool QtxParser::setExpr( const QString& expr ) -{ - return parse( expr ); -} - -/*! - \return true, if parser contain parameter - \param name - name of parameter -*/ -bool QtxParser::has( const QString& name ) const -{ - return myParameters.contains( name.stripWhiteSpace() ); -} - -/*! - Sets parameter value - \param name - name of parameter - \param value - value of parameter -*/ -void QtxParser::set( const QString& name, const QtxValue& value ) -{ - myParameters[ name.stripWhiteSpace() ] = value; -} - -/*! - Removes parameter - \param name - name of parameter -*/ -bool QtxParser::remove( const QString& name ) -{ - QString sname = name.stripWhiteSpace(); - bool res = has( sname ); - if( res ) - myParameters.remove( sname ); - return res; -} - -/*! - \return value of parameter (result is invalid if there is no such parameter) - \param name - name of parameter -*/ -QtxValue QtxParser::value( const QString& name ) const -{ - QString sname = name.stripWhiteSpace(); - if( has( sname ) ) - return myParameters[ sname ].toString(); - else - return QtxValue(); -} - -/*! - Searches first parameter with assigned invalid QtxValue - \return true if it is found - \param name - variable to return name of parameter -*/ -bool QtxParser::firstInvalid( QString& name ) const -{ - QMap< QString, QtxValue >::const_iterator anIt = myParameters.begin(), - aLast = myParameters.end(); - for( ; anIt!=aLast; anIt++ ) - if( !anIt.data().isValid() ) - { - name = anIt.key(); - return true; - } - return false; -} - -/*! - Removes all parameters with assigned invalid QtxValues -*/ -void QtxParser::removeInvalids() -{ - QStringList toDelete; - QMap< QString, QtxValue >::const_iterator anIt = myParameters.begin(), - aLast = myParameters.end(); - for( ; anIt!=aLast; anIt++ ) - if( !anIt.data().isValid() ) - toDelete.append( anIt.key() ); - - QStringList::const_iterator aLIt = toDelete.begin(), - aLLast = toDelete.end(); - for( ; aLIt!=aLLast; aLIt++ ) - myParameters.remove( *aLIt ); -} - -/*! - \return last error occured during parsing -*/ -QtxParser::Error QtxParser::lastError() const -{ - return myLastError; -} - -/*! - Sets last error occured during parsing (for internal using only) -*/ -void QtxParser::setLastError( QtxParser::Error err ) -{ - myLastError = err; -} - -/*! - \return string dump of internal parser postfix -*/ -QString QtxParser::dump() const -{ - return dump( myPost ); -} - -/*! - \return string dump of postfix - \param post - postfix to be dumped -*/ -QString QtxParser::dump( const Postfix& post ) const -{ - QString res; - - if( myOperations ) - { - PostfixIterator anIt = post.begin(), - aLast = post.end(); - for( ; anIt!=aLast; anIt++ ) - { - if( (*anIt).myType == Value && - ( ( *anIt ).myValue.type()==QVariant::String || - ( *anIt ).myValue.type()==QVariant::CString ) ) - res += "'" + ( *anIt ).myValue.toString() + "'"; - else - res += ( *anIt ).myValue.toString(); - if( (*anIt).myType == Pre ) - res += "(pre)"; - else if( (*anIt).myType == Post ) - res += "(post)"; - else if( (*anIt).myType == Binary ) - res += "(bin)"; - - res += "_"; - } - } - return res; -} - -/*! - Fills list with names of parameters - \param list - list to be filled -*/ -void QtxParser::paramsList( QStringList& list ) -{ - PostfixIterator anIt = myPost.begin(), - aLast = myPost.end(); - for( ; anIt!=aLast; anIt++ ) - if( (*anIt).myType==Param ) - { - QString name = (*anIt).myValue.toString(); - if( list.contains( name )==0 ) - list.append( name ); - } -} - -/*! - Removes all parameters -*/ -void QtxParser::clear() -{ - myParameters.clear(); -} - -/*! - \return string representation for list of QtxValues - \param list - list to be converted -*/ -QString QtxParser::toString( const QValueList< QtxValue >& list ) -{ - QValueList< QtxValue >::const_iterator anIt = list.begin(), - aLast = list.end(); - QString res = "set : [ "; - for( ; anIt!=aLast; anIt++ ) - res+=(*anIt).toString()+" "; - res+="]"; - return res; -} diff --git a/src/Qtx/QtxParser.h b/src/Qtx/QtxParser.h deleted file mode 100644 index 0a0b05a16..000000000 --- a/src/Qtx/QtxParser.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File: QtxParser.h -// Author: Alexander SOLOVYOV - -#ifndef __QTX_PARSER_HEADER__ -#define __QTX_PARSER_HEADER__ - -#include "Qtx.h" -#include -#include - -#ifdef WIN32 -#pragma warning( disable:4251 ) -#endif - - -class QtxOperations; - -/*! \var QtxValue - \brief Alias for QVariant -*/ -typedef QVariant QtxValue; - - -/*! - \class QtxParser - - This class allows to calculate values of expressions using different set of operations. - It is provided some of standard set of operations (arithmetics, logic, strings, etc - in QtxStdOperations.h). - This parser allows to use parameters with help of methods has(), set(), remove(), value(). It uses - postfix representation of expressions and uses class QtxOperations in order to make certain operation - Every instance of parser contains only one postfix, so that if expression has been changed, then postfix - must be rebuilt. In order to increase performance of frequent calculation for many of expressions it is - recommended to use different instances of parser for expressions - -*/ -class QTX_EXPORT QtxParser -{ -public: - /*! - \enum Error - \brief Errors during parsing - */ - typedef enum - { - OK, /*! \var All right */ - OperandsNotMatch, /*! \var Types of arguments are invalid for this operation */ - InvalidResult, /*! \var Operation cannot find result (for example, division by zero) */ - InvalidOperation, /*! \var Name of operation is unknown */ - OperationsNull, /*! \var Internal operations pointer of parser is null */ - InvalidToken, /*! \var It isn't operation, parameter of value */ - CloseExpected, /*! \var Close bracket is expected */ - ExcessClose, /*! \var The one of close bracket is excess */ - BracketsNotMatch, /*! \var Last open and this close bracket are different, for example [) */ - StackUnderflow, /*! \var There is no arguments in stack for operation */ - ExcessData /*! \var The parsing is finished, but there is more then one value in stack */ - - } Error; - -public: - QtxParser( QtxOperations*, const QString& = QString::null ); - virtual ~QtxParser(); - - QtxValue calculate(); - QtxValue calculate( const QString& ); - bool setExpr( const QString& ); - - virtual void clear(); - virtual bool has ( const QString& name ) const; - virtual void set ( const QString& name, const QtxValue& value ); - virtual bool remove( const QString& name ); - virtual QtxValue value ( const QString& name ) const; - - bool firstInvalid( QString& ) const; - void removeInvalids(); - QString dump() const; - Error lastError() const; - void paramsList( QStringList& ); - - static QString toString( const QValueList< QtxValue >& ); - -protected: - /*! - \enum PostfixItemType - \brief Types of postfix representation elements - */ - typedef enum - { - Value, /*! \var Value (number, string, etc.)*/ - Param, /*! \var Parameter */ - Open, /*! \var Open bracket */ - Close, /*! \var Close bracket */ - Pre, /*! \var Unary prefix operation */ - Post, /*! \var Unary postfix operation */ - Binary /*! \var Binary operation */ - - } PostfixItemType; - - /*! \var postfix representation element */ - typedef struct - { - QtxValue myValue; - PostfixItemType myType; - - } PostfixItem; - - /*! \var postfix representation */ - typedef QValueList< PostfixItem > Postfix; - - /*! \var postfix representation iterator */ - typedef Postfix::const_iterator PostfixIterator; - -protected: - QString dump( const Postfix& ) const; - virtual bool prepare( const QString&, Postfix& ); - virtual bool setOperationTypes( Postfix& ); - virtual bool sort( const Postfix&, Postfix&, - const QStringList&, const QStringList&, - int f=-1, int l=-1 ); - - virtual bool parse( const QString& ); - virtual void setLastError( const Error ); - - bool calculate( const QString&, QtxValue&, QtxValue& ); - - static int search ( const QStringList&, const QString&, int offset, - int& matchLen, int& listind ); - static QString note ( const QString& str, int pos, int len ); - static int globalBrackets( const Postfix&, int, int ); - -private: - /*! \var stack of QtxValues */ - typedef QValueStack < QtxValue > QtxValueStack; - -private: - QtxOperations* myOperations; - QMap< QString, QtxValue > myParameters; - Error myLastError; - Postfix myPost; -}; - -#endif diff --git a/src/Qtx/QtxStdOperations.cxx b/src/Qtx/QtxStdOperations.cxx deleted file mode 100644 index 8e0a33e01..000000000 --- a/src/Qtx/QtxStdOperations.cxx +++ /dev/null @@ -1,833 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -#include "QtxStdOperations.h" - -#include -#include - -/*! - Default constructor -*/ -QtxStdOperations::QtxStdOperations() -{ -} - -/*! - Destructor -*/ -QtxStdOperations::~QtxStdOperations() -{ -} - -/*! - Fills list of brackets treated as open (when 'open' is 'true') or close ('open' is 'false') -*/ -void QtxStdOperations::bracketsList( QStringList& list, bool open ) const -{ - if( open ) - list.append( "(" ); - else - list.append( ")" ); -} - -/*! - Fills list with operation names by copying of internal list of operations -*/ -void QtxStdOperations::opersList( QStringList& list ) const -{ - list += myOpers; -} - -/*! - Add operation names from list to internal list of operations -*/ -void QtxStdOperations::addOperations( const QStringList& list ) -{ - QStringList::const_iterator anIt = list.begin(), - aLast = list.end(); - for( ; anIt!=aLast; anIt++ ) - if( myOpers.contains( *anIt )==0 ) - myOpers.append( *anIt ); -} - -/*! - Append operation names from 'list' to internal list of operations -*/ -void QtxStdOperations::addTypes( const ListOfTypes& list ) -{ - ListOfTypes::const_iterator anIt = list.begin(), - aLast = list.end(); - for( ; anIt!=aLast; anIt++ ) - if( myTypes.contains( *anIt )==0 ) - myTypes.append( *anIt ); -} - -/*! - \return whether values with passed types are valid for arguments of operation - \param op - name of operation - \param t1 - type of first argument - \param t2 - type of second argument -*/ -QtxParser::Error QtxStdOperations::isValid( const QString& op, - const QVariant::Type t1, - const QVariant::Type t2 ) const -{ - if( ( t1==QVariant::Invalid || myTypes.contains( t1 ) ) && - ( t2==QVariant::Invalid || myTypes.contains( t2 ) ) && - ( t1!=QVariant::Invalid || t2!=QVariant::Invalid ) ) - if( prior( op, t1!=QVariant::Invalid && t2!=QVariant::Invalid ) > 0 ) - return QtxParser::OK; - else - return QtxParser::InvalidOperation; - else - return QtxParser::OperandsNotMatch; -} - - - - - - - - -/*! - Default constructor -*/ -QtxArithmetics::QtxArithmetics() -: QtxStdOperations() -{ - QStringList aList; - aList.append( "+" ); - aList.append( "-" ); - aList.append( "*" ); - aList.append( "/" ); - aList.append( "=" ); - aList.append( "<" ); - aList.append( ">" ); - aList.append( "<=" ); - aList.append( ">=" ); - aList.append( "<>" ); - aList.append( "!=" ); // same as "<>" - for C++ addicts - addOperations( aList ); - - ListOfTypes aTypes; - aTypes.append( QVariant::Int ); - aTypes.append( QVariant::UInt ); - aTypes.append( QVariant::Double ); - addTypes( aTypes ); -} - -/*! - Destructor -*/ -QtxArithmetics::~QtxArithmetics() -{ -} - -/*! - Creates numbers by it's string representation [redefined virtual] -*/ -bool QtxArithmetics::createValue( const QString& str, QtxValue& v ) const -{ - bool ok = false; - v = str.toInt( &ok ); - - if( !ok ) - { - v = str.toDouble( &ok ); - if( !ok ) - ok = QtxStdOperations::createValue( str, v ); - } - return ok; -} - -/*! - \return priority of arithmetic operation 'op'. - \param isBin indicate whether the operation is binary -*/ -int QtxArithmetics::prior( const QString& op, bool isBin ) const -{ - if( isBin ) - if( op=="<" || op==">" || op=="=" || - op=="<=" || op==">=" || op=="<>" || op=="!=" ) - return 1; - else if( op=="+" || op=="-" ) - return 2; - else if( op=="*" || op=="/" ) - return 3; - else - return 0; - else if( op=="+" || op=="-" ) - return 5; - else - return 0; -} - -void set( QVariant& v1, bool v2 ) -{ - v1 = QVariant( v2, 0 ); -} - -/*! - Calculates result of operation - \return one of error states - \param op - name of operation - \param v1 - first operation argument (must be used also to store result) - \param v2 - second operation argument -*/ -QtxParser::Error QtxArithmetics::calculate( const QString& op, - QtxValue& v1, QtxValue& v2 ) const -{ - QtxParser::Error err = QtxParser::OK; - - if( v1.isValid() && v2.isValid() ) - // binary operations - if( ( v1.type()==QVariant::Int || v1.type()==QVariant::UInt ) && - ( v2.type()==QVariant::Int || v2.type()==QVariant::UInt ) ) - { - int _v1 = v1.toInt(), - _v2 = v2.toInt(); - - if( op=="+" ) - v1 = _v1 + _v2; - else if( op=="-" ) - v1 = _v1 - _v2; - else if( op=="*" ) - v1 = _v1 * _v2; - else if( op=="/" ) - if( _v2!=0 ) - if( _v1%_v2==0 ) - v1 = _v1 / _v2; - else - v1 = double( _v1 ) / double( _v2 ); - else - err = QtxParser::InvalidResult; - else if( op=="<" ) - set( v1, _v1<_v2 ); - else if( op==">" ) - set( v1, _v1>_v2 ); - else if( op=="=" ) - set( v1, _v1==_v2 ); - else if( op=="<=" ) - set( v1, _v1<=_v2 ); - else if( op==">=" ) - set( v1, _v1>=_v2 ); - else if( op=="<>" || op=="!=" ) - set( v1, _v1!=_v2 ); - } - else if( ( v1.type()==QVariant::Int || v1.type()==QVariant::Double ) && - ( v2.type()==QVariant::Int || v2.type()==QVariant::Double ) ) - { - double _v1 = v1.toDouble(), - _v2 = v2.toDouble(); - - if( op=="+" ) - v1 = _v1 + _v2; - else if( op=="-" ) - v1 = _v1 - _v2; - else if( op=="*" ) - v1 = _v1 * _v2; - else if( op=="/" ) - if( _v2!=0 ) - v1 = _v1 / _v2; - else - err = QtxParser::InvalidResult; - else if( op=="<" ) - set( v1, _v1<_v2 ); - else if( op==">" ) - set( v1, _v1>_v2 ); - else if( op=="=" ) - set( v1, _v1==_v2 ); - else if( op=="<=" ) - set( v1, _v1<=_v2 ); - else if( op==">=" ) - set( v1, _v1>=_v2 ); - else if( op=="<>" || op=="!=" ) - set( v1, _v1!=_v2 ); - } - else - // prefix operations - if( op=="-" ) - if( v2.type()==QVariant::Int ) - v2 = -v2.toInt(); - else if( v2.type()==QVariant::Double ) - v2 = -v2.toDouble(); - - return err; -} - - - - - - - - - - - -/*! - Default constructor -*/ -QtxLogic::QtxLogic() -: QtxStdOperations() -{ - QStringList aList; - aList.append( "and" ); - aList.append( "&&" ); - aList.append( "or" ); - aList.append( "||" ); - aList.append( "xor" ); - aList.append( "not" ); - aList.append( "!" ); - aList.append( "imp" ); - aList.append( "=" ); - addOperations( aList ); - - ListOfTypes aTypes; - aTypes.append( QVariant::Bool ); - aTypes.append( QVariant::Int ); - aTypes.append( QVariant::UInt ); - addTypes( aTypes ); -} - -/*! - Destructor -*/ -QtxLogic::~QtxLogic() -{ -} - -/*! - Creates value 'true' or 'false' it's string representation [redefined virtual] -*/ -bool QtxLogic::createValue( const QString& str, QtxValue& v ) const -{ - bool ok = true; - if( str.lower()=="true" ) - v = QtxValue( true, 0 ); - else if( str.lower()=="false" ) - v = QtxValue( false, 0 ); - else - ok = QtxStdOperations::createValue( str, v ); - - return ok; -} - -/*! - \return priority of arithmetic operation 'op'. - \param isBin indicate whether the operation is binary -*/ -int QtxLogic::prior( const QString& op, bool isBin ) const -{ - if( isBin ) - if( op=="and" || op=="or" || op=="xor" || - op=="&&" || op=="||" || - op=="imp" ) - return 1; - else if( op=="=" ) - return 2; - else - return 0; - else if( op=="not" || op=="!" ) - return 5; - else - return 0; -} - -bool boolean_value( const QtxValue& v ) -{ - if( v.type()==QVariant::Bool ) - return v.toBool(); - else if( v.type()==QVariant::Int ) - return v.toInt()!=0; - else if( v.type()==QVariant::UInt ) - return v.toUInt()!=0; - else - return false; -} - -/*! - Calculates result of operation - \return one of error states - \param op - name of operation - \param v1 - first operation argument (must be used also to store result) - \param v2 - second operation argument -*/ -QtxParser::Error QtxLogic::calculate( const QString& op, - QtxValue& v1, QtxValue& v2 ) const -{ - QtxParser::Error err = QtxParser::OK; - bool val1 = boolean_value( v1 ), - val2 = boolean_value( v2 ); - if( v1.isValid() && v2.isValid() ) - { - if( op=="and" || op=="&&" ) - set( v1, val1 && val2 ); - else if( op=="or" || op=="||" ) - set( v1, val1 || val2 ); - else if( op=="xor" ) - set( v1, ( !val1 && val2 ) || ( val1 && !val2 ) ); - else if( op=="imp" ) - set( v1, !val1 || val2 ); - else if( op=="=" ) - set( v1, val1==val2 ); - } - else - if( op=="not" || op=="!" ) - set( v2, !val2 ); - - return err; -} - - - - - - -/*! - Default constructor -*/ -QtxFunctions::QtxFunctions() -: QtxStdOperations() -{ - QStringList aList; - aList.append( "sqrt" ); - aList.append( "abs" ); - aList.append( "sin" ); - aList.append( "cos" ); - aList.append( "rad2grad" ); - aList.append( "grad2rad" ); - addOperations( aList ); - - ListOfTypes aTypes; - aTypes.append( QVariant::Int ); - aTypes.append( QVariant::Double ); - addTypes( aTypes ); -} - -/*! - Destructor -*/ -QtxFunctions::~QtxFunctions() -{ -} - -/*! - Creates numbers by it's string representation [redefined virtual] -*/ -bool QtxFunctions::createValue( const QString& str, QtxValue& v ) const -{ - bool ok = false; - v = str.toInt( &ok ); - - if( !ok ) - { - v = str.toDouble( &ok ); - if( !ok ) - ok = QtxStdOperations::createValue( str, v ); - } - return ok; -} - -/*! - \return priority of arithmetic operation 'op'. - \param isBin indicate whether the operation is binary -*/ -int QtxFunctions::prior( const QString& op, bool isBin ) const -{ - if( isBin ) - return 0; - else if( op=="sqrt" || op=="abs" || op=="sin" || op=="cos" || - op=="rad2grad" || op=="grad2rad" ) - return 1; - else - return 0; -} - -/*! - Calculates result of operation - \return one of error states - \param op - name of operation - \param v1 - first operation argument (must be used also to store result) - \param v2 - second operation argument -*/ -QtxParser::Error QtxFunctions::calculate( const QString& op, - QtxValue& v1, QtxValue& v2 ) const -{ - QtxParser::Error err = QtxParser::OK; - double val = v2.toDouble(); - if( op=="sqrt" ) - if( val>=0 ) - v2 = sqrt( val ); - else - err = QtxParser::InvalidResult; - else if( op=="abs" ) - if( v2.type()==QVariant::Int ) - v2 = abs( v2.toInt() ); - else - v2 = fabs( v2.toDouble() ); - else if( op=="sin" ) - v2 = sin( val ); - else if( op=="cos" ) - v2 = cos( val ); - else if( op=="grad2rad" ) - v2 = val * 3.14159256 / 180.0; - else if( op=="rad2grad" ) - v2 = val * 180.0 / 3.14159256; - - return err; -} - - - - - - - - -/*! - Default constructor -*/ -QtxStrings::QtxStrings() -: QtxStdOperations() -{ - QStringList aList; - aList.append( "+" ); - aList.append( "=" ); - aList.append( "<" ); - aList.append( ">" ); - aList.append( "<=" ); - aList.append( ">=" ); - aList.append( "<>" ); - aList.append( "!=" ); // same as "<>" - for C++ addicts - aList.append( "length" ); - aList.append( "lower" ); - aList.append( "upper" ); - addOperations( aList ); - - ListOfTypes aTypes; - aTypes.append( QVariant::Int ); - aTypes.append( QVariant::Double ); - aTypes.append( QVariant::String ); - aTypes.append( QVariant::CString ); - addTypes( aTypes ); -} - - -/*! - Destructor -*/ -QtxStrings::~QtxStrings() -{ -} - -/*! - Creates string QtxValue by it's Qt string representation [redefined virtual] -*/ -bool QtxStrings::createValue( const QString& str, QtxValue& v ) const -{ - QChar st = str[0], - fin = str[ ( int )( str.length()-1 ) ]; - if( st=="'" && fin=="'" ) - { - v = str.mid( 1, str.length()-2 ); - return true; - } - else - return QtxStdOperations::createValue( str, v ); -} - -/*! - \return priority of arithmetic operation 'op'. - \param isBin indicate whether the operation is binary -*/ -int QtxStrings::prior( const QString& op, bool isBin ) const -{ - if( isBin ) - if( op=="+" ) - return 2; - else if( op=="=" || op=="<" || op==">" || - op=="<=" || op==">=" || op=="<>" || op=="!=" ) - return 1; - else - return 0; - else - if( op=="length" || op=="lower" || op=="upper" ) - return 5; - else - return 0; -} - -/*! - Calculates result of operation - \return one of error states - \param op - name of operation - \param v1 - first operation argument (must be used also to store result) - \param v2 - second operation argument -*/ -QtxParser::Error QtxStrings::calculate( const QString& op, - QtxValue& v1, QtxValue& v2 ) const -{ - QtxParser::Error err = QtxParser::OK; - if( v1.isValid() && v2.isValid() ) - { - QString _v1 = v1.toString(), - _v2 = v2.toString(); - if( op=="+" ) - v1 = _v1 + _v2; - else if( op=="=" ) - set( v1, _v1==_v2 ); - else if( op=="<" ) - set( v1, _v1<_v2 ); - else if( op==">" ) - set( v1, _v1>_v2 ); - else if( op=="<>" || op=="!=" ) - set( v1, _v1!=_v2 ); - else if( op=="<=" ) - set( v1, _v1<_v2 || _v1==_v2 ); - else if( op==">=" ) - set( v1, _v1>_v2 || _v1==_v2 ); - } - else if( !v1.isValid() && v2.isValid() ) - { - QString val = v2.toString(); - if( op=="length" ) - v2 = ( int )val.length(); - else if( op=="lower" ) - v2 = val.lower(); - else if( op=="upper" ) - v2 = val.upper(); - } - - return err; -} - - - - - - -/*! - Default constructor -*/ -QtxSets::QtxSets() -{ - QStringList aList; - aList.append( "{" ); - aList.append( "}" ); - aList.append( "=" ); - aList.append( "<>" ); - aList.append( "!=" ); // same as "<>" - for C++ addicts - aList.append( "+" ); - aList.append( "-" ); - aList.append( "*" ); - aList.append( "in" ); - aList.append( "count" ); - addOperations( aList ); - - ListOfTypes aTypes; - aTypes.append( QVariant::List ); - addTypes( aTypes ); -} - -/*! - Destructor -*/ -QtxSets::~QtxSets() -{ -} - -/*! - Fills list of brackets treated as open (when 'open' is 'true') or close ('open' is 'false') -*/ -void QtxSets::bracketsList( QStringList& list, bool open ) const -{ - if( open ) - list.append( "{" ); - else - list.append( "}" ); - QtxStdOperations::bracketsList( list, open ); -} - -/*! - Creates set of QtxValues by their string representation [redefined virtual] -*/ -bool QtxSets::createValue( const QString& str, QtxValue& val ) const -{ - return QtxStdOperations::createValue( str, val ); -} - -/*! - \return priority of arithmetic operation 'op'. - \param isBin indicate whether the operation is binary -*/ -int QtxSets::prior( const QString& op, bool isBin ) const -{ - if( isBin ) - if( op=="=" || op=="<>" || op=="!=" ) - return 1; - else if( op=="+" || op=="-" || op=="*" ) - return 2; - else if( op=="in" ) - return 3; - else - return 0; - - else - if( op=="{" || op=="}" ) - return 5; - else if( op=="count" ) - return 4; - else - return 0; -} - -/*! - \return whether values with passed types are valid for arguments of operation - \param op - name of operation - \param t1 - type of first argument - \param t2 - type of second argument -*/ -QtxParser::Error QtxSets::isValid( const QString& op, - const QVariant::Type t1, - const QVariant::Type t2 ) const -{ - if( op=="{" ) - return QtxParser::OK; - else if( op=="in" ) - if( t1!=QVariant::Invalid && t2==QVariant::List ) - return QtxParser::OK; - else - return QtxParser::OperandsNotMatch; - else - return QtxStdOperations::isValid( op, t1, t2 ); -} - -/*! - Adds new value 'v' to set 'set' [static] -*/ -void QtxSets::add( ValueSet& set, const QtxValue& v ) -{ - if( v.isValid() && set.contains( v )==0 ) - set.append( v ); -} - -/*! - Adds values from set 's2' to set 's1' -*/ -void QtxSets::add( ValueSet& s1, const ValueSet& s2 ) -{ - ValueSet::const_iterator anIt = s2.begin(), - aLast = s2.end(); - for( ; anIt!=aLast; anIt++ ) - add( s1, *anIt ); -} - -/*! - Removes value 'v' from set 'set' -*/ -void QtxSets::remove( ValueSet& set, const QtxValue& v ) -{ - set.remove( v ); -} - -/*! - Removes values of set 's2' from set 's1' -*/ -void QtxSets::remove( ValueSet& s1, const ValueSet& s2 ) -{ - ValueSet::const_iterator anIt = s2.begin(), - aLast = s2.end(); - for( ; anIt!=aLast; anIt++ ) - s1.remove( *anIt ); -} - -/*! - Calculates result of operation - \return one of error states - \param op - name of operation - \param v1 - first operation argument (must be used also to store result) - \param v2 - second operation argument -*/ -QtxParser::Error QtxSets::calculate( const QString& op, QtxValue& v1, QtxValue& v2 ) const -{ - QtxParser::Error err = QtxParser::OK; - - if( op!="{" ) - if( op=="}" ) - { - ValueSet aNewList; - add( aNewList, v1.toList() ); - v1 = aNewList; - } - - else if( op=="=" || op=="<>" || op=="!=" || op=="+" || op=="-" || op=="*" ) - { - ValueSet aNewList; - add( aNewList, v1.toList() ); - - if( op=="=" || op=="<>" || op=="!=" || op=="-" ) - { - remove( aNewList, v2.toList() ); - - if( op=="=" ) - set( v1, aNewList.isEmpty() && v1.toList().count()==v2.toList().count() ); - else if( op=="<>" || op=="!=" ) - set( v1, !aNewList.isEmpty() || v1.toList().count()!=v2.toList().count() ); - else - v1 = aNewList; - } - else if( op=="+" ) - { - add( aNewList, v2.toList() ); - v1 = aNewList; - } - else if( op=="*" ) - { - ValueSet toDelete; - add( toDelete, aNewList ); - remove( toDelete, v2.toList() ); - remove( aNewList, toDelete ); - v1 = aNewList; - } - } - else if( op=="count" ) - v2 = ( int )v2.toList().count(); - else if( op=="in" ) - { - if( v1.type()==QVariant::List ) - { - bool res = true; - ValueSet::const_iterator anIt = v1.toList().begin(), - aLast = v1.toList().end(); - for( ; anIt!=aLast && res; anIt++ ) - res = v2.toList().contains( *anIt )>0; - - set( v1, res ); - } - else - { - const QValueList< QVariant >& list = v2.toList(); - v1 = ( bool )( list.find( v1 )!=list.end() ); - } - } - - return err; -} diff --git a/src/Qtx/QtxStdOperations.h b/src/Qtx/QtxStdOperations.h deleted file mode 100644 index 3631d7b95..000000000 --- a/src/Qtx/QtxStdOperations.h +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File: QtxStdOperations.h -// Author: Alexander SOLOVYOV - -#ifndef __QTX_STD_OPERATIONS_HEADER__ -#define __QTX_STD_OPERATIONS_HEADER__ - -#include "Qtx.h" -#include "QtxOperations.h" - -/*! - \class QtxStdOperations - Provides simplified interface for standard operations. - Conatins list of operation names, priority and possible types -*/ -class QTX_EXPORT QtxStdOperations : public QtxOperations -{ -public: - QtxStdOperations(); - virtual ~QtxStdOperations(); - - virtual void opersList( QStringList& ) const; - virtual void bracketsList( QStringList&, bool open ) const; - - virtual QtxParser::Error isValid( const QString&, - const QVariant::Type, - const QVariant::Type ) const; -protected: - typedef QValueList< QVariant::Type > ListOfTypes; - - void addOperations( const QStringList& ); - void addTypes( const ListOfTypes& ); - -private: - QStringList myOpers; - ListOfTypes myTypes; -}; - -/*! - \class QtxArithmetics - Provides set of arithmetic operations for parser -*/ -class QTX_EXPORT QtxArithmetics : public QtxStdOperations -{ -public: - QtxArithmetics(); - virtual ~QtxArithmetics(); - - virtual bool createValue( const QString&, QtxValue& ) const; - virtual int prior( const QString&, bool isBin ) const; - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const; -}; - -/*! - \class QtxLogic - Provides set of logic operations for parser -*/ -class QTX_EXPORT QtxLogic : public QtxStdOperations -{ -public: - QtxLogic(); - virtual ~QtxLogic(); - - virtual bool createValue( const QString&, QtxValue& ) const; - virtual int prior( const QString&, bool isBin ) const; - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const; -}; - -/*! - \class QtxFunctions - Provides set of more complex operations for parser (sqrt, sin, cos, etc) -*/ -class QTX_EXPORT QtxFunctions : public QtxStdOperations -{ -public: - QtxFunctions(); - virtual ~QtxFunctions(); - - virtual bool createValue( const QString&, QtxValue& ) const; - virtual int prior( const QString&, bool isBin ) const; - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const; -}; - -/*! - \class QtxStrings - Provides set of string operations for parser -*/ -class QTX_EXPORT QtxStrings : public QtxStdOperations -{ -public: - QtxStrings(); - virtual ~QtxStrings(); - - virtual bool createValue( const QString&, QtxValue& ) const; - virtual int prior( const QString&, bool isBin ) const; - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const; -}; - -/*! - \class QtxSets - Provides set of operations with sets for parser -*/ -class QTX_EXPORT QtxSets : public QtxStdOperations -{ -public: - typedef QValueList< QtxValue > ValueSet; - -public: - QtxSets(); - virtual ~QtxSets(); - - virtual void bracketsList( QStringList&, bool open ) const; - virtual bool createValue( const QString&, QtxValue& ) const; - virtual int prior( const QString&, bool isBin ) const; - virtual QtxParser::Error isValid( const QString&, - const QVariant::Type, - const QVariant::Type ) const; - virtual QtxParser::Error calculate( const QString&, QtxValue&, QtxValue& ) const; - - static void add( ValueSet&, const QtxValue& ); - static void add( ValueSet&, const ValueSet& ); - static void remove( ValueSet&, const QtxValue& ); - static void remove( ValueSet&, const ValueSet& ); -}; - - -#endif