namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
using System;
using System.Collections.Generic;
using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
///
/// Removes an indexed item from "deep" in the stack and pushes it on top of the stack.
/// The index is taken from the INTEGER stack, and the indexing is done after the index is removed.
///
/// Stacktype
public abstract class YankExpression : StatelessExpression {
public bool Eval(IPushStack stack, IPushStack integerStack) {
if ((stack == integerStack && integerStack.Count < 2) ||
(stack != integerStack && (integerStack.IsEmpty || stack.IsEmpty)))
return false;
var index = (int)Math.Abs(integerStack.Pop() % stack.Count);
stack.Yank(index);
return true;
}
}
[PushExpression(StackTypes.Integer, "INTEGER.YANK")]
public class IntegerYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.IntegerStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.Float, "FLOAT.YANK", StackTypes.Integer)]
public class FloatYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.FloatStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.Boolean, "BOOLEAN.YANK", StackTypes.Integer)]
public class BooleanYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.BooleanStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.Name, "NAME.YANK", StackTypes.Integer)]
public class NameYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.NameStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.Exec, "EXEC.YANK", StackTypes.Integer)]
public class ExecYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.ExecStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.Code, "CODE.YANK", StackTypes.Integer)]
public class CodeYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.CodeStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.Char, "CHAR.YANK", StackTypes.Integer)]
public class CharYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.CharStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.String, "STRING.YANK", StackTypes.Integer)]
public class StringYankExpression : YankExpression {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.StringStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.IntegerVector, "INTEGER[].YANK", StackTypes.Integer)]
public class IntegerVectorYankExpression : YankExpression> {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.FloatVector, "FLOAT[].YANK", StackTypes.Integer)]
public class FloatVectorYankExpression : YankExpression> {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.FloatVectorStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.BooleanVector, "BOOLEAN[].YANK", StackTypes.Integer)]
public class BooleanVectorYankExpression : YankExpression> {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack);
}
}
[PushExpression(StackTypes.StringVector, "STRING[].YANK", StackTypes.Integer)]
public class StringVectorYankExpression : YankExpression> {
public override bool Eval(IInternalPushInterpreter interpreter) {
return Eval(interpreter.StringVectorStack, interpreter.IntegerStack);
}
}
}