示例#1
0
    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();
        }
    }
示例#2
0
    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);
    }