#include "daScript/misc/platform.h" #include "daScript/ast/ast_match.h" #include "daScript/ast/ast_expressions.h" namespace das { // recognize a==0, a!=0, 0==a, 0!=a bool matchEquNequZero ( const ExpressionPtr & expr, ExpressionPtr & zeroCond, bool & condIfZero ) { if ( expr->rtti_isOp2() ) { auto op2 = static_pointer_cast(expr); if ( op2->op=="==" || op2->op=="!=" ) { condIfZero = op2->op == "=="; if ( isZeroConst(op2->left) ) { zeroCond = op2->right; return true; } else if ( isZeroConst(op2->right) ) { zeroCond = op2->left; return true; } } } return false; } bool isZeroConst ( const ExpressionPtr & expr ) { return isFloatConst(expr, 0.0f) || isIntOrUIntConst(expr, 0) || isPtrZero(expr); } bool isPtrZero ( const ExpressionPtr & expr ) { if ( !expr->rtti_isConstant() ) return false; auto ce = static_pointer_cast(expr); switch ( ce->baseType ) { case Type::tPointer: return cast::to(ce->value) == nullptr; default: return false; } } bool isFloatConst ( const ExpressionPtr & expr, float value ) { if ( !expr->rtti_isConstant() ) return false; auto ce = static_pointer_cast(expr); switch ( ce->baseType ) { case Type::tFloat: return cast::to(ce->value) == value; default: return false; } } bool isIntOrUIntConst ( const ExpressionPtr & expr, int64_t value ) { if ( !expr->rtti_isConstant() ) return false; auto ce = static_pointer_cast(expr); switch ( ce->baseType ) { case Type::tInt: return int64_t ( cast::to(ce->value) ) == value; case Type::tInt8: return int64_t ( cast::to(ce->value) ) == value; case Type::tInt16: return int64_t ( cast::to(ce->value) ) == value; case Type::tInt64: return cast::to(ce->value) == value; case Type::tUInt: return int64_t ( cast::to(ce->value) ) == value; case Type::tBitfield: return int64_t ( cast::to(ce->value) ) == value; case Type::tUInt8: return int64_t ( cast::to(ce->value) ) == value; case Type::tUInt16: return int64_t ( cast::to(ce->value) ) == value; case Type::tUInt64: return int64_t ( cast::to(ce->value) ) == value; default: return false; } } bool isIntConst ( const ExpressionPtr & expr, int64_t value ) { if ( !expr->rtti_isConstant() ) return false; auto ce = static_pointer_cast(expr); switch ( ce->baseType ) { case Type::tInt: return int64_t ( cast::to(ce->value) ) == value; case Type::tInt8: return int64_t ( cast::to(ce->value) ) == value; case Type::tInt16: return int64_t ( cast::to(ce->value) ) == value; case Type::tInt64: return cast::to(ce->value) == value; default: return false; } } bool isUIntConst ( const ExpressionPtr & expr, uint64_t value ) { if ( !expr->rtti_isConstant() ) return false; auto ce = static_pointer_cast(expr); switch ( ce->baseType ) { case Type::tUInt: return uint64_t ( cast::to(ce->value) ) == value; case Type::tBitfield: return uint64_t ( cast::to(ce->value) ) == value; case Type::tUInt8: return uint64_t ( cast::to(ce->value) ) == value; case Type::tUInt16: return uint64_t ( cast::to(ce->value) ) == value; case Type::tUInt64: return cast::to(ce->value) == value; default: return false; } } }