예제 #1
0
 private bool EvaluateFunctionArgument(CalcExpression argExpr, CalcEvaluatorContext context, bool acceptsArray, bool acceptsReference, bool acceptsError, bool acceptsMissingArgument, out object result)
 {
     if (((context != null) && (acceptsArray || context.ExpandArrayToMultiCall)) && !context.ArrayFormulaMode)
     {
         using (context.EnterExpandArrayToMultiCallMode())
         {
             return(this.EvaluateFunctionArgumentImp(argExpr, context, false, acceptsReference, acceptsError, acceptsMissingArgument, out result));
         }
     }
     return(this.EvaluateFunctionArgumentImp(argExpr, context, acceptsArray, acceptsReference, acceptsError, acceptsMissingArgument, out result));
 }
예제 #2
0
        private object EvaluateFunctionTwoOrMoreArgs(CalcFunction func, object[] args, CalcEvaluatorContext context, bool acceptsArray, bool acceptsReference)
        {
            int length = args.Length;

            bool[] flagArray = new bool[length];
            bool   flag      = true;

            for (int i = 0; i < length; i++)
            {
                object obj2  = null;
                bool   flag2 = func.AcceptsReference(i);
                bool   flag3 = flag2 || CalcHelper.TryExtractToSingleValue(args[i], out obj2);
                flag         = flag && flag3;
                flagArray[i] = flag3;
                if (!flag2)
                {
                    args[i] = obj2;
                }
            }
            if (flag)
            {
                return(this.EvaluateFunction(func, args, context, acceptsArray, acceptsReference, 0, 0));
            }
            int[] numArray  = new int[length];
            int[] numArray2 = new int[length];
            for (int j = 0; j < length; j++)
            {
                CalcArray array = args[j] as CalcArray;
                numArray[j]  = (flagArray[j] || (array == null)) ? -1 : array.RowCount;
                numArray2[j] = (flagArray[j] || (array == null)) ? -1 : array.ColumnCount;
            }
            int num4 = -1;
            int num5 = -1;

            if (!flagArray[0])
            {
                num4 = numArray[0];
                num5 = numArray2[0];
            }
            for (int k = 1; k < length; k++)
            {
                if (!flagArray[k])
                {
                    int num7 = numArray[k];
                    int num8 = numArray2[k];
                    num4 = (num4 == -1) ? num7 : ((num7 > 1) ? ((num4 > 1) ? Math.Min(num7, num4) : num7) : num4);
                    num5 = (num5 == -1) ? num8 : ((num8 > 1) ? ((num5 > 1) ? Math.Min(num8, num5) : num8) : num5);
                }
            }
            object[,] values = new object[num4, num5];
            using (context.EnterExpandArrayToMultiCallMode())
            {
                for (int m = 0; m < num4; m++)
                {
                    for (int n = 0; n < num5; n++)
                    {
                        object[] objArray2 = new object[length];
                        for (int num11 = 0; num11 < length; num11++)
                        {
                            objArray2[num11] = flagArray[num11] ? args[num11] : CalcHelper.GetArrayValue(args[num11] as CalcArray, m, n);
                        }
                        values[m, n] = this.EvaluateFunction(func, objArray2, context, acceptsArray, acceptsReference, m, n);
                    }
                }
                return(new ConcreteArray <object>(values));
            }
        }
예제 #3
0
        private object EvaluateFunction(CalcFunctionExpression expr, CalcEvaluatorContext context, bool acceptsArray, bool acceptsReference)
        {
            CalcFunction function;

            object[]   objArray;
            object     obj2;
            List <int> list;

            if (!this.PrepareFunctionArguments(expr, context, out function, out objArray, out list, out obj2))
            {
                return(obj2);
            }
            int argCount = expr.ArgCount;

            if ((context != null) && context.ArrayFormulaMode)
            {
                if (argCount > 0)
                {
                    return(this.EvaluateFunctionWithArrayFormulaMode(function, objArray, context, acceptsArray, acceptsReference));
                }
                return(this.EvaluateFunction(function, objArray, context, acceptsArray, acceptsReference, 0, 0));
            }
            if (((context != null) && context.ExpandArrayToMultiCall) && (list.Count > 0))
            {
                Dictionary <int, object> dictionary = new Dictionary <int, object>(argCount);
                bool[] flagArray = new bool[argCount];
                bool   flag      = true;
                for (int i = 0; i < argCount; i++)
                {
                    if (list.Contains(i))
                    {
                        CalcArray array = objArray[i] as CalcArray;
                        if (array == null)
                        {
                            dictionary[i] = null;
                            flagArray[i]  = true;
                        }
                        else if (array.Length == 1)
                        {
                            dictionary[i] = array.GetValue(0);
                            flagArray[i]  = true;
                        }
                        else
                        {
                            dictionary[i] = array;
                            flag          = false;
                        }
                    }
                    else
                    {
                        flagArray[i] = true;
                    }
                }
                if (!flag)
                {
                    int[] numArray  = new int[argCount];
                    int[] numArray2 = new int[argCount];
                    for (int j = 0; j < argCount; j++)
                    {
                        CalcArray array2 = dictionary.ContainsKey(j) ? (dictionary[j] as CalcArray) : null;
                        numArray[j]  = (flagArray[j] || (array2 == null)) ? -1 : array2.RowCount;
                        numArray2[j] = (flagArray[j] || (array2 == null)) ? -1 : array2.ColumnCount;
                    }
                    int num4 = -1;
                    int num5 = -1;
                    if (!flagArray[0])
                    {
                        num4 = numArray[0];
                        num5 = numArray2[0];
                    }
                    for (int k = 1; k < argCount; k++)
                    {
                        if (!flagArray[k])
                        {
                            int num7 = numArray[k];
                            int num8 = numArray2[k];
                            num4 = (num4 == -1) ? num7 : ((num7 > 1) ? ((num4 > 1) ? Math.Min(num7, num4) : num7) : num4);
                            num5 = (num5 == -1) ? num8 : ((num8 > 1) ? ((num5 > 1) ? Math.Min(num8, num5) : num8) : num5);
                        }
                    }
                    object[,] values = new object[num4, num5];
                    object[] objArray3 = new object[objArray.Length];
                    objArray.CopyTo(objArray3, 0);
                    using (context.EnterExpandArrayToMultiCallMode())
                    {
                        for (int m = 0; m < num4; m++)
                        {
                            for (int n = 0; n < num5; n++)
                            {
                                foreach (KeyValuePair <int, object> pair in dictionary)
                                {
                                    objArray3[pair.Key] = flagArray[pair.Key] ? pair.Value : CalcHelper.GetArrayValue(pair.Value as CalcArray, m, n);
                                }
                                values[m, n] = this.EvaluateFunction(function, objArray3, context, acceptsArray, acceptsReference, m, n);
                            }
                        }
                        return(new ConcreteArray <object>(values));
                    }
                }
                foreach (KeyValuePair <int, object> pair2 in dictionary)
                {
                    objArray[pair2.Key] = pair2.Value;
                }
            }
            return(this.EvaluateFunction(function, objArray, context, acceptsArray, acceptsReference, 0, 0));
        }