public void Test1() { var segment = new LeafSegment(DataFun, true); Thread.Sleep(100); for (int i = 0; i < 100000; i++) { Console.WriteLine(segment.NextId()); } }
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(); }
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))); } } }
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 }); }
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(); } } } } }