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