Ejemplo n.º 1
0
        internal TrieSegment Add(string newPrefix)
        {
            TrieSegment segment;

            if (newPrefix.Length <= 0)
            {
                return(this.Root);
            }
            this.EnsureRoot();
            TrieTraverser traverser = new TrieTraverser(this.root, newPrefix);

Label_0024:
            segment = traverser.Segment;
            if (traverser.MoveNextByFirstChar())
            {
                int num;
                if ((segment != null) && (-1 != (num = traverser.Segment.FindDivergence(newPrefix, traverser.Offset, traverser.Length))))
                {
                    traverser.Segment = segment.SplitChild(traverser.SegmentIndex, num);
                }
                goto Label_0024;
            }
            if (traverser.Length > 0)
            {
                traverser.Segment = segment.AddChild(new TrieSegment(newPrefix, traverser.Offset, traverser.Length));
                goto Label_0024;
            }
            this.hasDescendants = true;
            return(segment);
        }
        TrieSegment Find(string prefix)
        {
            Fx.Assert(null != prefix, "");

            if (0 == prefix.Length)
            {
                return(this.Root);
            }

            if (!this.HasDescendants)
            {
                return(null);
            }

            TrieTraverser traverser    = new TrieTraverser(this.root, prefix); // struct
            TrieSegment   foundSegment = null;

            while (traverser.MoveNext())
            {
                foundSegment = traverser.Segment;
            }
            if (traverser.Length > 0)
            {
                // We haven't used up the entire prefix in this search. Clearly, we didn't find the matching node
                return(null);
            }
            return(foundSegment);
        }
 private void Match(int valIndex, string segment, QueryBranchResultSet results)
 {
     TrieTraverser traverser = new TrieTraverser(this.trie.Root, segment);
     while (traverser.MoveNext())
     {
         object data = traverser.Segment.Data;
         if (data != null)
         {
             results.Add((QueryBranch) data, valIndex);
         }
     }
 }
        private void Match(int valIndex, string segment, QueryBranchResultSet results)
        {
            TrieTraverser traverser = new TrieTraverser(this.trie.Root, segment);

            while (traverser.MoveNext())
            {
                object data = traverser.Segment.Data;
                if (data != null)
                {
                    results.Add((QueryBranch)data, valIndex);
                }
            }
        }
        internal TrieSegment Add(string newPrefix)
        {
            if (newPrefix.Length <= 0)
            {
                return(this.Root);
            }

            this.EnsureRoot();
            TrieTraverser traverser = new TrieTraverser(this.root, newPrefix); // struct
            TrieSegment   parent;
            int           indexDivergence;

            while (true)
            {
                parent = traverser.Segment;
                if (traverser.MoveNextByFirstChar())
                {
                    // There is a child segment that starts with the same character as the remainder of newPrefix
                    // We have a shared segment
                    // How much does newPrefix share with the current segment? Find the point at which they diverge
                    if (null != parent && -1 != (indexDivergence = traverser.Segment.FindDivergence(newPrefix, traverser.Offset, traverser.Length)))
                    {
                        // Segments diverge at character # 'indexDivergence'. newPrefix will share the segment upto
                        // that character. Beyond that character, we will now have 2 child segments:
                        // - one for the portion of the current segment that diverged
                        // - one for the portion of the new segment that diverged

                        // Split the current segment into a shared part and a child containing the remainder of the segment..
                        traverser.Segment = parent.SplitChild(traverser.SegmentIndex, indexDivergence);
                    }
                }
                else
                {
                    if (traverser.Length <= 0)
                    {
                        // The entire new prefix has been added to the tree
                        break;
                    }
                    // No existing segment to share. Add a new one
                    traverser.Segment = parent.AddChild(new TrieSegment(newPrefix, traverser.Offset, traverser.Length));
                }
            }

            this.hasDescendants = true;

            return(parent);
        }
Ejemplo n.º 6
0
        private TrieSegment Find(string prefix)
        {
            if (prefix.Length == 0)
            {
                return(this.Root);
            }
            if (!this.HasDescendants)
            {
                return(null);
            }
            TrieTraverser traverser = new TrieTraverser(this.root, prefix);
            TrieSegment   segment   = null;

            while (traverser.MoveNext())
            {
                segment = traverser.Segment;
            }
            if (traverser.Length > 0)
            {
                return(null);
            }
            return(segment);
        }