namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions { using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes; using Interpreter; using Stack; public abstract class ShoveExpression : StatelessExpression { protected void Eval(IStack stack, IStack integerStack, int count = 1) { if (integerStack.Count == 0 || integerStack.Top > stack.Count - count || integerStack.Top < 0 || stack.Count < 2) return; var index = (int)integerStack.Pop(); var item = stack.Pop(); stack.Insert(index, item); } } [PushExpression(StackType.Integer, "INTEGER.SHOVE")] public class IntegerShoveExpression : ShoveExpression { public override void Eval(IPushGpInterpreter interpreter) { Eval(interpreter.IntegerStack, interpreter.IntegerStack, 2); } } [PushExpression(StackType.Float, "FLOAT.SHOVE")] public class FloatShoveExpression : ShoveExpression { public override void Eval(IPushGpInterpreter interpreter) { Eval(interpreter.FloatStack, interpreter.IntegerStack); } } [PushExpression(StackType.Boolean, "BOOLEAN.SHOVE")] public class BooleanShoveExpression : ShoveExpression { public override void Eval(IPushGpInterpreter interpreter) { Eval(interpreter.BooleanStack, interpreter.IntegerStack); } } [PushExpression(StackType.Name, "NAME.SHOVE")] public class NameShoveExpression : ShoveExpression { public override void Eval(IPushGpInterpreter interpreter) { Eval(interpreter.NameStack, interpreter.IntegerStack); } } [PushExpression(StackType.Exec, "EXEC.SHOVE")] public class ExecShoveExpression : ShoveExpression { public override void Eval(IPushGpInterpreter interpreter) { Eval(interpreter.ExecStack, interpreter.IntegerStack); } } [PushExpression(StackType.Code, "CODE.SHOVE")] public class CodeShoveExpression : ShoveExpression { public override void Eval(IPushGpInterpreter interpreter) { Eval(interpreter.CodeStack, interpreter.IntegerStack); } } }