Version: 9.12.0
QtxEvalExpr.h
Go to the documentation of this file.
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 
39 {
40 public:
42  typedef enum
43  {
44  OK,
54  ExcessData
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;
84 };
85 
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:
121  typedef enum
122  {
127  Pre,
129  Binary
130  } PostfixItemType;
131 
133  typedef struct
134  {
135  QVariant myValue;
137  } PostfixItem;
138 
141  typedef QMap<QString, QVariant> ParamMap;
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:
176  bool myAutoDel;
177 };
178 
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 
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:
214 
215  void addTypes( const ListOfTypes& );
216  void addOperations( const QStringList& );
217 
218 private:
219  QStringList myOpers;
221 };
222 
224 {
225 public:
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 
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 
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 
269 {
270 public:
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 
283 {
284 public:
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 
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
#define QTX_EXPORT
Definition: Qtx.h:36
bool isValid(const QPolygon *thePoints, const QPoint &theCurrent)
Definition: SVTK_InteractorStyle.cxx:1746
String expression evaluator.
Definition: QtxEvalExpr.h:39
QtxEvalParser * myParser
Definition: QtxEvalExpr.h:83
QString myExpr
Definition: QtxEvalExpr.h:82
Error
Parsing error type.
Definition: QtxEvalExpr.h:43
@ OperandsNotMatch
Types of arguments are invalid for this operation.
Definition: QtxEvalExpr.h:45
@ StackUnderflow
There are no arguments in the stack for the operation.
Definition: QtxEvalExpr.h:53
@ InvalidToken
Invalid token (neither operation, nor parameter of value)
Definition: QtxEvalExpr.h:49
@ InvalidResult
Operation cannot find result (for example, division by zero)
Definition: QtxEvalExpr.h:46
@ CloseExpected
Closing bracket is expected.
Definition: QtxEvalExpr.h:50
@ ExcessClose
Extra closing bracket is found.
Definition: QtxEvalExpr.h:51
@ BracketsNotMatch
Opening and closing brackets are of different type, e.g. [)
Definition: QtxEvalExpr.h:52
@ OK
No errors found.
Definition: QtxEvalExpr.h:44
@ OperationsNull
Internal operations pointer of parser is null.
Definition: QtxEvalExpr.h:48
@ InvalidOperation
Unknown operation.
Definition: QtxEvalExpr.h:47
Expression parser.
Definition: QtxEvalExpr.h:87
QtxEvalExpr::Error myError
Definition: QtxEvalExpr.h:173
ParamMap myParams
Definition: QtxEvalExpr.h:174
QList< PostfixItem > Postfix
postfix representation
Definition: QtxEvalExpr.h:139
QList< QtxEvalSet * > SetList
list of operations
Definition: QtxEvalExpr.h:140
PostfixItemType
Types of postfix representation elements.
Definition: QtxEvalExpr.h:122
@ Value
Value (number, string, etc.)
Definition: QtxEvalExpr.h:123
@ Param
Parameter.
Definition: QtxEvalExpr.h:124
@ Close
Close bracket.
Definition: QtxEvalExpr.h:126
@ Post
Unary postfix operation.
Definition: QtxEvalExpr.h:128
@ Pre
Unary prefix operation.
Definition: QtxEvalExpr.h:127
@ Open
Open bracket.
Definition: QtxEvalExpr.h:125
Postfix myPostfix
Definition: QtxEvalExpr.h:175
bool myAutoDel
Definition: QtxEvalExpr.h:176
SetList mySets
Definition: QtxEvalExpr.h:172
QMap< QString, QVariant > ParamMap
parameter-to-value map
Definition: QtxEvalExpr.h:141
Provides set of arithmetical operations for the parser.
Definition: QtxEvalExpr.h:224
Generic class. Provides functionality for standard operations sets.
Definition: QtxEvalExpr.h:202
ListOfTypes myTypes
Definition: QtxEvalExpr.h:220
QStringList myOpers
Definition: QtxEvalExpr.h:219
QList< QVariant::Type > ListOfTypes
Definition: QtxEvalExpr.h:213
Provides different standard constants.
Definition: QtxEvalExpr.h:307
Provides set of logical operations for the parser.
Definition: QtxEvalExpr.h:238
Provides a set of more complex operations (mathematical functions) for the parser (sqrt,...
Definition: QtxEvalExpr.h:255
Provides set of operations with sequences for the parser.
Definition: QtxEvalExpr.h:283
QList< QVariant > ValueSet
Definition: QtxEvalExpr.h:285
Provides set of string operations for the parser.
Definition: QtxEvalExpr.h:269
Generic class for all the operations sets used in expressions.
Definition: QtxEvalExpr.h:180
virtual QString name() const =0
Get unique operations set name.
virtual QtxEvalExpr::Error isValid(const QString &, const QVariant::Type, const QVariant::Type) const =0
Check operation validity.
virtual void operationList(QStringList &) const =0
Get the list of possible operations.
virtual QtxEvalExpr::Error calculate(const QString &, QVariant &, QVariant &) const =0
Calculate the operation.
virtual void bracketsList(QStringList &, bool open) const =0
Get list of brackets.
virtual int priority(const QString &, bool isBin) const =0
Get the operation priority.
int Type
Definition: VTKViewer_Actor.h:62
Postfix representation element.
Definition: QtxEvalExpr.h:134
QVariant myValue
Definition: QtxEvalExpr.h:135
PostfixItemType myType
Definition: QtxEvalExpr.h:136