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;
///
/// Conj's an item onto the type stack.
///
[StorableClass]
public abstract class VectorConjExpression : StatelessExpression {
protected VectorConjExpression() { }
[StorableConstructor]
protected VectorConjExpression(bool deserializing) : base(deserializing) { }
protected bool IsNoop(IInternalPushInterpreter interpreter, IPushStack> vectorStack, IPushStack literalStack) {
return vectorStack.IsEmpty ||
literalStack.IsEmpty ||
vectorStack.Top.Count + 1 > interpreter.Configuration.MaxVectorLength;
}
protected void Eval(IInternalPushInterpreter interpreter, IPushStack> vectorStack, IPushStack literalStack) {
var literal = literalStack.Pop();
vectorStack.Top = new List(vectorStack.Top) { literal };
}
}
[StorableClass]
[PushExpression(
StackTypes.IntegerVector,
"INTEGER[].CONJ",
"Conj's the top INTEGER onto the top item of the INTEGER[] stack.",
StackTypes.Integer)]
public class IntegerVectorConjExpression : VectorConjExpression {
public IntegerVectorConjExpression() { }
[StorableConstructor]
protected IntegerVectorConjExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter, interpreter.IntegerVectorStack, interpreter.IntegerStack);
}
}
[StorableClass]
[PushExpression(
StackTypes.FloatVector,
"FLOAT[].CONJ",
"Conj's the top FLOAT onto the top item of the FLOAT[] stack.",
StackTypes.Float)]
public class FloatVectorConjExpression : VectorConjExpression {
public FloatVectorConjExpression() { }
[StorableConstructor]
protected FloatVectorConjExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter, interpreter.FloatVectorStack, interpreter.FloatStack);
}
}
[StorableClass]
[PushExpression(
StackTypes.StringVector,
"STRING[].CONJ",
"Conj's the top STRING onto the top item of the STRING[] stack.",
StackTypes.String)]
public class StringVectorConjExpression : VectorConjExpression {
public StringVectorConjExpression() { }
[StorableConstructor]
protected StringVectorConjExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter, interpreter.StringVectorStack, interpreter.StringStack);
}
}
[StorableClass]
[PushExpression(
StackTypes.BooleanVector,
"BOOLEAN[].CONJ",
"Conj's the top BOOLEAN onto the top item of the BOOLEAN[] stack.",
StackTypes.Boolean)]
public class BooleanVectorConjExpression : VectorConjExpression {
public BooleanVectorConjExpression() { }
[StorableConstructor]
protected BooleanVectorConjExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return IsNoop(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter, interpreter.BooleanVectorStack, interpreter.BooleanStack);
}
}
}