namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions { using System; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes; using HeuristicLab.Problems.ProgramSynthesis.Push.Stack; using Interpreter; /// /// Pushes the sum of the top two items. /// [PushExpression( StackTypes.Integer, "INTEGER.+", "Pushes the sum of the top two items.")] [StorableClass] public class IntegerAddExpression : StatelessExpression { public IntegerAddExpression() { } [StorableConstructor] protected IntegerAddExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = unchecked(second + first); interpreter.IntegerStack.Top = result; } } /// /// Pushes the difference of the top two items; that is, the second item minus the top item. /// [PushExpression( StackTypes.Integer, "INTEGER.-", "Pushes the difference of the top two items; that is, the second item minus the top item.")] [StorableClass] public class IntegerSubtractExpression : StatelessExpression { public IntegerSubtractExpression() { } [StorableConstructor] protected IntegerSubtractExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = unchecked(second - first); interpreter.IntegerStack.Top = result; } } /// /// Pushes the product of the top two items. /// [PushExpression( StackTypes.Integer, "INTEGER.*", "Pushes the product of the top two items.")] [StorableClass] public class IntegerMultiplyExpression : StatelessExpression { public IntegerMultiplyExpression() { } [StorableConstructor] protected IntegerMultiplyExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = unchecked(second * first); interpreter.IntegerStack.Top = result; } } /// /// Pushes the quotient of the top two items; that is, the second item divided by the top item. /// If the top item is zero this acts as a NOOP. /// [PushExpression( StackTypes.Integer, "INTEGER./", "Pushes the quotient of the top two items; that is, the second item divided by the top item. If the top item is zero this acts as a NOOP.")] [StorableClass] public class IntegerDivideExpression : StatelessExpression { public IntegerDivideExpression() { } [StorableConstructor] protected IntegerDivideExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2 || interpreter.IntegerStack.Top == 0 || (interpreter.IntegerStack.Top == -1 && interpreter.IntegerStack[1] == long.MinValue); } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = second / first; interpreter.IntegerStack.Top = result; } } /// /// Pushes the second stack item modulo the top stack item. If the top item is zero this acts as a NOOP. /// [PushExpression( StackTypes.Integer, "INTEGER.%", "Pushes the second stack item modulo the top stack item. If the top item is zero this acts as a NOOP.")] [StorableClass] public class IntegerModuloExpression : StatelessExpression { public IntegerModuloExpression() { } [StorableConstructor] protected IntegerModuloExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2 || interpreter.IntegerStack.Top == 0 || (interpreter.IntegerStack.Top == -1 && interpreter.IntegerStack[1] == long.MinValue); } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = second % first; interpreter.IntegerStack.Top = result; } } /// /// Pushes the minimum of the top two items. /// [PushExpression( StackTypes.Integer, "INTEGER.MIN", "Pushes the minimum of the top two items.")] [StorableClass] public class IntegerMinExpression : StatelessExpression { public IntegerMinExpression() { } [StorableConstructor] protected IntegerMinExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = Math.Min(second, first); interpreter.IntegerStack.Top = result; } } /// /// Pushes the maximum of the top two items. /// [PushExpression( StackTypes.Integer, "INTEGER.MAX", "Pushes the maximum of the top two items.")] [StorableClass] public class IntegerMaxExpression : StatelessExpression { public IntegerMaxExpression() { } [StorableConstructor] protected IntegerMaxExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Pop(); var second = interpreter.IntegerStack.Top; var result = Math.Max(second, first); interpreter.IntegerStack.Top = result; } } /// /// Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise. /// [PushExpression( StackTypes.Integer, "INTEGER.<", "Pushes TRUE onto the BOOLEAN stack if the second item is less than the top item, or FALSE otherwise.", StackTypes.Boolean)] [StorableClass] public class IntegerSmallerThanExpression : StatelessExpression { public IntegerSmallerThanExpression() { } [StorableConstructor] protected IntegerSmallerThanExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Top; var second = interpreter.IntegerStack[1]; interpreter.IntegerStack.Remove(2); var result = second < first; interpreter.BooleanStack.Push(result); } } /// /// Pushes TRUE onto the BOOLEAN stack if the second item is less than or equal to the top item, or FALSE otherwise. /// [PushExpression( StackTypes.Integer, "INTEGER.<=", "Pushes TRUE onto the BOOLEAN stack if the second item is less than or equal to the top item, or FALSE otherwise.", StackTypes.Boolean)] [StorableClass] public class IntegerSmallerOrEqualToExpression : StatelessExpression { public IntegerSmallerOrEqualToExpression() { } [StorableConstructor] protected IntegerSmallerOrEqualToExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Top; var second = interpreter.IntegerStack[1]; interpreter.IntegerStack.Remove(2); var result = second <= first; interpreter.BooleanStack.Push(result); } } /// /// Pushes TRUE onto the BOOLEAN stack if the second item is greater than the top item, or FALSE otherwise. /// [PushExpression( StackTypes.Integer, "INTEGER.>", "Pushes TRUE onto the BOOLEAN stack if the second item is greater than the top item, or FALSE otherwise.", StackTypes.Boolean)] [StorableClass] public class IntegerGreaterThanExpression : StatelessExpression { public IntegerGreaterThanExpression() { } [StorableConstructor] protected IntegerGreaterThanExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Top; var second = interpreter.IntegerStack[1]; interpreter.IntegerStack.Remove(2); var result = second > first; interpreter.BooleanStack.Push(result); } } /// /// Pushes TRUE onto the BOOLEAN stack if the second item is greater than or equal to the top item, or FALSE otherwise. /// [PushExpression( StackTypes.Integer, "INTEGER.>=", "Pushes TRUE onto the BOOLEAN stack if the second item is greater than or equal to the top item, or FALSE otherwise.", StackTypes.Boolean)] [StorableClass] public class IntegerGreaterOrEqualToExpression : StatelessExpression { public IntegerGreaterOrEqualToExpression() { } [StorableConstructor] protected IntegerGreaterOrEqualToExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.Count < 2; } public override void Eval(IInternalPushInterpreter interpreter) { var first = interpreter.IntegerStack.Top; var second = interpreter.IntegerStack[1]; interpreter.IntegerStack.Remove(2); var result = second >= first; interpreter.BooleanStack.Push(result); } } /// /// Pushes 1 if the top BOOLEAN is TRUE, or 0 if the top BOOLEAN is FALSE. /// [PushExpression( StackTypes.Integer, "INTEGER.FROMBOOLEAN", "Pushes 1 if the top BOOLEAN is TRUE, or 0 if the top BOOLEAN is FALSE.", StackTypes.Boolean)] [StorableClass] public class IntegerFromBooleanExpression : StatelessExpression { public IntegerFromBooleanExpression() { } [StorableConstructor] protected IntegerFromBooleanExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.BooleanStack.IsEmpty; } public override void Eval(IInternalPushInterpreter interpreter) { var condition = interpreter.BooleanStack.Pop(); var value = condition ? 1 : 0; interpreter.IntegerStack.Push(value); } } /// /// Pushes the result of truncating the top FLOAT. /// [PushExpression( StackTypes.Integer, "INTEGER.FROMFLOAT", "Pushes the result of truncating the top FLOAT.", StackTypes.Float)] [StorableClass] public class IntegerFromFloatExpression : StatelessExpression { public IntegerFromFloatExpression() { } [StorableConstructor] protected IntegerFromFloatExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.FloatStack.IsEmpty; } public override void Eval(IInternalPushInterpreter interpreter) { var value = unchecked((long)interpreter.FloatStack.Pop()); interpreter.IntegerStack.Push(value); } } /// /// Pushes the result of truncating the top CHAR. /// [PushExpression( StackTypes.Integer, "INTEGER.FROMCHAR", "Pushes the result of truncating the top CHAR.", StackTypes.Char)] [StorableClass] public class IntegerFromCharExpression : StatelessExpression { public IntegerFromCharExpression() { } [StorableConstructor] protected IntegerFromCharExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.CharStack.IsEmpty; } public override void Eval(IInternalPushInterpreter interpreter) { var value = interpreter.CharStack.Pop(); interpreter.IntegerStack.Push(value); } } /// /// Pushes the result of parsing the top STRING. /// [PushExpression( StackTypes.Integer, "INTEGER.FROMSTRING", "Pushes the result of parsing the top STRING.", StackTypes.String)] [StorableClass] public class IntegerFromStringExpression : StatelessExpression { public IntegerFromStringExpression() { } [StorableConstructor] protected IntegerFromStringExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { long tmp; return interpreter.StringStack.IsEmpty || interpreter.StringStack.Top.Length == 0 || !long.TryParse(interpreter.StringStack.Top, out tmp); } public override void Eval(IInternalPushInterpreter interpreter) { var str = interpreter.StringStack.Pop(); var value = long.Parse(str); interpreter.IntegerStack.Push(value); } } /// /// Pushes the result of increasing the top INTEGER by 1. /// [PushExpression( StackTypes.Integer, "INTEGER.INC", "Pushes the result of increasing the top INTEGER by 1.")] [StorableClass] public class IntegerIncExpression : StatelessExpression { public IntegerIncExpression() { } [StorableConstructor] protected IntegerIncExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.IsEmpty; } public override void Eval(IInternalPushInterpreter interpreter) { var result = unchecked(interpreter.IntegerStack.Top + 1); interpreter.IntegerStack.Top = result; } } /// /// Pushes the result of decreasing the top INTEGER by 1. /// [PushExpression( StackTypes.Integer, "INTEGER.DEC", "Pushes the result of decreasing the top INTEGER by 1.")] [StorableClass] public class IntegerDecExpression : StatelessExpression { public IntegerDecExpression() { } [StorableConstructor] protected IntegerDecExpression(bool deserializing) : base(deserializing) { } public override bool IsNoop(IInternalPushInterpreter interpreter) { return interpreter.IntegerStack.IsEmpty; } public override void Eval(IInternalPushInterpreter interpreter) { var result = unchecked(interpreter.IntegerStack.Top - 1); interpreter.IntegerStack.Top = result; } } }