Ejemplo n.º 1
0
        public override void Recalculate(int depth = 1)
        {
            foreach (var e in DependentOn)
            {
                e.UsedBy.Remove(this);
            }
            DependentOn.Clear();

            _ignoreNotifyElementChanged = true;
            for (var i = 0; i < Exprs.Length; ++i)
            {
                if (Exprs[i] == null)
                {
                    var e = new ScalarExpression(ObjectName, VarName + (i + 1), ExprsStrings[i], i, i == 0, this);
                    Exprs[i]   = e;
                    _values[i] = e.CachedValue;
                }
                else
                {
                    Exprs[i].AllowedToAddToParent = i == 0;
                    Exprs[i].SetRawExpression(ExprsStrings[i]);
                }
                Exprs[i].AllowedToAddToParent = false;
            }
            _ignoreNotifyElementChanged = false;

            NotifyElementChanged();
        }
Ejemplo n.º 2
0
 public void Dealloc()
 {
     foreach (var e in DependentOn)
     {
         e.UsedBy.Remove(this);
     }
     DependentOn.Clear();
 }
Ejemplo n.º 3
0
        private Value VarEval(string s)
        {
            if (!s.Contains("."))
            {
                s = "data." + s;
            }
            var usedExpr = DataStorage.GetExpression(s);

            if (!IsWeak)
            {
                // used scalar expr
                if (usedExpr is ScalarExpression)
                {
                    if (usedExpr != this)
                    {
                        usedExpr.UsedBy.Add(this);
                        DependentOn.Add(usedExpr);
                    }
                }
                // used array expr
                else
                {
                    if (usedExpr != ParentArray)
                    {
                        // used i-th element of array expr
                        if (AllowedToAddToParent)
                        {
                            usedExpr.UsedBy.Add(ParentArray);
                            ParentArray.DependentOn.Add(usedExpr);
                        }
                        // used whole array expr
                        else if (ParentArray == null)
                        {
                            usedExpr.UsedBy.Add(this);
                            DependentOn.Add(usedExpr);
                        }
                    }
                }
            }
            return(usedExpr.CachedValue);
        }
Ejemplo n.º 4
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);
        }