public static WeakNode GetAlive(WeakNode node) { while (node != null && !node.m_reference.IsAlive) { node = node.Next; } return(node); }
public void Add(TKey key, TValue value) { WeakNode node = new WeakNode(null, this); table.Add(key, node); node.node = list.AddLast(new KeyValue { Key = new WeakReference <TKey>(key), Value = value }); }
/// <summary> /// Adds an item to the begining (head) of the collection. /// </summary> /// <remarks>Potentially a lot faster than <see cref="Add"/>.</remarks> public void Insert(T item) { Contract.Requires <ArgumentNullException>(item != null); var node = new WeakNode(item); node.Next = m_head; m_head = node; }
private IEnumerator <WeakNode> GetNodeEnumerator() { var current = m_head = WeakNode.GetAlive(m_head); while (current != null) { yield return(current); current = current.Next = WeakNode.GetAlive(current.Next); } }
public void Add(T item) { Contract.Requires <ArgumentNullException>(item != null); var node = new WeakNode(item); var last = FuncEnumerable <WeakNode> .Get(GetNodeEnumerator).LastOrDefault(); if (last == null) { m_head = node; } else { last.Next = node; } }
public TValue this[TKey key] { get { clean(); WeakNode node; if (!table.TryGetValue(key, out node)) { throw new KeyNotFoundException(); } return(node.node.Value.Value); } set { clean(); WeakNode node = table.GetValue(key, create); KeyValue kv = node.node.Value; kv.Value = value; node.node.Value = kv; } }
public WeakNode(T value, WeakNode next = null) { Contract.Requires(value != null); m_reference = new WeakReference(value); Next = next; }