namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
using System.Collections.Generic;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
///
/// Takes the rest of the top item on the type stack.
///
///
[StorableClass]
public abstract class VectorRestExpression : StatelessExpression {
protected VectorRestExpression() { }
[StorableConstructor]
protected VectorRestExpression(bool deserializing) : base(deserializing) { }
protected bool IsNoop(IPushStack> vectorStack) {
return vectorStack.IsEmpty || vectorStack.Top.Count < 2;
}
protected void Eval(IPushStack> vectorStack) {
var result = vectorStack.Top.GetRange(1, vectorStack.Top.Count - 1);
vectorStack.SetTop(result);
}
}
[StorableClass]
[PushExpression(StackTypes.IntegerVector, "INTEGER[].REST")]
public class IntegerVectorRestExpression : VectorRestExpression {
public IntegerVectorRestExpression() { }
[StorableConstructor]
protected IntegerVectorRestExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter.IntegerVectorStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.IntegerVectorStack);
}
}
[StorableClass]
[PushExpression(StackTypes.FloatVector, "FLOAT[].REST")]
public class FloatVectorRestExpression : VectorRestExpression {
public FloatVectorRestExpression() { }
[StorableConstructor]
protected FloatVectorRestExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter.FloatVectorStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.FloatVectorStack);
}
}
[StorableClass]
[PushExpression(StackTypes.BooleanVector, "BOOLEAN[].REST")]
public class BooleanVectorRestExpression : VectorRestExpression {
public BooleanVectorRestExpression() { }
[StorableConstructor]
protected BooleanVectorRestExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter.BooleanVectorStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.BooleanVectorStack);
}
}
[StorableClass]
[PushExpression(StackTypes.StringVector, "STRING[].REST")]
public class StringVectorRestExpression : VectorRestExpression {
public StringVectorRestExpression() { }
[StorableConstructor]
protected StringVectorRestExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter.StringVectorStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.StringVectorStack);
}
}
}