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);
}
}
}