Isis 3 Programmer Reference
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 
67  class InlineCalculator : public Calculator {
68 
69  public:
70 
72  InlineCalculator(const QString &equation);
73  virtual ~InlineCalculator();
74 
75  int size() const;
76 
77  QString equation() const;
78  bool compile(const QString &equation);
79 
82 
83  protected:
85  typedef FxBinder *FxTypePtr;
86 
87  // Implementations of local/new functions
88  void scalar(const QVariant &scalar);
89  void variable(const QVariant &variable);
90 
91  void floatModulus();
92  void radians();
93  void degrees();
94  void logicalOr();
95  void logicalAnd();
96  void pi();
97  void eConstant();
98 
99  virtual QString toPostfix(const QString &equation) const;
100  bool isScalar(const QString &scalar);
101  bool isVariable(const QString &str);
102 
103  // Derived classes can be added with these methods for customization.
104  // See FxBinder().
105  bool fxExists(const QString &fxname) const;
106  FxTypePtr addFunction(FxTypePtr function);
107 
108  virtual bool orphanTokenHandler(const QString &token);
109 
110  private:
115 
116  void pushVariables(CalculatorVariablePool *variablePool);
118  void popVariables();
119 
120  FxTypePtr find(const QString &fxname);
121  void initialize();
122  void destruct();
123 
126  QString m_equation;
128 
129  };
130 
131 
140  public:
143 
144  virtual bool exists(const QString &variable) const;
145  virtual QVector<double> value(const QString &variable,
146  const int &index = 0) const;
147  virtual void add(const QString &key, QVector<double> &values);
148  };
149 
150 
158  class FxBinder {
159  public:
160  FxBinder(const QString &name);
161  virtual ~FxBinder();
162 
163  QString name() const;
164  void execute();
165  void operator()();
166 
171  virtual void dispatch() = 0;
172  virtual QVariant args();
173 
174  private:
175  QString m_name;
176  };
177 
178 
187  class InlineVoidFx : public FxBinder {
188  public:
190  typedef void (InlineCalculator::*calcOp)();
191 
192  InlineVoidFx(const QString &name, calcOp function,
193  InlineCalculator *calculator);
194  virtual ~InlineVoidFx();
195  void dispatch();
196 
197  private:
200  };
201 
202 
211  class ParameterFx : public FxBinder {
212  public:
214  typedef void (InlineCalculator::*calcOp)(const QVariant &arg);
215 
216  ParameterFx(const QString &name, calcOp function,
217  InlineCalculator *calculator);
218  virtual ~ParameterFx();
219  void dispatch();
220 
221  private:
224  };
225 
226 
235  class VoidFx : public FxBinder {
236  public:
238  typedef void (Calculator::*calcOp)();
239 
240  VoidFx(const QString &name, calcOp function,
241  InlineCalculator *calculator);
242  virtual ~VoidFx();
243  void dispatch();
244 
245  private:
248  };
249 
250  // this is a global method, outside of all classes.
251  double floatModulusOperator(double a, double b);
252 
253 } // Namespace Isis
254 
255 #endif
QList< CalculatorVariablePool * > m_variablePoolList
The list of variable pool pointers.
bool fxExists(const QString &fxname) const
Determines whether the given function name exists in the current function pool.
void floatModulus()
Pops the top two vectors off the current stack and performs the floatModulusOperator() on the corresp...
virtual QVector< double > value(const QString &variable, const int &index=0) const
Return vector of doubles for Calculator functions.
CalculatorVariablePool()
Constructs a CalculatorVariablePool object.
void variable(const QVariant &variable)
Pushes the given value onto the stack as a variable.
void(InlineCalculator::* calcOp)()
Defines an InlineCalculator function that takes no arguments.
virtual void add(const QString &key, QVector< double > &values)
Add a parameter to the variable pool.
void(Calculator::* calcOp)()
Defines a Calculator function that takes no arguments.
void logicalOr()
Pops the top two vectors off the current stack and performs a logical or on each pair.
QString m_name
Name of function.
void dispatch()
Calls the function corresponding to this object using its stored InlineCalculator, InlineCalculator operator, and arguments.
This is a simple class to model a Calculator Variable Pool.
virtual ~FxBinder()
Destroys the FxBinder object.
FxBinder(const QString &name)
Constructs a function binder given a name.
void degrees()
Pops the top vector off the current stack and converts from radians to degrees.
int size() const
Accesses the number of functions, operators, variables, and scalars to be executed.
void logicalAnd()
Pops the top two vectors off the current stack and performs a logical and on each pair...
InlineCalculator * m_calc
The Calculator used to evaluate this function.
virtual ~InlineCalculator()
Destroys the InlineCalculator object.
Provides a calculator for inline equations.
virtual bool exists(const QString &variable) const
Returns true so the real error can be reported.
virtual bool orphanTokenHandler(const QString &token)
Default token handler if it is undefined during parsing/compilation.
FxPoolType m_fxPool
The map between function names and equation lists.
FxBinder * FxTypePtr
Defintion for a FxTypePtr, a pointer to a function binder (FxBinder)
bool isScalar(const QString &scalar)
Determines whether the given string contains a scalar value (i.e.
InlineVoidFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs an InlineVoid function from the given name, InlineCalculator operator, and InlineCalculato...
InlineCalculator * m_calc
The InlineCalculator used to evaluate this function.
virtual ~InlineVoidFx()
Destroys the InlineVoidFx object.
QVector< double > evaluate()
Evaluate compiled equation with existing variable pool.
bool compile(const QString &equation)
Compiles the given equation for evaluation.
QVector< FxTypePtr > FxEqList
Definition for a FxEqList, a vector of function type pointers.
QMap< QString, FxTypePtr > FxPoolType
Definition for a FxPoolType, a map between a string and function type pointer.
double floatModulusOperator(double a, double b)
Determines the remainder of the quotient a/b whose sign is the same as that of a. ...
QString equation() const
Accesses the string representation of the current equation, in postfix format.
QString name() const
The name assigned to this function binder.
virtual QString toPostfix(const QString &equation) const
Converts the given string from infix to postfix format.
InlineCalculator * m_calc
The InlineCalculator used to evaluate this function.
bool isVariable(const QString &str)
Determines whether the given string is a variable.
void popVariables()
Removes the last variable pool in the current variable pool list.
void(InlineCalculator::* calcOp)(const QVariant &arg)
Defines an InlineCalculator function that takes arguments.
This is the parent class to the various function classes.
FxEqList m_functions
The list of pointers to function equations for the calculator.
virtual ~ParameterFx()
Destroys the ParameterFx object.
This class is used to bind function names with corresponding Calculator functions that do not take pa...
calcOp m_func
The InlineCalculator operator that takes parameters.
void destruct()
Discard of all the function pool and class resources.
void operator()()
Executes the function.
void initialize()
Adds the recognized functions to the function pool.
calcOp m_func
The Calculator operator that takes no parameters.
void pushVariables(CalculatorVariablePool *variablePool)
Push the given variable pool onto the current variable pool list.
void pi()
Pushes the PI constant onto the current stack.
void radians()
Pops the top vector off the current stack and converts from degrees to radians.
FxTypePtr find(const QString &fxname)
Gets a pointer to the function from the current pool that corresponds to the given function name...
ParameterFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs a Parameter function from the given name (containing the appropriate parameters), InlineCalculator operator, and InlineCalculator.
calcOp m_func
The InlineCalculator operator that takes no parameters.
This class is used to bind function names with corresponding InlineCalculator functions that do not t...
virtual QVariant args()
Accesses the arguments for this function.
virtual ~VoidFx()
Destroys the VoidFx object.
void execute()
Executes the function.
void dispatch()
Calls the function corresponding to this object using its stored Calculator and Calculator operator...
VoidFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs a Void function from the given name, Calculator operator, and Calculator.
Namespace for ISIS/Bullet specific routines.
Definition: Apollo.h:31
InlineCalculator()
Constructs an InlineCalculator object by initializing the operator lookup list.
QString m_equation
The equation to be evaluated.
void eConstant()
Pushes the Euler constant (e) onto the current stack.
virtual void dispatch()=0
This method defines how to execute this function.
FxTypePtr addFunction(FxTypePtr function)
Adds a function to the function pool.
~CalculatorVariablePool()
Destroys the CalculatorVariablePool object.
void scalar(const QVariant &scalar)
Pushes the given value onto the stack as a scalar.
void dispatch()
Calls the function corresponding to this object using its stored InlineCalculator and InlineCalculato...
This class is used to bind function names with corresponding Calculator functions that take a paramet...
Calculator for arrays.
Definition: Calculator.h:70
CalculatorVariablePool * variables()
Accesses the last variable pool in the current pool list.