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;
///
/// Duplicates the top item on the T stack. Does not pop its argument
/// (which, if it did, would negate the effect of the duplication!).
///
/// Stacktype
[StorableClass]
public abstract class DuplicateExpression : StatelessExpression {
protected DuplicateExpression() { }
[StorableConstructor]
protected DuplicateExpression(bool deserializing) : base(deserializing) { }
protected void Eval(IPushStack stack) {
stack.Push(stack.Top);
}
}
[StorableClass]
[PushExpression(StackTypes.Integer, "INTEGER.DUP", "Duplicates the top item on the INTEGER stack.")]
public class IntegerDuplicateExpression : DuplicateExpression {
public IntegerDuplicateExpression() { }
[StorableConstructor]
protected IntegerDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.IntegerStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.IntegerStack);
}
}
[StorableClass]
[PushExpression(StackTypes.Float, "FLOAT.DUP", "Duplicates the top item on the FLOAT stack.")]
public class FloatDuplicateExpression : DuplicateExpression {
public FloatDuplicateExpression() { }
[StorableConstructor]
protected FloatDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.FloatStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.FloatStack);
}
}
[StorableClass]
[PushExpression(StackTypes.Boolean, "BOOLEAN.DUP", "Duplicates the top item on the BOOLEAN stack.")]
public class BooleanDuplicateExpression : DuplicateExpression {
public BooleanDuplicateExpression() { }
[StorableConstructor]
protected BooleanDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.BooleanStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.BooleanStack);
}
}
[StorableClass]
[PushExpression(StackTypes.Name, "NAME.DUP", "Duplicates the top item on the NAME stack.")]
public class NameDuplicateExpression : DuplicateExpression {
public NameDuplicateExpression() { }
[StorableConstructor]
protected NameDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.NameStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.NameStack);
}
}
[StorableClass]
[PushExpression(StackTypes.Exec, "EXEC.DUP", "Duplicates the top item on the EXEC stack." , requiredBlockCount: 1)]
public class ExecDuplicateExpression : DuplicateExpression {
public ExecDuplicateExpression() { }
[StorableConstructor]
protected ExecDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.ExecStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.ExecStack);
}
}
[StorableClass]
[PushExpression(StackTypes.Code, "CODE.DUP", "Duplicates the top item on the CODE stack.")]
public class CodeDuplicateExpression : DuplicateExpression {
public CodeDuplicateExpression() { }
[StorableConstructor]
protected CodeDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.CodeStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.CodeStack);
}
}
[StorableClass]
[PushExpression(StackTypes.Char, "CHAR.DUP", "Duplicates the top item on the CHAR stack.")]
public class CharDuplicateExpression : DuplicateExpression {
public CharDuplicateExpression() { }
[StorableConstructor]
protected CharDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.CharStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.CharStack);
}
}
[StorableClass]
[PushExpression(StackTypes.String, "STRING.DUP", "Duplicates the top item on the STRING stack.")]
public class StringDuplicateExpression : DuplicateExpression {
public StringDuplicateExpression() { }
[StorableConstructor]
protected StringDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.StringStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.StringStack);
}
}
[StorableClass]
[PushExpression(StackTypes.IntegerVector, "INTEGER[].DUP", "Duplicates the top item on the INTEGER[] stack.")]
public class IntegerVectorDuplicateExpression : DuplicateExpression> {
public IntegerVectorDuplicateExpression() { }
[StorableConstructor]
protected IntegerVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.IntegerVectorStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.IntegerVectorStack);
}
}
[StorableClass]
[PushExpression(StackTypes.FloatVector, "FLOAT[].DUP", "Duplicates the top item on the FLOAT[] stack.")]
public class FloatVectorDuplicateExpression : DuplicateExpression> {
public FloatVectorDuplicateExpression() { }
[StorableConstructor]
protected FloatVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.FloatVectorStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.FloatVectorStack);
}
}
[StorableClass]
[PushExpression(StackTypes.BooleanVector, "BOOLEAN[].DUP", "Duplicates the top item on the BOOLEAN[] stack.")]
public class BooleanVectorDuplicateExpression : DuplicateExpression> {
public BooleanVectorDuplicateExpression() { }
[StorableConstructor]
protected BooleanVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.BooleanVectorStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.BooleanVectorStack);
}
}
[StorableClass]
[PushExpression(StackTypes.StringVector, "STRING[].DUP", "Duplicates the top item on the STRING[] stack.")]
public class StringVectorDuplicateExpression : DuplicateExpression> {
public StringVectorDuplicateExpression() { }
[StorableConstructor]
protected StringVectorDuplicateExpression(bool deserializing) : base(deserializing) { }
public override bool IsNoop(IInternalPushInterpreter interpreter) {
return interpreter.StringVectorStack.IsEmpty;
}
public override void Eval(IInternalPushInterpreter interpreter) {
Eval(interpreter.StringVectorStack);
}
}
}