private static TimeLine AddRepeatingPattern(TimeLine timeLineIn, List<TimeLinePattern> patterns, TimeLineMinute defaultMinute, TimeSpan startTime, TimeSpan endTime) { TimeLine timeLine = timeLineIn; if (patterns.Count == 0) return timeLine; timeLine.IsDefault = false; TimeLine pattern = BuildTimeLine(patterns, defaultMinute); int pos = (int)startTime.TotalMinutes; int endPos = (int)endTime.TotalMinutes; int patPos = 0; while (pos < endPos) { // do not overwrite mandatory state // do not use an Unspecified state if (!timeLine.Minute[pos].Mandatory && pattern.Minute[patPos].State != TimeLineState.Unspecified) timeLine.Minute[pos++] = pattern.Minute[patPos++]; else { pos++; patPos++; } if (patPos >= pattern.Minute.Length) patPos = 0; } return timeLine; }
private static TimeLine BuildTimeLine(List<TimeLinePattern> patterns, TimeLineMinute defaultMinute) { TimeLine timeLine; timeLine.IsDefault = false; if (patterns.Count == 0) { timeLine.StartTime = TimeSpan.FromMinutes(0); timeLine.EndTime = TimeSpan.FromMinutes(0); timeLine.Duration = 0; timeLine.Minute = null; return timeLine; } timeLine.StartTime = patterns[0].StartTime; timeLine.EndTime = patterns[patterns.Count - 1].EndTime; timeLine.Duration = ((int)(timeLine.EndTime - timeLine.StartTime).TotalMinutes) + 1; timeLine.Minute = new TimeLineMinute[timeLine.Duration]; int curPos = 0; foreach (TimeLinePattern pattern in patterns) { int index = (int)(pattern.StartTime - timeLine.StartTime).TotalMinutes; int count = ((int)(pattern.EndTime - pattern.StartTime).TotalMinutes) + 1; while (curPos < index) timeLine.Minute[curPos++] = defaultMinute; while (curPos < (index + count)) timeLine.Minute[curPos++] = pattern.Minute; } return timeLine; }