Isis 3 Programmer Reference
InlineCalculator.h
1 #ifndef InlineCalculator_h
2 #define InlineCalculator_h
3 
8 /* SPDX-License-Identifier: CC0-1.0 */
9 
10 // parent class
11 #include "Calculator.h"
12 
13 #include <QList>
14 #include <QMap>
15 #include <QString>
16 #include <QVector>
17 
18 class QVariant;
19 
20 namespace Isis {
21 
22  class CalculatorVariablePool;
23  class FxBinder;
24  class ParamaterFx;
25  class VoidFx;
26 
31  #define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))
32 
49  class InlineCalculator : public Calculator {
50 
51  public:
52 
54  InlineCalculator(const QString &equation);
55  virtual ~InlineCalculator();
56 
57  int size() const;
58 
59  QString equation() const;
60  bool compile(const QString &equation);
61 
64 
65  protected:
67  typedef FxBinder *FxTypePtr;
68 
69  // Implementations of local/new functions
70  void scalar(const QVariant &scalar);
71  void variable(const QVariant &variable);
72 
73  void floatModulus();
74  void radians();
75  void degrees();
76  void logicalOr();
77  void logicalAnd();
78  void pi();
79  void eConstant();
80 
81  virtual QString toPostfix(const QString &equation) const;
82  bool isScalar(const QString &scalar);
83  bool isVariable(const QString &str);
84 
85  // Derived classes can be added with these methods for customization.
86  // See FxBinder().
87  bool fxExists(const QString &fxname) const;
89 
90  virtual bool orphanTokenHandler(const QString &token);
91 
92  private:
97 
98  void pushVariables(CalculatorVariablePool *variablePool);
100  void popVariables();
101 
102  FxTypePtr find(const QString &fxname);
103  void initialize();
104  void destruct();
105 
108  QString m_equation;
110 
111  };
112 
113 
122  public:
125 
126  virtual bool exists(const QString &variable) const;
127  virtual QVector<double> value(const QString &variable,
128  const int &index = 0) const;
129  virtual void add(const QString &key, QVector<double> &values);
130  };
131 
132 
140  class FxBinder {
141  public:
142  FxBinder(const QString &name);
143  virtual ~FxBinder();
144 
145  QString name() const;
146  void execute();
147  void operator()();
148 
153  virtual void dispatch() = 0;
154  virtual QVariant args();
155 
156  private:
157  QString m_name;
158  };
159 
160 
169  class InlineVoidFx : public FxBinder {
170  public:
172  typedef void (InlineCalculator::*calcOp)();
173 
174  InlineVoidFx(const QString &name, calcOp function,
175  InlineCalculator *calculator);
176  virtual ~InlineVoidFx();
177  void dispatch();
178 
179  private:
182  };
183 
184 
193  class ParameterFx : public FxBinder {
194  public:
196  typedef void (InlineCalculator::*calcOp)(const QVariant &arg);
197 
198  ParameterFx(const QString &name, calcOp function,
199  InlineCalculator *calculator);
200  virtual ~ParameterFx();
201  void dispatch();
202 
203  private:
206  };
207 
208 
217  class VoidFx : public FxBinder {
218  public:
220  typedef void (Calculator::*calcOp)();
221 
222  VoidFx(const QString &name, calcOp function,
223  InlineCalculator *calculator);
224  virtual ~VoidFx();
225  void dispatch();
226 
227  private:
230  };
231 
232  // this is a global method, outside of all classes.
233  double floatModulusOperator(double a, double b);
234 
235 } // Namespace Isis
236 
237 #endif
Isis::FxBinder::args
virtual QVariant args()
Accesses the arguments for this function.
Definition: InlineCalculator.cpp:768
Isis::InlineCalculator::m_fxPool
FxPoolType m_fxPool
The map between function names and equation lists.
Definition: InlineCalculator.h:107
Isis::FxBinder::m_name
QString m_name
Name of function.
Definition: InlineCalculator.h:157
Isis::InlineCalculator::find
FxTypePtr find(const QString &fxname)
Gets a pointer to the function from the current pool that corresponds to the given function name.
Definition: InlineCalculator.cpp:568
Isis::VoidFx::m_calc
InlineCalculator * m_calc
The Calculator used to evaluate this function.
Definition: InlineCalculator.h:229
Isis::ParameterFx::m_func
calcOp m_func
The InlineCalculator operator that takes parameters.
Definition: InlineCalculator.h:204
Isis::FxBinder::~FxBinder
virtual ~FxBinder()
Destroys the FxBinder object.
Definition: InlineCalculator.cpp:730
Isis::InlineCalculator::m_equation
QString m_equation
The equation to be evaluated.
Definition: InlineCalculator.h:108
Isis::InlineCalculator::initialize
void initialize()
Adds the recognized functions to the function pool.
Definition: InlineCalculator.cpp:578
QList
This is free and unencumbered software released into the public domain.
Definition: BoxcarCachingAlgorithm.h:13
Isis::InlineCalculator::destruct
void destruct()
Discard of all the function pool and class resources.
Definition: InlineCalculator.cpp:645
Isis::FxBinder::FxBinder
FxBinder(const QString &name)
Constructs a function binder given a name.
Definition: InlineCalculator.cpp:723
Isis::ParameterFx::calcOp
void(InlineCalculator::* calcOp)(const QVariant &arg)
Defines an InlineCalculator function that takes arguments.
Definition: InlineCalculator.h:196
Isis::InlineCalculator::popVariables
void popVariables()
Removes the last variable pool in the current variable pool list.
Definition: InlineCalculator.cpp:549
Isis::ParameterFx::~ParameterFx
virtual ~ParameterFx()
Destroys the ParameterFx object.
Definition: InlineCalculator.cpp:825
Isis::InlineVoidFx::calcOp
void(InlineCalculator::* calcOp)()
Defines an InlineCalculator function that takes no arguments.
Definition: InlineCalculator.h:172
Isis::Calculator
Calculator for arrays.
Definition: Calculator.h:55
Isis::VoidFx::calcOp
void(Calculator::* calcOp)()
Defines a Calculator function that takes no arguments.
Definition: InlineCalculator.h:220
Isis::InlineVoidFx::m_func
calcOp m_func
The InlineCalculator operator that takes no parameters.
Definition: InlineCalculator.h:180
Isis::InlineCalculator::logicalOr
void logicalOr()
Pops the top two vectors off the current stack and performs a logical or on each pair.
Definition: InlineCalculator.cpp:393
Isis::InlineCalculator::~InlineCalculator
virtual ~InlineCalculator()
Destroys the InlineCalculator object.
Definition: InlineCalculator.cpp:61
Isis::InlineCalculator::equation
QString equation() const
Accesses the string representation of the current equation, in postfix format.
Definition: InlineCalculator.cpp:85
Isis::InlineCalculator::variable
void variable(const QVariant &variable)
Pushes the given value onto the stack as a variable.
Definition: InlineCalculator.cpp:309
Isis::InlineCalculator::orphanTokenHandler
virtual bool orphanTokenHandler(const QString &token)
Default token handler if it is undefined during parsing/compilation.
Definition: InlineCalculator.cpp:512
Isis::InlineCalculator::eConstant
void eConstant()
Pushes the Euler constant (e) onto the current stack.
Definition: InlineCalculator.cpp:446
Isis::ParameterFx
This class is used to bind function names with corresponding Calculator functions that take a paramet...
Definition: InlineCalculator.h:193
Isis::InlineCalculator::FxTypePtr
FxBinder * FxTypePtr
Defintion for a FxTypePtr, a pointer to a function binder (FxBinder)
Definition: InlineCalculator.h:67
Isis::ParameterFx::ParameterFx
ParameterFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs a Parameter function from the given name (containing the appropriate parameters),...
Definition: InlineCalculator.cpp:815
Isis::CalculatorVariablePool::~CalculatorVariablePool
~CalculatorVariablePool()
Destroys the CalculatorVariablePool object.
Definition: InlineCalculator.cpp:666
Isis::FxBinder::dispatch
virtual void dispatch()=0
This method defines how to execute this function.
Isis::InlineCalculator::floatModulus
void floatModulus()
Pops the top two vectors off the current stack and performs the floatModulusOperator() on the corresp...
Definition: InlineCalculator.cpp:345
Isis::InlineCalculator::radians
void radians()
Pops the top vector off the current stack and converts from degrees to radians.
Definition: InlineCalculator.cpp:360
Isis::floatModulusOperator
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:335
Isis::InlineCalculator::pushVariables
void pushVariables(CalculatorVariablePool *variablePool)
Push the given variable pool onto the current variable pool list.
Definition: InlineCalculator.cpp:523
Isis::InlineVoidFx::~InlineVoidFx
virtual ~InlineVoidFx()
Destroys the InlineVoidFx object.
Definition: InlineCalculator.cpp:791
Isis::InlineCalculator::evaluate
QVector< double > evaluate()
Evaluate compiled equation with existing variable pool.
Definition: InlineCalculator.cpp:218
Isis::CalculatorVariablePool::CalculatorVariablePool
CalculatorVariablePool()
Constructs a CalculatorVariablePool object.
Definition: InlineCalculator.cpp:659
Isis::InlineVoidFx::dispatch
void dispatch()
Calls the function corresponding to this object using its stored InlineCalculator and InlineCalculato...
Definition: InlineCalculator.cpp:799
Isis::InlineCalculator::FxEqList
QVector< FxTypePtr > FxEqList
Definition for a FxEqList, a vector of function type pointers.
Definition: InlineCalculator.h:94
Isis::InlineCalculator::m_variablePoolList
QList< CalculatorVariablePool * > m_variablePoolList
The list of variable pool pointers.
Definition: InlineCalculator.h:109
Isis::VoidFx::m_func
calcOp m_func
The Calculator operator that takes no parameters.
Definition: InlineCalculator.h:228
Isis::InlineCalculator
Provides a calculator for inline equations.
Definition: InlineCalculator.h:49
Isis::InlineCalculator::size
int size() const
Accesses the number of functions, operators, variables, and scalars to be executed.
Definition: InlineCalculator.cpp:73
Isis::CalculatorVariablePool::add
virtual void add(const QString &key, QVector< double > &values)
Add a parameter to the variable pool.
Definition: InlineCalculator.cpp:711
Isis::InlineCalculator::degrees
void degrees()
Pops the top vector off the current stack and converts from radians to degrees.
Definition: InlineCalculator.cpp:375
Isis::CalculatorVariablePool::value
virtual QVector< double > value(const QString &variable, const int &index=0) const
Return vector of doubles for Calculator functions.
Definition: InlineCalculator.cpp:691
Isis::VoidFx::dispatch
void dispatch()
Calls the function corresponding to this object using its stored Calculator and Calculator operator.
Definition: InlineCalculator.cpp:865
Isis::InlineCalculator::isVariable
bool isVariable(const QString &str)
Determines whether the given string is a variable.
Definition: InlineCalculator.cpp:275
Isis::InlineCalculator::fxExists
bool fxExists(const QString &fxname) const
Determines whether the given function name exists in the current function pool.
Definition: InlineCalculator.cpp:461
Isis::InlineCalculator::m_functions
FxEqList m_functions
The list of pointers to function equations for the calculator.
Definition: InlineCalculator.h:106
Isis::CalculatorVariablePool
This is a simple class to model a Calculator Variable Pool.
Definition: InlineCalculator.h:121
Isis::ParameterFx::m_calc
InlineCalculator * m_calc
The InlineCalculator used to evaluate this function.
Definition: InlineCalculator.h:205
Isis::InlineVoidFx::InlineVoidFx
InlineVoidFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs an InlineVoid function from the given name, InlineCalculator operator, and InlineCalculato...
Definition: InlineCalculator.cpp:781
Isis::InlineCalculator::variables
CalculatorVariablePool * variables()
Accesses the last variable pool in the current pool list.
Definition: InlineCalculator.cpp:536
Isis::InlineCalculator::addFunction
FxTypePtr addFunction(FxTypePtr function)
Adds a function to the function pool.
Definition: InlineCalculator.cpp:478
Isis::InlineVoidFx
This class is used to bind function names with corresponding InlineCalculator functions that do not t...
Definition: InlineCalculator.h:169
Isis::ParameterFx::dispatch
void dispatch()
Calls the function corresponding to this object using its stored InlineCalculator,...
Definition: InlineCalculator.cpp:834
Isis::CalculatorVariablePool::exists
virtual bool exists(const QString &variable) const
Returns true so the real error can be reported.
Definition: InlineCalculator.cpp:676
Isis::InlineCalculator::isScalar
bool isScalar(const QString &scalar)
Determines whether the given string contains a scalar value (i.e.
Definition: InlineCalculator.cpp:255
QMap< QString, FxTypePtr >
Isis::InlineCalculator::toPostfix
virtual QString toPostfix(const QString &equation) const
Converts the given string from infix to postfix format.
Definition: InlineCalculator.cpp:241
Isis::VoidFx::~VoidFx
virtual ~VoidFx()
Destroys the VoidFx object.
Definition: InlineCalculator.cpp:857
Isis::InlineVoidFx::m_calc
InlineCalculator * m_calc
The InlineCalculator used to evaluate this function.
Definition: InlineCalculator.h:181
Isis::FxBinder::execute
void execute()
Executes the function.
Definition: InlineCalculator.cpp:748
Isis::FxBinder::operator()
void operator()()
Executes the function.
Definition: InlineCalculator.cpp:757
QVector< double >
Isis::VoidFx
This class is used to bind function names with corresponding Calculator functions that do not take pa...
Definition: InlineCalculator.h:217
Isis::InlineCalculator::InlineCalculator
InlineCalculator()
Constructs an InlineCalculator object by initializing the operator lookup list.
Definition: InlineCalculator.cpp:41
Isis::InlineCalculator::compile
bool compile(const QString &equation)
Compiles the given equation for evaluation.
Definition: InlineCalculator.cpp:106
Isis::FxBinder::name
QString name() const
The name assigned to this function binder.
Definition: InlineCalculator.cpp:739
Isis::VoidFx::VoidFx
VoidFx(const QString &name, calcOp function, InlineCalculator *calculator)
Constructs a Void function from the given name, Calculator operator, and Calculator.
Definition: InlineCalculator.cpp:847
Isis::InlineCalculator::pi
void pi()
Pushes the PI constant onto the current stack.
Definition: InlineCalculator.cpp:437
Isis::InlineCalculator::FxPoolType
QMap< QString, FxTypePtr > FxPoolType
Definition for a FxPoolType, a map between a string and function type pointer.
Definition: InlineCalculator.h:96
Isis::InlineCalculator::logicalAnd
void logicalAnd()
Pops the top two vectors off the current stack and performs a logical and on each pair.
Definition: InlineCalculator.cpp:417
Isis
This is free and unencumbered software released into the public domain.
Definition: Apollo.h:16
Isis::InlineCalculator::scalar
void scalar(const QVariant &scalar)
Pushes the given value onto the stack as a scalar.
Definition: InlineCalculator.cpp:294
Isis::FxBinder
This is the parent class to the various function classes.
Definition: InlineCalculator.h:140