FusionCalculator/src/Expressions/OperatorExpression.fu
2023-12-26 00:28:46 +06:00

60 lines
1.6 KiB
Plaintext

abstract class OperatorExpression : IExpression {
IExpression A;
IExpression B;
internal void Init!(IExpression a, IExpression b) {
A = a;
B = b;
}
internal abstract double OperatorImplementation(double a, double b);
internal override double Calculate() => OperatorImplementation(A.Calculate(), B.Calculate());
}
class OperatorExpressionAdd : OperatorExpression {
internal override double OperatorImplementation(double a, double b) => a+b;
}
class OperatorExpressionSub : OperatorExpression {
internal override double OperatorImplementation(double a, double b) => a-b;
}
class OperatorExpressionMul : OperatorExpression {
internal override double OperatorImplementation(double a, double b) => a*b;
}
class OperatorExpressionDiv : OperatorExpression {
internal override double OperatorImplementation(double a, double b) => a/b;
}
class OperatorExpressionMod : OperatorExpression {
internal override double OperatorImplementation(double a, double b) {
if(a == 0)
return b;
if(b == 0)
return a;
if(a > 0){
if(b > 0)
while(a-b >= 0)
a -= b;
else
while(a+b >= 0)
a += b;
}
else {
if(b > 0)
while(a+b <= 0)
a += b;
else
while(a-b <= 0)
a -= b;
}
return a;
}
}
class OperatorExpressionPow : OperatorExpression {
internal override double OperatorImplementation(double a, double b) => Math.Pow(a, b);
}