示例#1
0
        public void Test1()
        {
            var segment = new LeafSegment(DataFun, true);

            Thread.Sleep(100);
            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(segment.NextId());
            }
        }
示例#2
0
文件: Program.cs 项目: sampsonye/Nice
        static void Main(string[] args)
        {
            var segment = new LeafSegment(DataFun /*DataFunByDb*/, true);

            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(segment.NextId());
            }

            Console.ReadLine();
        }
示例#3
0
 private ImmutableList <T> InsertImpl(int index, IEnumerable <T> items)
 {
     if (this.root == null)
     {
         return(new ImmutableList <T>(LeafSegment.MakeLeaf(items)));
     }
     else
     {
         var segs = this.root.Insert(index, items);
         if (segs.Length == 1)
         {
             return(new ImmutableList <T>(segs[0]));
         }
         else
         {
             return(new ImmutableList <T>(new TreeSegment(segs)));
         }
     }
 }
示例#4
0
            internal override Segment[] BalanceWith(Segment segment)
            {
                LeafSegment s1 = this;
                LeafSegment s2 = (LeafSegment)segment;

                if (s1.Count <= MinSize)
                {
                    if (s2.Count <= MaxSize)
                    {
                        return(MakeLeaves(s1.ToArray().Append(s2.ToArray())));
                    }
                    else
                    {
                        // borrow MinSize from s2
                        return(new Segment[]
                        {
                            MakeLeaf(s1.ToArray().Append(s2.GetRange(0, MinSize).ToArray())),
                            s2.GetRange(MinSize, s2.Count - MinSize)
                        });
                    }
                }
                else if (s2.Count <= MinSize)
                {
                    if (s1.Count <= MaxSize)
                    {
                        return(MakeLeaves(s1.ToArray().Append(s2.ToArray())));
                    }
                    else
                    {
                        // borrow MinSize from s1
                        return(new Segment[]
                        {
                            s1.GetRange(0, s1.Count - MinSize),
                            MakeLeaf(s1.GetRange(s1.Count - MinSize, MinSize).ToArray().Append(s2.ToArray()))
                        });
                    }
                }

                return(new Segment[] { s1, s2 });
            }
示例#5
0
 private IEnumerable <LeafSegment> GetLeafSegments()
 {
     if (this.root != null)
     {
         LeafSegment vs = this.root as LeafSegment;
         if (vs != null)
         {
             yield return(vs);
         }
         else
         {
             var stack = new Stack <IEnumerator <Segment> >();
             stack.Push(((IEnumerable <Segment>)((TreeSegment)this.root).Segments).GetEnumerator());
             while (stack.Count > 0)
             {
                 var en = stack.Peek();
                 if (en.MoveNext())
                 {
                     vs = en.Current as LeafSegment;
                     if (vs != null)
                     {
                         yield return(vs);
                     }
                     else
                     {
                         stack.Push(((IEnumerable <Segment>)((TreeSegment)en.Current).Segments).GetEnumerator());
                     }
                 }
                 else
                 {
                     stack.Pop();
                 }
             }
         }
     }
 }