public ICleanerNode Sub(ICleanerNode a) { if (typeof(ComplexCleanerNode) == a.GetType()) { ((ComplexCleanerNode)a).IterateOverComputables((IComputableCleanerNode node, int i) => { Sub(node); }); return(this); } else if (typeof(CleanerNode) == a.GetType()) { for (int i = 0; i < subNodes.Count; i++) { if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType())) { continue; } IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i]; if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a)) { subNodes[i] = (CleanerNode)node - (CleanerNode)a; } } return(this); } throw new System.NotImplementedException(); }
public static CleanerNode operator ^(CleanerNode a, ComplexCleanerNode b) { CleanerNode n = new CleanerNode(a.value, a.identifiers); for (int i = 0; i < a.identifiers.Length; i++) { n.identifiers[i] = new Identifier(a.identifiers[i].Base, string.Format("{0}*{1}", a.identifiers[i].Power, b.ToString())); } return(n); }
public ICleanerNode Add(ICleanerNode a) { if (typeof(ComplexCleanerNode) == a.GetType()) { ComplexCleanerNode ccna = ((ComplexCleanerNode)a); for (int j = 0; j < ccna.subNodes.Count; j++) { if (!typeof(IComputableCleanerNode).IsAssignableFrom(ccna.subNodes[j].GetType())) { continue; } Add(ccna.subNodes[j]); } return(this); } else if (typeof(CleanerNode) == a.GetType()) { bool added = false; for (int i = 0; i < subNodes.Count; i++) { if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType())) { continue; } IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i]; if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a)) { added = true; subNodes[i] = (CleanerNode)node + (CleanerNode)a; break; } } if (!added) { subNodes.Add(new CleanerOperatorNode('+')); subNodes.Add(a); } return(this); } throw new System.NotImplementedException(); }
public bool IsEqual(ICleanerNode n) { if (n.GetType() != typeof(CleanerNode)) { return(false); } CleanerNode cnn = (CleanerNode)n; if (value != cnn.value || identifiers.Length != cnn.identifiers.Length) { return(false); } for (int i = 0; i < identifiers.Length; i++) { if (!identifiers[i].IsEqual(cnn.identifiers[i])) { return(false); } } return(true); }
public static bool CanAdd(CleanerNode a, CleanerNode b) { return(Identifier.CanAdd(a.identifiers, b.identifiers)); }