コード例 #1
0
        public void add(int weight, T key)
        {
            NestedNode node = new NestedNode();

            node.weight = weight;
            node.key    = key;
            allNodes.Add(node);
            int size        = allNodes.Count;
            int current     = size - 1;
            int parentIndex = (current - 1) / 2;

            nodePosition[node.key] = current;

            while (parentIndex >= 0)
            {
                NestedNode parentNode  = allNodes[parentIndex];
                NestedNode currentNode = allNodes[current];
                if (parentNode.weight > currentNode.weight)
                {
                    swap(parentNode, currentNode);
                    updatePositionOnMap(parentNode.key, currentNode.key, parentIndex, current);
                    current     = parentIndex;
                    parentIndex = (parentIndex - 1) / 2;
                }
                else
                {
                    break;
                }
            }
        }
コード例 #2
0
        private void swap(NestedNode parentNode, NestedNode currentNode)
        {
            int weight = parentNode.weight;
            T   data   = parentNode.key;

            parentNode.key    = currentNode.key;
            parentNode.weight = currentNode.weight;

            currentNode.key    = data;
            currentNode.weight = weight;
        }
コード例 #3
0
        public NestedNode extractMinNode()
        {
            int        size    = allNodes.Count - 1;
            NestedNode minNode = new NestedNode();

            minNode.key    = allNodes[0].key;
            minNode.weight = allNodes[0].weight;

            int lastNodeWeight = allNodes[size].weight;

            allNodes[0].weight = lastNodeWeight;
            allNodes[0].key    = allNodes[size].key;
            nodePosition.Remove(minNode.key);
            nodePosition.Remove(allNodes[0].key);
            nodePosition.Add(allNodes[0].key, 0);
            allNodes.Remove(allNodes[size]);

            int currentIndex = 0;

            size--;
            while (true)
            {
                int left  = 2 * currentIndex + 1;
                int right = 2 * currentIndex + 2;
                if (left > size)
                {
                    break;
                }
                if (right > size)
                {
                    right = left;
                }
                int smallerIndex = allNodes[left].weight <= allNodes[right].weight ? left : right;
                if (allNodes[currentIndex].weight > allNodes[smallerIndex].weight)
                {
                    swap(allNodes[currentIndex], allNodes[smallerIndex]);
                    updatePositionOnMap(allNodes[currentIndex].key, allNodes[smallerIndex].key, currentIndex,
                                        smallerIndex);
                    currentIndex = smallerIndex;
                }
                else
                {
                    break;
                }
            }
            return(minNode);
        }
コード例 #4
0
        } // end _VerifyParamsAndBuildFullTypeName()

        public override bool Matches(DbgTemplateNode other)
        {
            // Special typename wildcard:
            if (IsEitherNameSingleTypeWildcard(other.FullName, FullName))
            {
                return(true);
            }

            if (!other.IsTemplate)
            {
                return(false);
            }

            DbgTemplate dtOther = (DbgTemplate)other;

            // TODO: PS Wildcard? Regex?
            if (0 != Util.Strcmp_OI(dtOther.TemplateName, TemplateName))
            {
                return(false);
            }

            for (int i = 0; i < dtOther.Parameters.Count; i++)
            {
                if (i >= Parameters.Count)
                {
                    return(false);
                }

                // Special typename wildcard:
                if (IsMultiMatchWildcard(dtOther.Parameters[i]))
                {
                    if (i != (dtOther.Parameters.Count - 1))
                    {
                        Util.Fail("Not reachable.");   // construction of such now disallowed.
                        throw new ArgumentException(Util.Sprintf("The '{0}' placeholder can only come last in a template parameter list.",
                                                                 c_MultiTypeWildcard),
                                                    "other");
                    }
                    break;
                }

                // Special typename wildcard:
                if (IsMultiMatchWildcard(Parameters[i]))
                {
                    if (i != (Parameters.Count - 1))
                    {
                        throw new ArgumentException(Util.Sprintf("The '{0}' placeholder can only come last in a template parameter list.",
                                                                 c_MultiTypeWildcard),
                                                    "this");
                    }

                    break;
                }

                if (!Parameters[i].Matches(dtOther.Parameters[i]))
                {
                    return(false);
                }
            }

            if ((null == NestedNode) != (null == dtOther.NestedNode))
            {
                // One has a nested node, and the other doesn't.
                return(false);
            }

            if (null != NestedNode)
            {
                return(NestedNode.Matches(dtOther.NestedNode));
            }
            else
            {
                return(true);
            }
        } // end Matches()
コード例 #5
0
        public T extractMin()
        {
            NestedNode node = extractMinNode();

            return(node.key);
        }