public List <Interval <T, D> > GetIntervals(D time, StubMode mode) { Build(); List <Interval <T, D> > stubedIntervals; switch (mode) { case StubMode.Contains: stubedIntervals = head.Stab(time, ContainConstrains.None); break; case StubMode.ContainsStart: stubedIntervals = head.Stab(time, ContainConstrains.IncludeStart); break; case StubMode.ContainsStartThenEnd: stubedIntervals = head.Stab(time, ContainConstrains.IncludeStart); if (stubedIntervals.Count == 0) { stubedIntervals = head.Stab(time, ContainConstrains.IncludeEnd); } break; default: throw new ArgumentException("Invalid StubMode " + mode, "mode"); } return(stubedIntervals); }
/// <summary> /// Perform a stabbing Query on the node /// </summary> /// <param name="time">the time to Query at</param> /// <returns>all stubedIntervals containing time</returns> public List <Interval <T, D> > Stab(D time, ContainConstrains constraint) { List <Interval <T, D> > result = new List <Interval <T, D> >(); foreach (var entry in intervals) { if (entry.Key.Contains(time, constraint)) { foreach (var interval in entry.Value) { result.Add(interval); } } else if (entry.Key.Start.CompareTo(time) > 0) { break; } } if (time.CompareTo(center) < 0 && leftNode != null) { result.AddRange(leftNode.Stab(time, constraint)); } else if (time.CompareTo(center) > 0 && rightNode != null) { result.AddRange(rightNode.Stab(time, constraint)); } return(result); }