private void AssertSegment(Segment segment)
 {
     Assert.IsTrue(segment.Range.From > 0);
     Assert.IsTrue(segment.Range.To > 0);
     Assert.IsTrue(segment.Range.From <= segment.Range.To);
     Assert.IsFalse(string.IsNullOrEmpty(segment.Name));
 }
 public void Insert(Segment segment)
 {
     if (_root == null)
     {
         _root = new SegmentTreeNode() { Range = segment.Range, Names = new List<string>() { segment.Name } };
     }
     else
     {
         DoInsert(_root, segment);
     }
 }
        private void DoInsert(SegmentTreeNode top, Segment segment)
        {
            var compareResult = segment.Range.CompareTo(top.Range);

            if (compareResult < 0)
            {
                AddLeftLeaf(top, segment);
            }
            else if (compareResult > 0)
            {
                AddRightLeaf(top, segment);
            }
            else
            {
                var intersection = RangeComparer.Intersect(top.Range, segment.Range);

                top.Range = intersection.Intersection;
                top.Names.Add(segment.Name);

                if (intersection.LeftSetDifference != null)
                {
                    AddLeftLeaf(top, new Segment() { Range = intersection.LeftSetDifference, Name = segment.Name });
                }
                if (intersection.RightSetDifference != null)
                {
                    AddRightLeaf(top, new Segment() { Range = intersection.RightSetDifference, Name = segment.Name });
                }
            }
        }
 private void AddRightLeaf(SegmentTreeNode top, Segment segment)
 {
     if (top.Right == null)
     {
         top.Right = new SegmentTreeNode()
         {
             Range = segment.Range,
             Names = new List<string>() { segment.Name }
         };
     }
     else
     {
         DoInsert(top.Right, segment);
     }
 }