using System; using HeuristicLab.Algorithms.PushGP.Interpreter; using HeuristicLab.Algorithms.PushGP.Stack; namespace HeuristicLab.Algorithms.PushGP.Expressions.Templates { public class PushResultExpressionTemplate : ExpressionTemplate { private readonly Func> sourceStackProvider; private readonly Func> targetStackProvider; private readonly Func templateFunc; private readonly bool isCodeOp; public PushResultExpressionTemplate(string symbol, Func> sourceStackProvider, Func> targetSourceProvider, Func templateFunc, bool isCodeOp = false) : base(symbol) { this.sourceStackProvider = sourceStackProvider; this.targetStackProvider = targetSourceProvider; this.templateFunc = templateFunc; this.isCodeOp = isCodeOp; } public override bool IsCodeOp { get { return this.isCodeOp; } } public override void Eval(IInterpreter interpreter) { var sourceStack = this.sourceStackProvider(interpreter); // not enough arguments on stack if (sourceStack.Count < 2) return; var targetStack = this.targetStackProvider(interpreter); var values = sourceStack.Pop(2); var result = this.templateFunc(values); targetStack.Push(result); } } }