Back to index

salome-gui  6.5.0
QtxEvalExpr.h
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // This library is free software; you can redistribute it and/or
00004 // modify it under the terms of the GNU Lesser General Public
00005 // License as published by the Free Software Foundation; either
00006 // version 2.1 of the License.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // Lesser General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU Lesser General Public
00014 // License along with this library; if not, write to the Free Software
00015 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00016 //
00017 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00018 //
00019 
00020 // File:      QtxEvalExpr.h
00021 // Author:    Alexander SOLOVYOV, Sergey TELKOV
00022 //
00023 #ifndef QTXEVALEXPR_H
00024 #define QTXEVALEXPR_H
00025 
00026 #include "Qtx.h"
00027 
00028 #include <QList>
00029 #include <QVariant>
00030 
00031 #ifdef WIN32
00032 #pragma warning( disable:4251 )
00033 #endif
00034 
00035 class QtxEvalSet;
00036 class QtxEvalParser;
00037 
00038 class QTX_EXPORT QtxEvalExpr
00039 {
00040 public:
00042   typedef enum
00043   {
00044     OK,               
00045     OperandsNotMatch, 
00046     InvalidResult,    
00047     InvalidOperation, 
00048     OperationsNull,   
00049     InvalidToken,     
00050     CloseExpected,    
00051     ExcessClose,      
00052     BracketsNotMatch, 
00053     StackUnderflow,   
00054     ExcessData        
00055   } Error;
00056 
00057 public:
00058   QtxEvalExpr( const QString& = QString() );
00059   QtxEvalExpr( const bool, const QString& = QString() );
00060   ~QtxEvalExpr();
00061 
00062   QVariant           calculate( const QString& = QString() );
00063 
00064   QString            expression() const;
00065   void               setExpression( const QString& );
00066 
00067   Error              error() const;
00068   QtxEvalParser*     parser() const;
00069 
00070   bool               autoDeleteOperationSets() const;
00071   void               setAutoDeleteOperationSets( const bool );
00072 
00073   QList<QtxEvalSet*> operationSets() const;
00074   QtxEvalSet*        operationSet( const QString& ) const;
00075   void               removeOperationSet( QtxEvalSet* );
00076   void               insertOperationSet( QtxEvalSet*, const int = -1 );
00077 
00078 private:
00079   void               intialize( const bool, const QString& );
00080 
00081 private:
00082   QString            myExpr;
00083   QtxEvalParser*     myParser;
00084 };
00085 
00086 class QTX_EXPORT QtxEvalParser
00087 {
00088 public:
00089   QtxEvalParser();
00090   virtual ~QtxEvalParser();
00091 
00092   QVariant           calculate();
00093   QVariant           calculate( const QString& );
00094   bool               setExpression( const QString& );
00095 
00096   QList<QtxEvalSet*> operationSets() const;
00097   QtxEvalSet*        operationSet( const QString& ) const;
00098   void               removeOperationSet( QtxEvalSet* );
00099   void               insertOperationSet( QtxEvalSet*, const int = -1 );
00100 
00101   bool               autoDeleteOperationSets() const;
00102   void               setAutoDeleteOperationSets( const bool );
00103 
00104   virtual void       clearParameters();
00105   virtual bool       removeParameter( const QString& name );
00106   virtual QVariant   parameter( const QString& name ) const;
00107   virtual bool       hasParameter( const QString& name ) const;
00108   virtual void       setParameter( const QString& name, const QVariant& value );
00109   QStringList        parameters() const;
00110 
00111   QtxEvalExpr::Error error() const;
00112 
00113   bool               firstInvalid( QString& ) const;
00114   void               removeInvalids();
00115   QString            dump() const;
00116 
00117   static QString     toString( const QList<QVariant>& );
00118 
00119 protected:
00121   typedef enum
00122   {
00123     Value, 
00124     Param, 
00125     Open,  
00126     Close, 
00127     Pre,   
00128     Post,  
00129     Binary 
00130   } PostfixItemType;
00131 
00133   typedef struct
00134   {
00135     QVariant          myValue;
00136     PostfixItemType   myType;
00137   } PostfixItem;
00138 
00139   typedef QList<PostfixItem>      Postfix;   
00140   typedef QList<QtxEvalSet*>      SetList;   
00141   typedef QMap<QString, QVariant> ParamMap;  
00142 
00143 protected:
00144   QString            dump( const Postfix& ) const;
00145   virtual bool       prepare( const QString&, Postfix& );
00146   virtual bool       setOperationTypes( Postfix& );
00147   virtual bool       sort( const Postfix&, Postfix&, const QStringList&,
00148                            const QStringList&, int f = -1, int l = -1 );
00149 
00150   virtual bool       parse( const QString& );
00151   virtual void       setError( const QtxEvalExpr::Error );
00152 
00153   bool               calculate( const QString&, QVariant&, QVariant& );
00154 
00155   static int         search( const QStringList&, const QString&,
00156                              int offset, int& matchLen, int& listind );
00157   static QString     note( const QString& str, int pos, int len );
00158   static int         globalBrackets( const Postfix&, int, int );
00159 
00160 private:
00161   void               operationList( QStringList& ) const;
00162   void               bracketsList( QStringList&, bool ) const;
00163   bool               createValue( const QString&, QVariant& ) const;
00164   int                priority( const QString&, bool isBin ) const;
00165   QtxEvalExpr::Error isValid( const QString&,
00166                               const QVariant::Type, const QVariant::Type ) const;
00167   QtxEvalExpr::Error calculation( const QString&, QVariant&, QVariant& ) const;
00168 
00169   bool               checkOperations() const;
00170 
00171 private:
00172   SetList            mySets;
00173   QtxEvalExpr::Error myError;
00174   ParamMap           myParams;
00175   Postfix            myPostfix;
00176   bool               myAutoDel;
00177 };
00178 
00179 class QTX_EXPORT QtxEvalSet
00180 {
00181 public:
00182   QtxEvalSet();
00183   virtual ~QtxEvalSet();
00184 
00185   virtual QString            name() const = 0;
00186 
00187   virtual void               operationList( QStringList& ) const = 0;
00188 
00189   virtual void               bracketsList( QStringList&, bool open ) const = 0;
00190 
00191   virtual bool               createValue( const QString&, QVariant& ) const;
00192 
00193   virtual int                priority( const QString&, bool isBin ) const = 0;
00194 
00195   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00196                                       const QVariant::Type ) const = 0;
00197 
00198   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const = 0;
00199 };
00200 
00201 class QTX_EXPORT QtxEvalSetBase : public QtxEvalSet
00202 {
00203 public:
00204   QtxEvalSetBase();
00205   virtual ~QtxEvalSetBase();
00206 
00207   virtual void               operationList( QStringList& ) const;
00208   virtual void               bracketsList( QStringList&, bool open ) const;
00209 
00210   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00211                                       const QVariant::Type ) const;
00212 protected: 
00213   typedef QList<QVariant::Type> ListOfTypes;
00214 
00215   void                       addTypes( const ListOfTypes& );
00216   void                       addOperations( const QStringList& );
00217 
00218 private:
00219   QStringList                myOpers;
00220   ListOfTypes                myTypes;
00221 };
00222 
00223 class QTX_EXPORT QtxEvalSetArithmetic : public QtxEvalSetBase
00224 {
00225 public:
00226   QtxEvalSetArithmetic();
00227   virtual ~QtxEvalSetArithmetic();
00228 
00229   virtual bool               createValue( const QString&, QVariant& ) const;
00230   virtual int                priority( const QString&, bool isBin ) const;
00231   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00232 
00233   static QString             Name();
00234   virtual QString            name() const;
00235 };
00236 
00237 class QTX_EXPORT QtxEvalSetLogic : public QtxEvalSetBase
00238 {
00239 public:
00240   QtxEvalSetLogic();
00241   virtual ~QtxEvalSetLogic();
00242 
00243   virtual bool               createValue( const QString&, QVariant& ) const;
00244   virtual int                priority( const QString&, bool isBin ) const;
00245   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00246 
00247   static QString             Name();
00248   virtual QString            name() const;
00249 
00250 private:
00251   int                        intValue( const QVariant& v ) const;
00252 };
00253 
00254 class QTX_EXPORT QtxEvalSetMath : public QtxEvalSetBase
00255 {
00256 public:
00257   QtxEvalSetMath();
00258   virtual ~QtxEvalSetMath();
00259 
00260   virtual bool               createValue( const QString&, QVariant& ) const;
00261   virtual int                priority( const QString&, bool isBin ) const;
00262   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00263 
00264   static QString             Name();
00265   virtual QString            name() const;
00266 };
00267 
00268 class QTX_EXPORT QtxEvalSetString : public QtxEvalSetBase
00269 {
00270 public:
00271   QtxEvalSetString();
00272   virtual ~QtxEvalSetString();
00273 
00274   virtual bool               createValue( const QString&, QVariant& ) const;
00275   virtual int                priority( const QString&, bool isBin ) const;
00276   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00277 
00278   static QString             Name();
00279   virtual QString            name() const;
00280 };
00281 
00282 class QTX_EXPORT QtxEvalSetSets : public QtxEvalSetBase
00283 {
00284 public:
00285   typedef QList<QVariant> ValueSet;
00286 
00287 public:
00288   QtxEvalSetSets();
00289   virtual ~QtxEvalSetSets();
00290 
00291   virtual void               bracketsList( QStringList&, bool open ) const;
00292   virtual int                priority( const QString&, bool isBin ) const;
00293   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00294                                       const QVariant::Type ) const;
00295   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00296 
00297   static void add( ValueSet&, const QVariant& );
00298   static void add( ValueSet&, const ValueSet& );
00299   static void remove( ValueSet&, const QVariant& );
00300   static void remove( ValueSet&, const ValueSet& );
00301 
00302   static QString             Name();
00303   virtual QString            name() const;
00304 };
00305 
00306 class QTX_EXPORT QtxEvalSetConst : public QtxEvalSet
00307 {
00308 public:
00309   QtxEvalSetConst();
00310   virtual ~QtxEvalSetConst();
00311 
00312   static QString             Name();
00313   virtual QString            name() const;
00314 
00315   virtual bool               createValue( const QString&, QVariant& ) const;
00316 
00317   virtual void               operationList( QStringList& ) const;
00318   virtual void               bracketsList( QStringList&, bool open ) const;
00319   virtual int                priority( const QString&, bool isBin ) const;
00320   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00321                                       const QVariant::Type ) const;
00322   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00323 };
00324 
00325 #endif // QTXEVALEXPR_H