using System.Collections.Generic; namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions { using System; using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes; using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter; using HeuristicLab.Problems.ProgramSynthesis.Push.Stack; /// /// Takes the subvec of the top item on the type stack. /// /// public abstract class VectorSubExpression : StatelessExpression { protected bool Eval(IInternalPushInterpreter interpreter, IPushStack> vectorStack) { if (vectorStack.IsEmpty || interpreter.IntegerStack.Count < 2) return false; var first = (int)Math.Min(vectorStack.Top.Count, Math.Max(0, interpreter.IntegerStack[1])); var second = (int)Math.Min(vectorStack.Top.Count, Math.Max(first, interpreter.IntegerStack.Top)); interpreter.IntegerStack.Remove(2); if (vectorStack.Top.Count == 0) return true; var result = vectorStack.Top.GetRange(first, second - first); vectorStack.SetTop(result); return true; } } [PushExpression(StackTypes.IntegerVector, "INTEGER[].SUB", StackTypes.Integer)] public class IntegerVectorSubExpression : VectorSubExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter, interpreter.IntegerVectorStack); } } [PushExpression(StackTypes.FloatVector, "FLOAT[].SUB", StackTypes.Integer)] public class FloatVectorSubExpression : VectorSubExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter, interpreter.FloatVectorStack); } } [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].SUB", StackTypes.Integer)] public class BooleanVectorSubExpression : VectorSubExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter, interpreter.BooleanVectorStack); } } [PushExpression(StackTypes.StringVector, "STRING[].SUB", StackTypes.Integer)] public class StringVectorSubExpression : VectorSubExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter, interpreter.StringVectorStack); } } }