jet/integer_expression.go

192 lines
5.9 KiB
Go
Raw Normal View History

2019-06-21 13:56:57 +02:00
package jet
2019-03-31 14:07:58 +02:00
type IntegerExpression interface {
2019-06-04 12:10:23 +02:00
Expression
2019-06-21 12:30:32 +02:00
numericExpression
2019-06-27 19:55:21 +02:00
// Check if expression is equal to rhs
EQ(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is not equal to rhs
NOT_EQ(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is distinct from rhs
IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is not distinct from rhs
IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is less then rhs
LT(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is less then equal rhs
LT_EQ(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is greater then rhs
GT(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// Check if expression is greater then equal rhs
GT_EQ(rhs IntegerExpression) BoolExpression
2019-06-27 19:55:21 +02:00
// expression + rhs
ADD(rhs IntegerExpression) IntegerExpression
2019-06-27 19:55:21 +02:00
// expression - rhs
SUB(rhs IntegerExpression) IntegerExpression
2019-06-27 19:55:21 +02:00
// expression * rhs
MUL(rhs IntegerExpression) IntegerExpression
2019-06-27 19:55:21 +02:00
// expression / rhs
DIV(rhs IntegerExpression) IntegerExpression
2019-06-27 19:55:21 +02:00
// expression % rhs
MOD(rhs IntegerExpression) IntegerExpression
2019-06-27 19:55:21 +02:00
// expression ^ rhs
POW(rhs IntegerExpression) IntegerExpression
2019-06-27 19:55:21 +02:00
// expression & rhs
BIT_AND(rhs IntegerExpression) IntegerExpression
// expression | rhs
BIT_OR(rhs IntegerExpression) IntegerExpression
// expression # rhs
BIT_XOR(rhs IntegerExpression) IntegerExpression
// ~expression
BIT_NOT() IntegerExpression
2019-06-27 19:55:21 +02:00
// expression << rhs
BIT_SHIFT_LEFT(shift IntegerExpression) IntegerExpression
// expression >> rhs
BIT_SHIFT_RIGHT(shift IntegerExpression) IntegerExpression
2019-03-31 14:07:58 +02:00
}
type integerInterfaceImpl struct {
2019-06-21 12:30:32 +02:00
numericExpressionImpl
parent IntegerExpression
}
func (i *integerInterfaceImpl) EQ(rhs IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return eq(i.parent, rhs)
}
func (i *integerInterfaceImpl) NOT_EQ(rhs IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return notEq(i.parent, rhs)
}
func (i *integerInterfaceImpl) IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return isDistinctFrom(i.parent, rhs)
}
func (i *integerInterfaceImpl) IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return isNotDistinctFrom(i.parent, rhs)
}
func (i *integerInterfaceImpl) GT(rhs IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return gt(i.parent, rhs)
}
func (i *integerInterfaceImpl) GT_EQ(rhs IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return gtEq(i.parent, rhs)
}
func (i *integerInterfaceImpl) LT(expression IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return lt(i.parent, expression)
}
func (i *integerInterfaceImpl) LT_EQ(expression IntegerExpression) BoolExpression {
2019-06-27 19:55:21 +02:00
return ltEq(i.parent, expression)
}
func (i *integerInterfaceImpl) ADD(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "+")
}
func (i *integerInterfaceImpl) SUB(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "-")
}
func (i *integerInterfaceImpl) MUL(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "*")
}
func (i *integerInterfaceImpl) DIV(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "/")
2019-03-31 14:07:58 +02:00
}
func (n *integerInterfaceImpl) MOD(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(n.parent, expression, "%")
2019-03-31 14:07:58 +02:00
}
func (n *integerInterfaceImpl) POW(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(n.parent, expression, "^")
2019-03-31 14:07:58 +02:00
}
func (i *integerInterfaceImpl) BIT_AND(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "&")
2019-03-31 14:07:58 +02:00
}
func (i *integerInterfaceImpl) BIT_OR(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "|")
}
func (i *integerInterfaceImpl) BIT_XOR(expression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, expression, "#")
}
func (i *integerInterfaceImpl) BIT_NOT() IntegerExpression {
return newPrefixIntegerOpExpression(i.parent, "~")
}
func (i *integerInterfaceImpl) BIT_SHIFT_LEFT(intExpression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, intExpression, "<<")
}
func (i *integerInterfaceImpl) BIT_SHIFT_RIGHT(intExpression IntegerExpression) IntegerExpression {
return newBinaryIntegerExpression(i.parent, intExpression, ">>")
2019-03-31 14:07:58 +02:00
}
//---------------------------------------------------//
type binaryIntegerExpression struct {
expressionInterfaceImpl
integerInterfaceImpl
2019-05-29 14:03:38 +02:00
binaryOpExpression
2019-03-31 14:07:58 +02:00
}
func newBinaryIntegerExpression(lhs, rhs IntegerExpression, operator string) IntegerExpression {
2019-03-31 14:07:58 +02:00
integerExpression := binaryIntegerExpression{}
integerExpression.expressionInterfaceImpl.parent = &integerExpression
integerExpression.integerInterfaceImpl.parent = &integerExpression
2019-05-29 14:03:38 +02:00
integerExpression.binaryOpExpression = newBinaryExpression(lhs, rhs, operator)
2019-03-31 14:07:58 +02:00
return &integerExpression
}
//---------------------------------------------------//
type prefixIntegerOpExpression struct {
2019-03-31 14:07:58 +02:00
expressionInterfaceImpl
integerInterfaceImpl
2019-05-29 14:03:38 +02:00
prefixOpExpression
2019-03-31 14:07:58 +02:00
}
func newPrefixIntegerOpExpression(expression IntegerExpression, operator string) IntegerExpression {
integerExpression := prefixIntegerOpExpression{}
2019-05-29 14:03:38 +02:00
integerExpression.prefixOpExpression = newPrefixExpression(expression, operator)
2019-03-31 14:07:58 +02:00
integerExpression.expressionInterfaceImpl.parent = &integerExpression
integerExpression.integerInterfaceImpl.parent = &integerExpression
return &integerExpression
}
2019-06-07 14:23:14 +02:00
//---------------------------------------------------//
type integerExpressionWrapper struct {
integerInterfaceImpl
Expression
}
func newIntExpressionWrap(expression Expression) IntegerExpression {
intExpressionWrap := integerExpressionWrapper{Expression: expression}
intExpressionWrap.integerInterfaceImpl.parent = &intExpressionWrap
return &intExpressionWrap
}
func IntExp(expression Expression) IntegerExpression {
return newIntExpressionWrap(expression)
}