예제 #1
0
 public void SetRawExpression(string rawExpr, int len)
 {
     ExprsStrings = new string[len];
     if (Exprs != null)
     {
         for (var i = 0; i < Exprs.Length; ++i)
         {
             Exprs[i]?.Dealloc();
         }
     }
     Exprs   = new ScalarExpression[len];
     _values = new Value[len];
     for (var i = 0; i < ExprsStrings.Length; ++i)
     {
         ExprsStrings[i] = rawExpr;
     }
     ExprString = ExprsStrings[0];
     CachedValue.SwitchTo(new Value(_values));
     Recalculate();
 }
예제 #2
0
        public override void Recalculate(int depth = 1)
        {
            if (depth > MaxRecursionDepth)
            {
                // we are proabaly about to encounter a stack overflow
                return;
            }
            // remove all the DependentOn values
            // e.g. remove the cross-references
            foreach (var e in DependentOn)
            {
                e.UsedBy.Remove(this);
            }
            DependentOn.Clear();

            try
            {
                var val = Evaluater.Evaluate(ExprString, VarEval, IndexInArray);
                CachedValue.SwitchTo(val.IsArray ? val.AsArray[IndexInArray] : val);
            }
            catch
            {
                StepManager.ErrorOccurred = true;
            }

            if (!IsWeak)
            {
                if (UsedBy.Count > 0)
                {
                    var copyOfUsedBy = new List <Expression>(UsedBy);
                    UsedBy.Clear();
                    foreach (var e in copyOfUsedBy)
                    {
                        e.Recalculate(depth + 1);
                    }
                }
                ParentArray?.NotifyElementChanged();
            }
            ValueChanged?.Invoke(this, EventArgs.Empty);
        }