public Primitive PerformOperation(BiOperand type, Primitive a, Primitive b) { if (!BiOperations.ContainsKey(type) || !BiOperations[type].ContainsKey(a.GetPrimitiveType()) || !BiOperations[type][a.GetPrimitiveType()].ContainsKey(b.GetPrimitiveType())) { throw new Exception("Cannot perform operation: " + type + " on types: " + a.GetPrimitiveType() + ", " + b.GetPrimitiveType()); } return(BiOperations[type][a.GetPrimitiveType()][b.GetPrimitiveType()](a, b)); }
void AddBiOperation <T, U>(BiOperand type, Func <T, U, object> resolver) { if (!BiOperations.ContainsKey(type)) { BiOperations[type] = new Dictionary <Return, Dictionary <Return, BiOperation> >(); } foreach (Return a in GetTypes(typeof(T))) { foreach (Return b in GetTypes(typeof(U))) { if (!BiOperations[type].ContainsKey(a)) { BiOperations[type][a] = new Dictionary <Return, BiOperation>(); } BiOperations[type][a][b] = SimpleBiOperand(resolver); } } }
public BiOperandVariable(BiOperand operand, Variable a, Variable b) { this.operand = operand; this.a = a; this.b = b; }