/// <summary> /// Constructor /// </summary> /// <param name="creator">Base formula creator</param> public FormulaArrayObjectCreator(IFormulaObjectCreator creator) { this.creator = creator; for (int i = 0; i < creator.BinaryCount; i++) { binary.Add(new BinaryArrayOperationDetector(creator.GetBinaryDetector(i))); } for (int i = 0; i < creator.MultiOperationCount; i++) { multi.Add(new MultiArrayOperationDetector(creator.GetMultiOperationDetector(i))); } for (int i = 0; i < creator.OperationCount; i++) { IOperationDetector d = creator.GetDetector(i); TypeInfo dt = d.ToTypeInfo(); TreeTransformationAttribute da = dt.GetAttribute <TreeTransformationAttribute>(); if (da != null) { detectors.Add(d); goto detectorSelected; } detectors.Add(new ArrayOperationDetector(d)); detectorSelected: continue; } detectors.Add(ArraySingleDetector.Object); }
/// <summary> /// Processes multi operation /// </summary> /// <param name="formula">Formula</param> /// <param name="creator">Formula creator</param> /// <returns>True if operation exists and false otherwise</returns> protected bool processMultiOperation(MathFormula formula, IFormulaObjectCreator creator) { for (int n = 0; n < creator.MultiOperationCount; n++) { IMultiOperationDetector detector = creator.GetMultiOperationDetector(n); int j = 0; int m = 0; int i = 0; //int opened = 0; int k = 0; List <ObjectFormulaTree> list = null; for (; i < formula.Count; i++) { MathSymbol symbol = formula[i]; if (creator.IsBra(symbol)) { ++m; continue; } if (creator.IsKet(symbol)) { --m; continue; } if (m != 0) { continue; } if (!detector.Detect(k, symbol)) { continue; } if (list == null) { list = new List <ObjectFormulaTree>(); } MathFormula f = new MathFormula(formula, j, i - 1); list.Add(CreateTree(f, creator)); ++k; j = i + 1; if (k == detector.Count) { f = new MathFormula(formula, j, formula.Count - 1); list.Add(CreateTree(f, creator)); object[] types = new object[list.Count]; int nOp = 0; foreach (ObjectFormulaTree tree in list) { types[nOp] = tree.ReturnType; ++nOp; } IObjectOperation op = detector.Accept(types); if (op != null) { operation = op; children = list; y = new object[list.Count]; return(true); } } } } return(false); }