public IIntentSegment <TypeOfValue> GetSegmentAt(TimeSpan intentRelativeTime) { IntentSegmentNode <TypeOfValue> segmentNode = _GetSegmentIntersecting(intentRelativeTime); if (segmentNode != null) { return(segmentNode.Segment); } return(null); }
public TypeOfValue GetStateAt(TimeSpan intentRelativeTime) { IntentSegmentNode <TypeOfValue> segmentNode = _GetSegmentIntersecting(intentRelativeTime); if (segmentNode != null) { TimeSpan segmentRelativeTime = _GetSegmentRelativeTime(segmentNode, intentRelativeTime); return(segmentNode.Segment.GetStateAt(segmentRelativeTime)); } return(default(TypeOfValue)); }
private IntentSegmentNode <TypeOfValue> _GetSegmentIntersecting(TimeSpan intentRelativeTime) { //Linear search. Just ugly. //return _segmentTimeIndex.Values.FirstOrDefault(x => TimeNode.IntersectsExclusively(x, intentRelativeTime)); //Trying to squeak a little bit more out of this by using a for loop instead of LINQ //since we have a concrete, non-deferred collection. for (int i = 0; i < _segmentTimeIndex.Count; i++) { IntentSegmentNode <TypeOfValue> segmentNode = _segmentTimeIndex[_segmentTimeIndex.Keys[i]]; if (TimeNode.IntersectsExclusively(segmentNode, intentRelativeTime)) { return(segmentNode); } } return(null); }
public void FractureAt(TimeSpan intentRelativeTime) { IntentSegmentNode <TypeOfValue> segmentNode = _GetSegmentIntersecting(intentRelativeTime); if (segmentNode == null) { return; } TimeSpan segmentRelativeTime = _GetSegmentRelativeTime(segmentNode, intentRelativeTime); TypeOfValue valueAtTimePoint = segmentNode.Segment.GetStateAt(segmentRelativeTime); IIntentSegment <TypeOfValue> leftSegment = _CreateSegment(segmentNode.Segment.StartValue, valueAtTimePoint, segmentRelativeTime); IIntentSegment <TypeOfValue> rightSegment = _CreateSegment(valueAtTimePoint, segmentNode.Segment.EndValue, segmentNode.Segment.TimeSpan - segmentRelativeTime); if (leftSegment != null && rightSegment != null) { _RemoveAt(segmentNode.StartTime); _Insert(leftSegment, segmentNode.StartTime); _Insert(rightSegment, segmentNode.StartTime + segmentRelativeTime); } }
public int Compare(IntentSegmentNode <T> x, IntentSegmentNode <T> y) { return(x.CompareTo(y)); }
public int CompareTo(IntentSegmentNode <T> other) { return(StartTime.CompareTo(other.StartTime)); }
private void _Insert(IIntentSegment <TypeOfValue> segment, TimeSpan startTime) { IntentSegmentNode <TypeOfValue> segmentNode = new IntentSegmentNode <TypeOfValue>(segment, startTime); _segmentTimeIndex.Add(startTime, segmentNode); }
private TimeSpan _GetSegmentRelativeTime(IntentSegmentNode <TypeOfValue> segment, TimeSpan intentRelativeTime) { return(intentRelativeTime - segment.StartTime); }