using System;
using System.Collections.Generic;
using System.Text;
namespace ScriptNET.Runtime.Operators
{
///
/// Implementation of and operator
///
public class AndOperator : BinaryOperator
{
public AndOperator() :
base("&")
{
RegisterEvaluator((x, y) => x & y);
}
}
///
/// Implementation of exclusive and operator
///
public class And2Operator : BinaryOperator
{
public And2Operator() :
base("&&")
{
RegisterEvaluator((x, y) => x && y);
}
}
///
/// Implementation of or operator
///
public class OrOperator : BinaryOperator
{
public OrOperator() :
base("|")
{
RegisterEvaluator((x, y) => x | y);
}
}
///
/// Implementation of exclusive or operator
///
public class Or2Operator : BinaryOperator
{
public Or2Operator() :
base("||")
{
RegisterEvaluator((x, y) => x || y);
}
}
///
/// Implementation of equals operator
///
public class EqualsOperator : IOperator
{
public EqualsOperator()
{
}
#region IOperator Members
public string Name
{
get { return "=="; }
}
public bool Unary
{
get { return false; }
}
public object Evaluate(object value)
{
throw new NotImplementedException();
}
public object Evaluate(object left, object right)
{
if (left == null || right == null)
return object.Equals(left, right);
IObjectBind equalityMethod = null;
equalityMethod = RuntimeHost.Binder.BindToMethod(left, "op_Equality", null, new object[] { left, right });
if (equalityMethod != null)
return equalityMethod.Invoke(null, new object[] { left, right });
equalityMethod = RuntimeHost.Binder.BindToMethod(right, "op_Equality", null, new object[] { right, left });
if (equalityMethod != null)
return equalityMethod.Invoke(null, new object[] { right, left });
equalityMethod = RuntimeHost.Binder.BindToMethod(left, "Equals", null, new object[] { right });
if (equalityMethod != null)
return equalityMethod.Invoke(null, new object[] { left, right });
return object.Equals(left, right);
}
#endregion
}
///
/// Implementation of not equals operator
///
public class NotEqualsOperator : IOperator
{
EqualsOperator equalsOperator = new EqualsOperator();
public NotEqualsOperator()
{
}
#region IOperator Members
public string Name
{
get { return "!="; }
}
public bool Unary
{
get { return false; }
}
public object Evaluate(object value)
{
return equalsOperator.Evaluate(value);
}
public object Evaluate(object left, object right)
{
return !(bool)equalsOperator.Evaluate(left, right);
}
#endregion
}
}