public override HlslTreeNode Reduce() { var squareRoot = new SquareRootOperation(Value); var division = new DivisionOperation(new ConstantNode(1), squareRoot); Replace(division); return(division); }
public override HlslTreeNode Reduce() { switch (Value) { case ReciprocalSquareRootOperation reciprocalSquareRoot: { var newValue = new SquareRootOperation(reciprocalSquareRoot.Value); Replace(newValue); return(newValue); } } return(base.Reduce()); }
/// <summary> /// Calls the IOperation that corresponds to the input OperationType /// </summary> /// <param name="operationType">The operation to perform.</param> public void PerformOperation(OperationType operationType) { IOperation operation = null; switch (operationType) { case OperationType.Add: operation = new AddOperation(); break; case OperationType.Minus: operation = new MinusOperation(); break; case OperationType.Multiply: operation = new MultiplyOperation(); break; case OperationType.Divide: operation = new DivideOperation(); break; case OperationType.Negate: operation = new NegateOperation(); break; case OperationType.SquareRoot: operation = new SquareRootOperation(); break; case OperationType.Exponential: operation = new ExponentialOperation(); break; case OperationType.Power: operation = new PowerOperation(); break; case OperationType.Reciprocal: operation = new ReciprocalOperation(); break; case OperationType.Sine: operation = new SineOperation(); break; case OperationType.Cosine: operation = new CosineOperation(); break; case OperationType.Clear: operation = new ClearOperation(); break; case OperationType.Swap: operation = new SwapOperation(); break; case OperationType.Rotate: operation = new RotateOperation(); break; } if (operation != null) { /* * Exception handling is done within each class that implements IOperation. * Refactoring to multiple operation types (e.g. BinaryOperation, * UnaryOperation, and StackOperation) can make the code DRYer as each type * can use similar exception handling. */ operation.Perform(stack); } }