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
}
}