示例#1
0
 public static IBTreeRange Intersect(BTreeRangeSingle single1, BTreeRangeSingle single2
     )
 {
     var first = BTreePointer.Max(single1.First(), single2.First());
     var end = BTreePointer.Min(single1.End(), single2.End());
     return single1.NewBTreeRangeSingle(first, end);
 }
示例#2
0
 public static IBTreeRange Intersect(BTreeRangeUnion union, BTreeRangeSingle single
     )
 {
     var collection = NewBTreeRangeSingleCollection();
     CollectIntersections(collection, union, single);
     return ToRange(collection);
 }
示例#3
0
        public static IBTreeRange Union(BTreeRangeUnion union, BTreeRangeSingle single)
        {
            if (single.IsEmpty())
            {
                return(union);
            }
            SortedCollection4 sorted = NewBTreeRangeSingleCollection();

            sorted.Add(single);
            BTreeRangeSingle range  = single;
            IEnumerator      ranges = union.Ranges();

            while (ranges.MoveNext())
            {
                BTreeRangeSingle current = (BTreeRangeSingle)ranges.Current;
                if (CanBeMerged(current, range))
                {
                    sorted.Remove(range);
                    range = Merge(current, range);
                    sorted.Add(range);
                }
                else
                {
                    sorted.Add(current);
                }
            }
            return(ToRange(sorted));
        }
示例#4
0
 public static IBTreeRange Union(BTreeRangeUnion union, BTreeRangeSingle single)
 {
     if (single.IsEmpty())
     {
         return union;
     }
     var sorted = NewBTreeRangeSingleCollection();
     sorted.Add(single);
     var range = single;
     var ranges = union.Ranges();
     while (ranges.MoveNext())
     {
         var current = (BTreeRangeSingle) ranges.Current;
         if (CanBeMerged(current, range))
         {
             sorted.Remove(range);
             range = Merge(current, range);
             sorted.Add(range);
         }
         else
         {
             sorted.Add(current);
         }
     }
     return ToRange(sorted);
 }
示例#5
0
        public static IBTreeRange Intersect(BTreeRangeSingle single1, BTreeRangeSingle single2
                                            )
        {
            BTreePointer first = BTreePointer.Max(single1.First(), single2.First());
            BTreePointer end   = BTreePointer.Min(single1.End(), single2.End());

            return(single1.NewBTreeRangeSingle(first, end));
        }
示例#6
0
        public static IBTreeRange Intersect(BTreeRangeUnion union, BTreeRangeSingle single
                                            )
        {
            SortedCollection4 collection = NewBTreeRangeSingleCollection();

            CollectIntersections(collection, union, single);
            return(ToRange(collection));
        }
示例#7
0
 private static void CollectIntersections(SortedCollection4 collection, BTreeRangeUnion
     union, BTreeRangeSingle single)
 {
     var ranges = union.Ranges();
     while (ranges.MoveNext())
     {
         var current = (BTreeRangeSingle) ranges.Current;
         if (single.Overlaps(current))
         {
             collection.Add(single.Intersect(current));
         }
     }
 }
示例#8
0
        public static IBTreeRange Intersect(BTreeRangeUnion union1, BTreeRangeUnion union2
                                            )
        {
            SortedCollection4 collection = NewBTreeRangeSingleCollection();
            IEnumerator       ranges     = union1.Ranges();

            while (ranges.MoveNext())
            {
                BTreeRangeSingle current = (BTreeRangeSingle)ranges.Current;
                CollectIntersections(collection, union2, current);
            }
            return(ToRange(collection));
        }
示例#9
0
        private static void CollectIntersections(SortedCollection4 collection, BTreeRangeUnion
                                                 union, BTreeRangeSingle single)
        {
            IEnumerator ranges = union.Ranges();

            while (ranges.MoveNext())
            {
                BTreeRangeSingle current = (BTreeRangeSingle)ranges.Current;
                if (single.Overlaps(current))
                {
                    collection.Add(single.Intersect(current));
                }
            }
        }
示例#10
0
 public static IBTreeRange Union(BTreeRangeSingle single1, BTreeRangeSingle single2
                                 )
 {
     if (single1.IsEmpty())
     {
         return(single2);
     }
     if (single2.IsEmpty())
     {
         return(single1);
     }
     if (CanBeMerged(single1, single2))
     {
         return(Merge(single1, single2));
     }
     return(new BTreeRangeUnion(new BTreeRangeSingle[] { single1, single2 }));
 }
示例#11
0
 private static BTreeRangeSingle Merge(BTreeRangeSingle range1, BTreeRangeSingle range2
                                       )
 {
     return(range1.NewBTreeRangeSingle(BTreePointer.Min(range1.First(), range2.First()
                                                        ), BTreePointer.Max(range1.End(), range2.End())));
 }
示例#12
0
 public BTreeRangeSingleIntersect(BTreeRangeSingle single) : base(single)
 {
 }
示例#13
0
 protected override IBTreeRange Execute(BTreeRangeSingle range)
 {
     return BTreeAlgebra.Intersect(_union, range);
 }
示例#14
0
 public static IBTreeRange Union(BTreeRangeSingle single1, BTreeRangeSingle single2
     )
 {
     if (single1.IsEmpty())
     {
         return single2;
     }
     if (single2.IsEmpty())
     {
         return single1;
     }
     if (CanBeMerged(single1, single2))
     {
         return Merge(single1, single2);
     }
     return new BTreeRangeUnion(new[] {single1, single2});
 }
示例#15
0
 protected override IBTreeRange Execute(BTreeRangeSingle single)
 {
     return BTreeAlgebra.Union(_single, single);
 }
示例#16
0
 public BTreeRangeSingleOperation(BTreeRangeSingle single)
 {
     _single = single;
 }
示例#17
0
 public void Visit(BTreeRangeSingle single)
 {
     _resultingRange = Execute(single);
 }
示例#18
0
 protected abstract IBTreeRange Execute(BTreeRangeSingle single);
示例#19
0
 private static bool CanBeMerged(BTreeRangeSingle range1, BTreeRangeSingle range2)
 {
     return range1.Overlaps(range2) || range1.Adjacent(range2);
 }
示例#20
0
 private static BTreeRangeSingle Merge(BTreeRangeSingle range1, BTreeRangeSingle range2
     )
 {
     return range1.NewBTreeRangeSingle(BTreePointer.Min(range1.First(), range2.First()
         ), BTreePointer.Max(range1.End(), range2.End()));
 }
示例#21
0
 private static bool CanBeMerged(BTreeRangeSingle range1, BTreeRangeSingle range2)
 {
     return(range1.Overlaps(range2) || range1.Adjacent(range2));
 }
示例#22
0
 public void Visit(BTreeRangeSingle single)
 {
     _resultingRange = Execute(single);
 }
示例#23
0
 public BTreeRangeSingleUnion(BTreeRangeSingle single) : base(single)
 {
 }
示例#24
0
 public BTreeRangeKeyIterator(BTreeRangeSingle range) : base(range)
 {
 }
 public BTreeRangeSingleOperation(BTreeRangeSingle single)
 {
     _single = single;
 }
示例#26
0
 public BTreeRangeSingleUnion(BTreeRangeSingle single) : base(single)
 {
 }
示例#27
0
 public BTreeRangePointerIterator(BTreeRangeSingle range) : base(range)
 {
 }
示例#28
0
 public BTreeRangeKeyIterator(BTreeRangeSingle range) : base(range)
 {
 }
示例#29
0
 public BTreeRangeSingleIntersect(BTreeRangeSingle single) : base(single)
 {
 }
示例#30
0
 protected abstract IBTreeRange Execute(BTreeRangeSingle single);
示例#31
0
 protected override IBTreeRange Execute(BTreeRangeSingle range)
 {
     return(BTreeAlgebra.Intersect(_union, range));
 }
示例#32
0
 protected override IBTreeRange Execute(BTreeRangeSingle single)
 {
     return(BTreeAlgebra.Union(_single, single));
 }
示例#33
0
 public BTreeRangePointerIterator(BTreeRangeSingle range) : base(range)
 {
 }