示例#1
0
        /// <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);
        }
示例#2
0
 /// <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);
 }