示例#1
0
        public IIntentSegment <TypeOfValue> GetSegmentAt(TimeSpan intentRelativeTime)
        {
            IntentSegmentNode <TypeOfValue> segmentNode = _GetSegmentIntersecting(intentRelativeTime);

            if (segmentNode != null)
            {
                return(segmentNode.Segment);
            }
            return(null);
        }
示例#2
0
        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));
        }
示例#3
0
        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);
        }
示例#4
0
        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);
            }
        }
示例#5
0
 public int Compare(IntentSegmentNode <T> x, IntentSegmentNode <T> y)
 {
     return(x.CompareTo(y));
 }
示例#6
0
 public int CompareTo(IntentSegmentNode <T> other)
 {
     return(StartTime.CompareTo(other.StartTime));
 }
示例#7
0
        private void _Insert(IIntentSegment <TypeOfValue> segment, TimeSpan startTime)
        {
            IntentSegmentNode <TypeOfValue> segmentNode = new IntentSegmentNode <TypeOfValue>(segment, startTime);

            _segmentTimeIndex.Add(startTime, segmentNode);
        }
示例#8
0
 private TimeSpan _GetSegmentRelativeTime(IntentSegmentNode <TypeOfValue> segment, TimeSpan intentRelativeTime)
 {
     return(intentRelativeTime - segment.StartTime);
 }