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(); }
public void Dealloc() { foreach (var e in DependentOn) { e.UsedBy.Remove(this); } DependentOn.Clear(); }
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); }
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); }