Salome HOME
bf27ebf59f868e96262ea64b7d9c6600565cd81c
[modules/gui.git] / src / Qtx / QtxEvalExpr.h
1 // Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 // File:      QtxEvalExpr.h
21 // Author:    Alexander SOLOVYOV, Sergey TELKOV
22 //
23 #ifndef QTXEVALEXPR_H
24 #define QTXEVALEXPR_H
25
26 #include "Qtx.h"
27
28 #include <QList>
29 #include <QVariant>
30
31 #ifdef WIN32
32 #pragma warning( disable:4251 )
33 #endif
34
35 class QtxEvalSet;
36 class QtxEvalParser;
37
38 class QTX_EXPORT QtxEvalExpr
39 {
40 public:
41   //! Parsing error type
42   typedef enum
43   {
44     OK,               //!< No errors found
45     OperandsNotMatch, //!< Types of arguments are invalid for this operation
46     InvalidResult,    //!< Operation cannot find result (for example, division by zero)
47     InvalidOperation, //!< Unknown operation
48     OperationsNull,   //!< Internal operations pointer of parser is null
49     InvalidToken,     //!< Invalid token (neither operation, nor parameter of value)
50     CloseExpected,    //!< Closing bracket is expected
51     ExcessClose,      //!< Extra closing bracket is found
52     BracketsNotMatch, //!< Opening and closing brackets are of different type, e.g. [)
53     StackUnderflow,   //!< There are no arguments in the stack for the operation
54     ExcessData        //!< The parsing is finished, but there are more then one value in the stack
55   } Error;
56
57 public:
58   QtxEvalExpr( const QString& = QString() );
59   QtxEvalExpr( const bool, const QString& = QString() );
60   ~QtxEvalExpr();
61
62   QVariant           calculate( const QString& = QString() );
63
64   QString            expression() const;
65   void               setExpression( const QString& );
66
67   Error              error() const;
68   QtxEvalParser*     parser() const;
69
70   bool               autoDeleteOperationSets() const;
71   void               setAutoDeleteOperationSets( const bool );
72
73   QList<QtxEvalSet*> operationSets() const;
74   QtxEvalSet*        operationSet( const QString& ) const;
75   void               removeOperationSet( QtxEvalSet* );
76   void               insertOperationSet( QtxEvalSet*, const int = -1 );
77
78 private:
79   void               intialize( const bool, const QString& );
80
81 private:
82   QString            myExpr;
83   QtxEvalParser*     myParser;
84 };
85
86 class QTX_EXPORT QtxEvalParser
87 {
88 public:
89   QtxEvalParser();
90   virtual ~QtxEvalParser();
91
92   QVariant           calculate();
93   QVariant           calculate( const QString& );
94   bool               setExpression( const QString& );
95
96   QList<QtxEvalSet*> operationSets() const;
97   QtxEvalSet*        operationSet( const QString& ) const;
98   void               removeOperationSet( QtxEvalSet* );
99   void               insertOperationSet( QtxEvalSet*, const int = -1 );
100
101   bool               autoDeleteOperationSets() const;
102   void               setAutoDeleteOperationSets( const bool );
103
104   virtual void       clearParameters();
105   virtual bool       removeParameter( const QString& name );
106   virtual QVariant   parameter( const QString& name ) const;
107   virtual bool       hasParameter( const QString& name ) const;
108   virtual void       setParameter( const QString& name, const QVariant& value );
109   QStringList        parameters() const;
110
111   QtxEvalExpr::Error error() const;
112
113   bool               firstInvalid( QString& ) const;
114   void               removeInvalids();
115   QString            dump() const;
116
117   static QString     toString( const QList<QVariant>& );
118
119 protected:
120   //! Types of postfix representation elements
121   typedef enum
122   {
123     Value, //!< Value (number, string, etc.)
124     Param, //!< Parameter
125     Open,  //!< Open bracket
126     Close, //!< Close bracket
127     Pre,   //!< Unary prefix operation
128     Post,  //!< Unary postfix operation
129     Binary //!< Binary operation
130   } PostfixItemType;
131
132   //! Postfix representation element
133   typedef struct
134   {
135     QVariant          myValue;
136     PostfixItemType   myType;
137   } PostfixItem;
138
139   typedef QList<PostfixItem>      Postfix;   //!< postfix representation
140   typedef QList<QtxEvalSet*>      SetList;   //!< list of operations
141   typedef QMap<QString, QVariant> ParamMap;  //!< parameter-to-value map
142
143 protected:
144   QString            dump( const Postfix& ) const;
145   virtual bool       prepare( const QString&, Postfix& );
146   virtual bool       setOperationTypes( Postfix& );
147   virtual bool       sort( const Postfix&, Postfix&, const QStringList&,
148                            const QStringList&, int f = -1, int l = -1 );
149
150   virtual bool       parse( const QString& );
151   virtual void       setError( const QtxEvalExpr::Error );
152
153   bool               calculate( const QString&, QVariant&, QVariant& );
154
155   static int         search( const QStringList&, const QString&,
156                              int offset, int& matchLen, int& listind );
157   static QString     note( const QString& str, int pos, int len );
158   static int         globalBrackets( const Postfix&, int, int );
159
160 private:
161   void               operationList( QStringList& ) const;
162   void               bracketsList( QStringList&, bool ) const;
163   bool               createValue( const QString&, QVariant& ) const;
164   int                priority( const QString&, bool isBin ) const;
165   QtxEvalExpr::Error isValid( const QString&,
166                               const QVariant::Type, const QVariant::Type ) const;
167   QtxEvalExpr::Error calculation( const QString&, QVariant&, QVariant& ) const;
168
169   bool               checkOperations() const;
170
171 private:
172   SetList            mySets;
173   QtxEvalExpr::Error myError;
174   ParamMap           myParams;
175   Postfix            myPostfix;
176   bool               myAutoDel;
177 };
178
179 class QTX_EXPORT QtxEvalSet
180 {
181 public:
182   QtxEvalSet();
183   virtual ~QtxEvalSet();
184
185   virtual QString            name() const = 0;
186
187   virtual void               operationList( QStringList& ) const = 0;
188
189   virtual void               bracketsList( QStringList&, bool open ) const = 0;
190
191   virtual bool               createValue( const QString&, QVariant& ) const;
192
193   virtual int                priority( const QString&, bool isBin ) const = 0;
194
195   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
196                                       const QVariant::Type ) const = 0;
197
198   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const = 0;
199 };
200
201 class QTX_EXPORT QtxEvalSetBase : public QtxEvalSet
202 {
203 public:
204   QtxEvalSetBase();
205   virtual ~QtxEvalSetBase();
206
207   virtual void               operationList( QStringList& ) const;
208   virtual void               bracketsList( QStringList&, bool open ) const;
209
210   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
211                                       const QVariant::Type ) const;
212 protected: 
213   typedef QList<QVariant::Type> ListOfTypes;
214
215   void                       addTypes( const ListOfTypes& );
216   void                       addOperations( const QStringList& );
217
218 private:
219   QStringList                myOpers;
220   ListOfTypes                myTypes;
221 };
222
223 class QTX_EXPORT QtxEvalSetArithmetic : public QtxEvalSetBase
224 {
225 public:
226   QtxEvalSetArithmetic();
227   virtual ~QtxEvalSetArithmetic();
228
229   virtual bool               createValue( const QString&, QVariant& ) const;
230   virtual int                priority( const QString&, bool isBin ) const;
231   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
232
233   static QString             Name();
234   virtual QString            name() const;
235 };
236
237 class QTX_EXPORT QtxEvalSetLogic : public QtxEvalSetBase
238 {
239 public:
240   QtxEvalSetLogic();
241   virtual ~QtxEvalSetLogic();
242
243   virtual bool               createValue( const QString&, QVariant& ) const;
244   virtual int                priority( const QString&, bool isBin ) const;
245   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
246
247   static QString             Name();
248   virtual QString            name() const;
249
250 private:
251   int                        intValue( const QVariant& v ) const;
252 };
253
254 class QTX_EXPORT QtxEvalSetMath : public QtxEvalSetBase
255 {
256 public:
257   QtxEvalSetMath();
258   virtual ~QtxEvalSetMath();
259
260   virtual bool               createValue( const QString&, QVariant& ) const;
261   virtual int                priority( const QString&, bool isBin ) const;
262   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
263
264   static QString             Name();
265   virtual QString            name() const;
266 };
267
268 class QTX_EXPORT QtxEvalSetString : public QtxEvalSetBase
269 {
270 public:
271   QtxEvalSetString();
272   virtual ~QtxEvalSetString();
273
274   virtual bool               createValue( const QString&, QVariant& ) const;
275   virtual int                priority( const QString&, bool isBin ) const;
276   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
277
278   static QString             Name();
279   virtual QString            name() const;
280 };
281
282 class QTX_EXPORT QtxEvalSetSets : public QtxEvalSetBase
283 {
284 public:
285   typedef QList<QVariant> ValueSet;
286
287 public:
288   QtxEvalSetSets();
289   virtual ~QtxEvalSetSets();
290
291   virtual void               bracketsList( QStringList&, bool open ) const;
292   virtual int                priority( const QString&, bool isBin ) const;
293   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
294                                       const QVariant::Type ) const;
295   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
296
297   static void add( ValueSet&, const QVariant& );
298   static void add( ValueSet&, const ValueSet& );
299   static void remove( ValueSet&, const QVariant& );
300   static void remove( ValueSet&, const ValueSet& );
301
302   static QString             Name();
303   virtual QString            name() const;
304 };
305
306 class QTX_EXPORT QtxEvalSetConst : public QtxEvalSet
307 {
308 public:
309   QtxEvalSetConst();
310   virtual ~QtxEvalSetConst();
311
312   static QString             Name();
313   virtual QString            name() const;
314
315   virtual bool               createValue( const QString&, QVariant& ) const;
316
317   virtual void               operationList( QStringList& ) const;
318   virtual void               bracketsList( QStringList&, bool open ) const;
319   virtual int                priority( const QString&, bool isBin ) const;
320   virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
321                                       const QVariant::Type ) const;
322   virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
323 };
324
325 #endif // QTXEVALEXPR_H