using HeuristicLab.Algorithms.PushGP.Interpreter; using HeuristicLab.Algorithms.PushGP.Stack; using HeuristicLab.Common; namespace HeuristicLab.Algorithms.PushGP.Expressions { /// /// Duplicates the top item on the INTEGER stack. Does not pop its argument /// (which, if it did, would negate the effect of the duplication!). /// /// Stacktype public abstract class DuplicateExpression : Expression { public DuplicateExpression(string stringRepresentation) : base(stringRepresentation) { } public void Eval(IStack stack) { if (stack.Count == 0) return; var clone = this.Clone(stack.Top); stack.Push(clone); } public abstract T Clone(T original); } public class IntegerDuplicateExpression : DuplicateExpression { public IntegerDuplicateExpression() : base("INTEGER.DUP") { } public override void Eval(IInterpreter interpreter) { this.Eval(interpreter.IntegerStack); } public override long Clone(long value) { return value; } } public class FloatDuplicateExpression : DuplicateExpression { public FloatDuplicateExpression() : base("FLOAT.DUP") { } public override void Eval(IInterpreter interpreter) { this.Eval(interpreter.FloatStack); } public override double Clone(double value) { return value; } } public class BooleanDuplicateExpression : DuplicateExpression { public BooleanDuplicateExpression() : base("BOOLEAN.DUP") { } public override void Eval(IInterpreter interpreter) { this.Eval(interpreter.BooleanStack); } public override bool Clone(bool value) { return value; } } public class NameDuplicateExpression : DuplicateExpression { public NameDuplicateExpression() : base("NAME.DUP") { } public override void Eval(IInterpreter interpreter) { this.Eval(interpreter.NameStack); } public override string Clone(string value) { return string.Copy(value); } } public class ExecDuplicateExpression : DuplicateExpression { private readonly Cloner cloner = new Cloner(); public ExecDuplicateExpression() : base("EXEC.DUP") { } public override void Eval(IInterpreter interpreter) { this.Eval(interpreter.ExecStack); } public override Expression Clone(Expression original) { return cloner.Clone(original); } } public class CodeDuplicateExpression : DuplicateExpression { private readonly Cloner cloner = new Cloner(); public CodeDuplicateExpression() : base("CODE.DUP") { } public override void Eval(IInterpreter interpreter) { this.Eval(interpreter.CodeStack); } public override Expression Clone(Expression original) { return cloner.Clone(original); } } }