public void FindLeftmost(FilterNodeDelegate <TKey, TValue> filterNode, FilterNodeEffectDelegate <TKey, TValue> filterNodeEffect) { while (true) { if (_leftmostItem == null) { return; } if (filterNode(_leftmostItem)) { return; } if (filterNodeEffect != null) { filterNodeEffect(_leftmostItem); } RemoveLeftmost(); } }
public List <TValue> GetValues(FilterNodeDelegate <TKey, TValue> filterNode, FilterNodeEffectDelegate <TKey, TValue> filterNodeEffect = null, bool removeNodesMarkedForRemoval = false) { #if DEBUG int removedValues = 0; int ignoredValues = 0; int addedValues = 0; #endif List <TValue> values = new List <TValue>(Count); // Copy items to list from leftmost to rightmost, marking all inserted items along the way BinaryTreeNode <TKey, TValue> currentNode = _leftmostItem; while (currentNode != null) { if ((currentNode.Left != null) && (!currentNode.Left.Marked)) { currentNode = currentNode.Left; continue; } if (!currentNode.Marked) { if (filterNode(currentNode)) { values.Add(currentNode.Value); #if DEBUG addedValues++; #endif } else { if (filterNodeEffect != null) { filterNodeEffect(currentNode); } if (currentNode.MarkedForRemoval) { if (removeNodesMarkedForRemoval) { RemoveNode(currentNode); } currentNode.MarkedForRemoval = false; #if DEBUG removedValues++; #endif } else { #if DEBUG ignoredValues++; #endif } } currentNode.Marked = true; } if ((currentNode.Right != null) && (!currentNode.Right.Marked)) { currentNode = currentNode.Right; continue; } currentNode = currentNode.Parent; } #if DEBUG float totalValues = addedValues + ignoredValues + removedValues; float percentAdded = addedValues / totalValues; float percentIgnored = ignoredValues / totalValues; float percentRemoved = removedValues / totalValues; Debug.Log("Total Events: " + totalValues + ". Serialized: " + percentAdded.ToString("P") + ", Ignored: " + percentIgnored.ToString("P") + ", Removed: " + percentRemoved.ToString("P")); #endif // // Remove mark from all copied items // currentNode = _leftmostItem; while (currentNode != null) { if ((currentNode.Left != null) && (currentNode.Left.Marked)) { currentNode = currentNode.Left; continue; } currentNode.Marked = false; if ((currentNode.Right != null) && (currentNode.Right.Marked)) { currentNode = currentNode.Right; continue; } currentNode = currentNode.Parent; } return(values); }