using System.Collections.Generic; namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions { using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes; using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter; using HeuristicLab.Problems.ProgramSynthesis.Push.Stack; /// /// Removes all occurrences of the first lit-type item in the top type vector. /// /// public abstract class VectorRemoveExpression : StatelessExpression { protected bool Eval(IPushStack> vectorStack, IPushStack literalStack) { if (vectorStack.IsEmpty || literalStack.IsEmpty) return false; var literal = literalStack.Pop(); vectorStack.Top.RemoveAll(x => x.Equals(literal)); return true; } } [PushExpression(StackTypes.IntegerVector, "INTEGER[].REMOVE", StackTypes.Integer)] public class IntegerVectorRemoveExpression : VectorRemoveExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack); } } [PushExpression(StackTypes.FloatVector, "FLOAT[].REMOVE", StackTypes.Float)] public class FloatVectorRemoveExpression : VectorRemoveExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter.FloatVectorStack, interpreter.FloatStack); } } [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].REMOVE", StackTypes.Boolean)] public class BooleanVectorRemoveExpression : VectorRemoveExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter.BooleanVectorStack, interpreter.BooleanStack); } } [PushExpression(StackTypes.StringVector, "STRING[].REMOVE", StackTypes.String)] public class StringVectorRemoveExpression : VectorRemoveExpression { public override bool Eval(IInternalPushInterpreter interpreter) { return Eval(interpreter.StringVectorStack, interpreter.StringStack); } } }