private bool Insert(Computed update) { lock (this) { if (_computedHash != null) { _computedHash.Add(update); return(false); } if (WeakArray.Contains(ref _computedArray, update)) { return(false); } bool first = _computedArray == null; if (WeakArray.GetCount(ref _computedArray) >= _maxArraySize) { _computedHash = new WeakHashSet <Computed>(); foreach (var item in WeakArray.Enumerate <Computed>(_computedArray)) { _computedHash.Add(item); } _computedArray = null; _computedHash.Add(update); return(false); } WeakArray.Add(ref _computedArray, update); return(first); } }
/// <summary> /// Makes all direct and indirect dependents out of date. /// </summary> internal void MakeDependentsOutOfDate() { if (_computedArray != null) { foreach (var computed in WeakArray.Enumerate <Computed>(_computedArray).ToList()) { computed.MakeOutOfDate(); } } else if (_computedHash != null) { foreach (var computed in _computedHash.ToList()) { computed.MakeOutOfDate(); } } }