⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binopexpr.h

📁 This Source-Navigator, an IDE for C/C++/Fortran/Java/Tcl/PHP/Python and a host of other languages.
💻 H
字号:
// $Header: /cvsroot/sourcenav/src/snavigator/demo/c++_demo/glish/BinOpExpr.h,v 1.1.1.1 2002/04/18 23:35:15 mdejong Exp $// Definitions for arithmetic and relational Expr classes#ifndef binopexpr_h#define binopexpr_h#include "Expr.h"// Arithmetic operations supported on values.typedef enum {	OP_ADD, OP_SUBTRACT, OP_MULTIPLY, OP_DIVIDE, OP_MODULO, OP_POWER,	OP_AND, OP_OR,	OP_EQ, OP_NE, OP_LE, OP_GE, OP_LT, OP_GT	} binop;// An BinOpExpr is a binary expression which performs some arithmetic// or relational operation.class BinOpExpr : public BinaryExpr {    public:	BinOpExpr( binop op, Expr* op1, Expr* op2, const char* desc );	Value* Eval( eval_type etype ) = 0;    protected:	// Returns true if the expression's operands type-check, false	// (and generates an error message) otherwise.  The default TypeCheck	// implements arithmetic type-checking (operands must be numeric).	//	// The third argument is set to true if this expression operates	// element-by-element on arrays, false otherwise.	virtual int TypeCheck( const Value* lhs, const Value* rhs,				int& element_by_element ) const;	// What type the BinOpExpr's operands should be promoted to.  The	// default OperandsType implements numeric promotion (higher operand	// type is used, where the hierarchy is double, float, int, and	// bool is promoted to int).	virtual glish_type OperandsType( const Value* lhs, const Value* rhs )			const;	// Called after type-checking is done.  Checks array lengths	// for compatibility and promotes scalars to arrays as necessary.	// Returns in lhs_len the array length at which lhs should be	// used (if lhs is a scalar and rhs is an array then this will be	// the length of rhs, otherwise the length of lhs).  Returns true	// all checking was okay, false otherwise (in which case lhs_len	// may not have been set).	int Compute( const Value* lhs, const Value* rhs, int& lhs_len ) const;	binop op;	};// A BinOp expression that performs an arithmetic operation: i.e., one// in which the operands are of numeric type and the result is the same// type as the operands.class ArithExpr : public BinOpExpr {    public:	ArithExpr( binop op, Expr* op1, Expr* op2,			const char* desc ) : BinOpExpr(op, op1, op2, desc)		{ }	Value* Eval( eval_type etype );	virtual void Compute( byte lhs[], byte rhs[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( short lhs[], short rhs[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( int lhs[], int rhs[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( float lhs[], float rhs[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( double lhs[], double rhs[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( complex lhs[], complex rhs[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( dcomplex lhs[], dcomplex rhs[],				int lhs_len, int rhs_incr ) = 0;    protected:	Value* OpCompute( Value* lhs, const Value* rhs, int lhs_len );	};#define DECLARE_ARITH_EXPR(name, op, op_name, overloads)		\class name : public ArithExpr {						\    public:								\	name( Expr* op1, Expr* op2 )					\		: ArithExpr(op, op1, op2, op_name)	{ }		\	overloads							\	void Compute( byte lhs[], byte rhs[], int lhs_len, int rhs_incr );\	void Compute( short lhs[], short rhs[], int lhs_len, int rhs_incr );\	void Compute( int lhs[], int rhs[], int lhs_len, int rhs_incr );\	void Compute( float lhs[], float rhs[], int lhs_len, int rhs_incr );\	void Compute( double lhs[], double rhs[], int lhs_len, int rhs_incr );\	void Compute( complex lhs[], complex rhs[], int lhs_len,	\			int rhs_incr );					\	void Compute( dcomplex lhs[], dcomplex rhs[], int lhs_len,	\			int rhs_incr );					\	};DECLARE_ARITH_EXPR(AddExpr, OP_ADD, "+",)DECLARE_ARITH_EXPR(SubtractExpr, OP_SUBTRACT, "-",)DECLARE_ARITH_EXPR(MultiplyExpr, OP_MULTIPLY, "*",)DECLARE_ARITH_EXPR(DivideExpr, OP_DIVIDE, "/",	glish_type OperandsType( const Value* lhs, const Value* rhs ) const;)DECLARE_ARITH_EXPR(ModuloExpr, OP_MODULO, "/",	glish_type OperandsType( const Value* lhs, const Value* rhs ) const;)DECLARE_ARITH_EXPR(PowerExpr, OP_POWER, "^",	glish_type OperandsType( const Value* lhs, const Value* rhs ) const;)// A BinOpExpr that performs a relational operation; i.e., an operation with// a boolean result value.class RelExpr : public BinOpExpr {    public:	RelExpr( binop op, Expr* op1, Expr* op2, const char* desc )			: BinOpExpr(op, op1, op2, desc) { }	Value* Eval( eval_type etype );	virtual void Compute( glish_bool lhs[], glish_bool rhs[],				glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( byte lhs[], byte rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( short lhs[], short rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( int lhs[], int rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( float lhs[], float rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( double lhs[], double rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( complex lhs[], complex rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( dcomplex lhs[], dcomplex rhs[],				glish_bool result[],				int lhs_len, int rhs_incr ) = 0;	virtual void Compute( charptr lhs[], charptr rhs[], glish_bool result[],				int lhs_len, int rhs_incr ) = 0;    protected:	int TypeCheck( const Value* lhs, const Value* rhs,			int& element_by_element ) const;	glish_type OperandsType( const Value* lhs, const Value* rhs ) const;	Value* OpCompute( const Value* lhs, const Value* rhs, int lhs_len );	};#define DECLARE_REL_EXPR(name, op, op_name)				\class name : public RelExpr {						\    public:								\	name( Expr* op1, Expr* op2 )					\		: RelExpr(op, op1, op2, op_name)	{ }		\	void Compute( glish_bool lhs[], glish_bool rhs[],		\			glish_bool result[],				\			int lhs_len, int rhs_incr );			\	void Compute( byte lhs[], byte rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr );			\	void Compute( short lhs[], short rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr );			\	void Compute( int lhs[], int rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr );			\	void Compute( float lhs[], float rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr );			\	void Compute( double lhs[], double rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr );			\	void Compute( complex lhs[], complex rhs[], glish_bool result[],\			int lhs_len, int rhs_incr );			\	void Compute( dcomplex lhs[], dcomplex rhs[], glish_bool result[],\			int lhs_len, int rhs_incr );			\	void Compute( charptr lhs[], charptr rhs[], glish_bool result[],\			int lhs_len, int rhs_incr );			\	};DECLARE_REL_EXPR(EQ_Expr, OP_EQ, "==")DECLARE_REL_EXPR(NE_Expr, OP_NE, "!=")DECLARE_REL_EXPR(LE_Expr, OP_LE, "<=")DECLARE_REL_EXPR(GE_Expr, OP_GE, ">=")DECLARE_REL_EXPR(LT_Expr, OP_LT, "<")DECLARE_REL_EXPR(GT_Expr, OP_GT, ">")// A RelExpr that performs a logical operation; i.e., boolean operands with// a boolean result value.class LogExpr : public RelExpr {    public:	LogExpr( binop op, Expr* op1, Expr* op2, const char* desc )			: RelExpr(op, op1, op2, desc)	{ }	void Compute( glish_bool lhs[], glish_bool rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( byte lhs[], byte rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( short lhs[], short rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( int lhs[], int rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( float lhs[], float rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( double lhs[], double rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( complex lhs[], complex rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( dcomplex lhs[], dcomplex rhs[], glish_bool result[],			int lhs_len, int rhs_incr );	void Compute( charptr lhs[], charptr rhs[], glish_bool result[],			int lhs_len, int rhs_incr );    protected:	int TypeCheck( const Value* lhs, const Value* rhs,			int& element_by_element ) const;	glish_type OperandsType( const Value* lhs, const Value* rhs ) const;	};#define DECLARE_LOG_EXPR(name, op, op_name)				\class name : public LogExpr {						\    public:								\	name( Expr* op1, Expr* op2 )					\		: LogExpr(op, op1, op2, op_name)	{ }		\									\	void Compute( glish_bool lhs[], glish_bool rhs[],		\			glish_bool result[], int lhs_len, int rhs_incr );\									\	void Compute( int lhs[], int rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( float lhs[], float rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( double lhs[], double rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( complex lhs[], complex rhs[], glish_bool result[],\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( dcomplex lhs[], dcomplex rhs[], glish_bool result[],\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( charptr lhs[], charptr rhs[], glish_bool result[],\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( byte lhs[], byte rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	void Compute( short lhs[], short rhs[], glish_bool result[],	\			int lhs_len, int rhs_incr )			\		{ LogExpr::Compute(lhs,rhs,result,lhs_len,rhs_incr); }	\	};DECLARE_LOG_EXPR(LogAndExpr, OP_AND, "&")DECLARE_LOG_EXPR(LogOrExpr, OP_OR, "|")#endif /* binopexpr_h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -