Isis 3.0
Home
InlineCalculator.h
Go to the documentation of this file.
1 #ifndef InlineCalculator_h
2 #define InlineCalculator_h
3 
28 // parent class
29 #include "Calculator.h"
30 
31 #include <QList>
32 #include <QMap>
33 #include <QString>
34 #include <QVector>
35 
36 class QVariant;
37 
38 namespace Isis {
39 
40  class CalculatorVariablePool;
41  class FxBinder;
42  class ParamaterFx;
43  class VoidFx;
44 
49  #define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))
50 
66  class InlineCalculator : public Calculator {
67 
68  public:
69 
71  InlineCalculator(const QString &equation);
72  virtual ~InlineCalculator();
73 
74  int size() const;
75 
76  QString equation() const;
77  bool compile(const QString &equation);
78 
81 
82  protected:
84  typedef FxBinder *FxTypePtr;
85 
86  // Implementations of local/new functions
87  void scalar(const QVariant &scalar);
88  void variable(const QVariant &variable);
89 
90  void floatModulus();
91  void radians();
92  void degrees();
93  void pi();
94  void eConstant();
95 
96  virtual QString toPostfix(const QString &equation) const;
97  bool isScalar(const QString &scalar);
98  bool isVariable(const QString &str);
99 
100  // Derived classes can be added with these methods for customization.
101  // See FxBinder().
102  bool fxExists(const QString &fxname) const;
103  FxTypePtr addFunction(FxTypePtr function);
104 
105  virtual bool orphanTokenHandler(const QString &token);
106 
107  private:
112 
113  void pushVariables(CalculatorVariablePool *variablePool);
114  CalculatorVariablePool *variables();
115  void popVariables();
116 
117  FxTypePtr find(const QString &fxname);
118  void initialize();
119  void destruct();
120 
121  FxEqList m_functions;
122  FxPoolType m_fxPool;
123  QString m_equation;
124  QList<CalculatorVariablePool *> m_variablePoolList;
125 
126  };
127 
128 
137  public:
140 
141  virtual bool exists(const QString &variable) const;
142  virtual QVector<double> value(const QString &variable,
143  const int &index = 0) const;
144  virtual void add(const QString &key, QVector<double> &values);
145  };
146 
147 
155  class FxBinder {
156  public:
157  FxBinder(const QString &name);
158  virtual ~FxBinder();
159 
160  QString name() const;
161  void execute();
162  void operator()();
163 
168  virtual void dispatch() = 0;
169  virtual QVariant args();
170 
171  private:
172  QString m_name;
173  };
174 
175 
184  class InlineVoidFx : public FxBinder {
185  public:
187  typedef void (InlineCalculator::*calcOp)();
188 
189  InlineVoidFx(const QString &name, calcOp function,
190  InlineCalculator *calculator);
191  virtual ~InlineVoidFx();
192  void dispatch();
193 
194  private:
195  calcOp m_func;
196  InlineCalculator *m_calc;
197  };
198 
199 
208  class ParameterFx : public FxBinder {
209  public:
211  typedef void (InlineCalculator::*calcOp)(const QVariant &arg);
212 
213  ParameterFx(const QString &name, calcOp function,
214  InlineCalculator *calculator);
215  virtual ~ParameterFx();
216  void dispatch();
217 
218  private:
219  calcOp m_func;
220  InlineCalculator *m_calc;
221  };
222 
223 
232  class VoidFx : public FxBinder {
233  public:
235  typedef void (Calculator::*calcOp)();
236 
237  VoidFx(const QString &name, calcOp function,
238  InlineCalculator *calculator);
239  virtual ~VoidFx();
240  void dispatch();
241 
242  private:
243  calcOp m_func;
244  InlineCalculator *m_calc;
245  };
246 
247  // this is a global method, outside of all classes.
248  double floatModulusOperator(double a, double b);
249 
250 } // Namespace Isis
251 
252 #endif
virtual QString toPostfix(const QString &equation) const
Converts the given string from infix to postfix format.
Definition: InlineCalculator.cpp:258
void floatModulus()
Pops the top two vectors off the current stack and performs the floatModulusOperator() on the corresp...
Definition: InlineCalculator.cpp:362
CalculatorVariablePool()
Constructs a CalculatorVariablePool object.
Definition: InlineCalculator.cpp:626
void variable(const QVariant &variable)
Pushes the given value onto the stack as a variable.
Definition: InlineCalculator.cpp:326
virtual void add(const QString &key, QVector< double > &values)
Add a parameter to the variable pool.
Definition: InlineCalculator.cpp:678
void dispatch()
Calls the function corresponding to this object using its stored InlineCalculator, InlineCalculator operator, and arguments.
Definition: InlineCalculator.cpp:801
This is a simple class to model a Calculator Variable Pool.
Definition: InlineCalculator.h:136
virtual ~FxBinder()
Destroys the FxBinder object.
Definition: InlineCalculator.cpp:697
FxBinder(const QString &name)
Constructs a function binder given a name.
Definition: InlineCalculator.cpp:690
void degrees()
Pops the top vector off the current stack and converts from radians to degrees.
Definition: InlineCalculator.cpp:392
void(InlineCalculator::* calcOp)()
Defines an InlineCalculator function that takes no arguments.
Definition: InlineCalculator.h:187
virtual ~InlineCalculator()
Destroys the InlineCalculator object.
Definition: InlineCalculator.cpp:78
bool fxExists(const QString &fxname) const
Determines whether the given function name exists in the current function pool.
Definition: InlineCalculator.cpp:430
Provides a calculator for inline equations.
Definition: InlineCalculator.h:66
virtual bool orphanTokenHandler(const QString &token)
Default token handler if it is undefined during parsing/compilation.
Definition: InlineCalculator.cpp:481
FxBinder * FxTypePtr
Defintion for a FxTypePtr, a pointer to a function binder (FxBinder)
Definition: InlineCalculator.h:84
int size() const
Accesses the number of functions, operators, variables, and scalars to be executed.
Definition: InlineCalculator.cpp:90
bool isScalar(const QString &scalar)
Determines whether the given string contains a scalar value (i.e.
Definition: InlineCalculator.cpp:272
InlineVoidFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs an InlineVoid function from the given name, InlineCalculator operator, and InlineCalculato...
Definition: InlineCalculator.cpp:748
void(Calculator::* calcOp)()
Defines a Calculator function that takes no arguments.
Definition: InlineCalculator.h:235
virtual ~InlineVoidFx()
Destroys the InlineVoidFx object.
Definition: InlineCalculator.cpp:758
QVector< double > evaluate()
Evaluate compiled equation with existing variable pool.
Definition: InlineCalculator.cpp:235
bool compile(const QString &equation)
Compiles the given equation for evaluation.
Definition: InlineCalculator.cpp:123
double floatModulusOperator(double a, double b)
Determines the remainder of the quotient a/b whose sign is the same as that of a. ...
Definition: InlineCalculator.cpp:352
bool isVariable(const QString &str)
Determines whether the given string is a variable.
Definition: InlineCalculator.cpp:292
QString equation() const
Accesses the string representation of the current equation, in postfix format.
Definition: InlineCalculator.cpp:102
virtual QVector< double > value(const QString &variable, const int &index=0) const
Return vector of doubles for Calculator functions.
Definition: InlineCalculator.cpp:658
This is the parent class to the various function classes.
Definition: InlineCalculator.h:155
virtual ~ParameterFx()
Destroys the ParameterFx object.
Definition: InlineCalculator.cpp:792
This class is used to bind function names with corresponding Calculator functions that do not take pa...
Definition: InlineCalculator.h:232
void operator()()
Executes the function.
Definition: InlineCalculator.cpp:724
void pi()
Pushes the PI constant onto the current stack.
Definition: InlineCalculator.cpp:406
void radians()
Pops the top vector off the current stack and converts from degrees to radians.
Definition: InlineCalculator.cpp:377
ParameterFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs a Parameter function from the given name (containing the appropriate parameters), InlineCalculator operator, and InlineCalculator.
Definition: InlineCalculator.cpp:782
QString name() const
The name assigned to this function binder.
Definition: InlineCalculator.cpp:706
This class is used to bind function names with corresponding InlineCalculator functions that do not t...
Definition: InlineCalculator.h:184
virtual bool exists(const QString &variable) const
Returns true so the real error can be reported.
Definition: InlineCalculator.cpp:643
virtual QVariant args()
Accesses the arguments for this function.
Definition: InlineCalculator.cpp:735
virtual ~VoidFx()
Destroys the VoidFx object.
Definition: InlineCalculator.cpp:824
void execute()
Executes the function.
Definition: InlineCalculator.cpp:715
void dispatch()
Calls the function corresponding to this object using its stored Calculator and Calculator operator...
Definition: InlineCalculator.cpp:832
VoidFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs a Void function from the given name, Calculator operator, and Calculator.
Definition: InlineCalculator.cpp:814
Definition: BoxcarCachingAlgorithm.h:29
InlineCalculator()
Constructs an InlineCalculator object by initializing the operator lookup list.
Definition: InlineCalculator.cpp:58
void eConstant()
Pushes the Euler constant (e) onto the current stack.
Definition: InlineCalculator.cpp:415
virtual void dispatch()=0
This method defines how to execute this function.
FxTypePtr addFunction(FxTypePtr function)
Adds a function to the function pool.
Definition: InlineCalculator.cpp:447
~CalculatorVariablePool()
Destroys the CalculatorVariablePool object.
Definition: InlineCalculator.cpp:633
void scalar(const QVariant &scalar)
Pushes the given value onto the stack as a scalar.
Definition: InlineCalculator.cpp:311
void dispatch()
Calls the function corresponding to this object using its stored InlineCalculator and InlineCalculato...
Definition: InlineCalculator.cpp:766
void(InlineCalculator::* calcOp)(const QVariant &arg)
Defines an InlineCalculator function that takes arguments.
Definition: InlineCalculator.h:211
This class is used to bind function names with corresponding Calculator functions that take a paramet...
Definition: InlineCalculator.h:208
Calculator for arrays.
Definition: Calculator.h:66