using Cryville.Common; using Cryville.Common.Pdt; using System; using System.Collections.Generic; using System.Linq; namespace Cryville.Crtr { public abstract class JudgeAction { public static JudgeAction Construct(HashSet a, string k) { if (a.Remove("pass")) { return new Pass(a, from i in k.Split(',') select new Identifier(i.Trim())); } else if (a.Remove("score")) { return new Score(a, k); } throw new FormatException("Invalid judge action format."); } public readonly HashSet annotations; public JudgeAction(IEnumerable a) { annotations = a.ToHashSet(); } public virtual void Optimize(PdtEvaluatorBase etor, PdtExpression value) { etor.Optimize(value); } internal abstract bool Execute(IJudge judge, JudgeEvent ev, float time, PdtExpression exp, int depth); public class Pass : JudgeAction { readonly Identifier[] _targets; public Pass(IEnumerable a, IEnumerable k) : base(a) { _targets = k.ToArray(); } internal override bool Execute(IJudge judge, JudgeEvent ev, float time, PdtExpression exp, int depth) { return judge.Pass(ev, time, _targets, depth); } } public class Score : JudgeAction { readonly ScoreOperation _op; public Score(IEnumerable a, string k) : base(a) { _op = new ScoreOperation(k); } public Score(ScoreOperation op) : base(Enumerable.Empty()) { _op = op; } public override void Optimize(PdtEvaluatorBase etor, PdtExpression value) { base.Optimize(etor, value); if (_op.op != default(Identifier)) PdtExpression.PatchCompound(_op.name.Key, _op.op.Key, value); } internal override bool Execute(IJudge judge, JudgeEvent ev, float time, PdtExpression exp, int depth) { judge.UpdateScore(_op, exp); return false; } } } }