00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #ifndef _RPN_HANDLER_H_
00013 #define _RPN_HANDLER_H_
00014
00015 #if defined(__GNUG__) && !defined(__APPLE__)
00016 #pragma interface "rpn_handler.h"
00017 #endif
00018
00019 class VirtualBoardChannel;
00023 typedef enum
00024 {
00025 RPN_OPERATOR_ADD= 0,
00026 RPN_OPERATOR_SUB,
00027 RPN_OPERATOR_MUL,
00028 RPN_OPERATOR_DIV,
00029
00030 RPN_OPERAND_CH0,
00031 RPN_OPERAND_CH1,
00032 RPN_OPERAND_CH2,
00033 RPN_OPERAND_CH3,
00034 RPN_OPERAND_CH4,
00035 RPN_OPERAND_CH5,
00036 RPN_OPERAND_CH6,
00037 RPN_OPERAND_CH7,
00038
00039 RPN_OPERAND_CONST,
00040 } RpnTypes;
00041
00042 #ifndef LPCSTR
00043 typedef const char* LPCSTR;
00044 #endif
00045
00046
00047 const LPCSTR RpnTypesNames[]=
00048 {
00049 "ADD",
00050 "SUB",
00051 "MUL",
00052 "DIV",
00053
00054 "CH0",
00055 "CH1",
00056 "CH2",
00057 "CH3",
00058 "CH4",
00059 "CH5",
00060 "CH6",
00061 "CH7",
00062
00063
00064 };
00065 struct RpnItem
00066 {
00067 bool m_processed;
00068 double m_value;
00069 RpnTypes m_type;
00070 };
00071
00072 class RpnHandler
00073 {
00074 public:
00075 RpnHandler( VirtualBoardChannel* parent, const char *expression_def);
00076 ~RpnHandler( void);
00077
00078 bool Parse( const char *expression_def);
00079 const char* Format( void);
00080 bool Test( void);
00081 bool Eval( double &result);
00082 unsigned int GetBufferCount( void);
00083 protected:
00084 RpnItem* m_rpn_items_array;
00085 RpnItem* m_tmp_rpn_items_array;
00086 int m_rpn_array_alloc_size;
00087 int m_rpn_array_real_size;
00088 char* m_expression_def;
00089 bool DoEval( double *p_result);
00090 VirtualBoardChannel* m_parent;
00091 int m_ref_channel_index;
00092
00093 };
00094
00095
00096 #endif // _RPN_HANDLER_H_
00097