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