using System; using System.Collections.Generic; using System.Text; namespace ScriptNET.Runtime.Operators { public abstract class BinaryOperator : IOperator { /// /// Generic evaluator /// /// /// /// private delegate object EvaluatorGeneric(object left, object right); /// /// Strongly typed evaluator /// /// /// /// /// /// public delegate object Evaluator(T1 left, T2 right); private Dictionary> operators = new Dictionary>(); public BinaryOperator(string name) { Name = name; } #region IOperator Members public virtual string Name { get; private set; } public object Evaluate(object left, object right) { EvaluatorGeneric function; try { function = operators[left.GetType()][right.GetType()]; } catch (KeyNotFoundException) { throw new NotSupportedException("Operator does not support given arguments"); } return function(left, right); } private void RegisterEvaluatorGeneric(Type left, Type right, EvaluatorGeneric eval) { if (operators.ContainsKey(left)) { operators[left].Add(right, eval); } else { Dictionary op = new Dictionary(); op.Add(right, eval); operators.Add(left, op); } } /// /// Register the evaluater strongly typed version. /// /// /// /// protected void RegisterEvaluator(Evaluator evaluator) { EvaluatorGeneric evaluatorGeneric = (x, y) => { return evaluator((T1)x, (T2)y); }; RegisterEvaluatorGeneric(typeof(T1), typeof(T2), evaluatorGeneric); } #endregion #region Unary functions public bool Unary { get { return false; } } public object Evaluate(object value) { throw new NotImplementedException(); } #endregion } }