Example #1
0
        protected override Span NextSpan(Pointer.Type pointer)
        {
            var halfDay = RepeaterDay.DAY_SECONDS / 2;
            var fullDay = RepeaterDay.DAY_SECONDS;

            var now   = Now.Value;
            var tick  = Value;
            var first = false;

            if (_currentTime == null)
            {
                first = true;
                var midnight          = now.Date;
                var yesterdayMidnight = midnight.AddDays(-1);
                var tomorrowMidnight  = midnight.AddDays(1);

                var dstFix = (midnight - midnight.ToUniversalTime()).Seconds -
                             (tomorrowMidnight - tomorrowMidnight.ToUniversalTime()).Seconds;

                var        done           = false;
                DateTime[] candidateDates = null;

                if (pointer == Pointer.Type.Future)
                {
                    candidateDates = tick.IsAmbiguous
                        ? new DateTime[]
                    {
                        midnight.AddSeconds(tick.ToInt32() + dstFix),
                        midnight.AddSeconds(tick.ToInt32() + halfDay + dstFix),
                        tomorrowMidnight.AddSeconds(tick.ToInt32())
                    }
                        : new DateTime[]
                    {
                        midnight.AddSeconds(tick.ToInt32() + dstFix),
                        tomorrowMidnight.AddSeconds(tick.ToInt32())
                    };

                    foreach (var date in candidateDates)
                    {
                        if (date >= now)
                        {
                            _currentTime = date;
                            done         = true;
                            break;
                        }
                    }
                }
                else
                {
                    candidateDates = tick.IsAmbiguous
                        ? new DateTime[]
                    {
                        midnight.AddSeconds(tick.ToInt32() + halfDay + dstFix),
                        midnight.AddSeconds(tick.ToInt32() + dstFix),
                        yesterdayMidnight.AddSeconds(tick.ToInt32() + halfDay)
                    }
                        : new DateTime[]
                    {
                        midnight.AddSeconds(tick.ToInt32() + dstFix),
                        yesterdayMidnight.AddSeconds(tick.ToInt32())
                    };

                    foreach (var date in candidateDates)
                    {
                        if (date <= now)
                        {
                            _currentTime = date;
                            done         = true;
                            break;
                        }
                    }
                }


                if (!done && _currentTime == null)
                {
                    throw new IllegalStateException(
                              "Current time cannot be null at this point.");
                }
            }

            if (!first)
            {
                var increment = tick.IsAmbiguous ? halfDay : fullDay;
                var direction = (int)pointer;
                _currentTime = _currentTime.Value.AddSeconds(direction * increment);
            }

            return(new Span(_currentTime.Value,
                            _currentTime.Value.AddSeconds(GetWidth())));
        }
Example #2
0
 protected abstract Span NextSpan(Pointer.Type pointer);
Example #3
0
        public override Span GetOffset(Span span, int amount, Pointer.Type pointer)
        {
            var direction = (int)pointer;

            return(span.Add(direction * amount * DAY_SECONDS));
        }
Example #4
0
 public override Span GetOffset(Span span, int amount,
                                Pointer.Type pointer)
 {
     throw new NotImplementedException();
 }
 protected override Span CurrentSpan(Pointer.Type pointer)
 {
     throw new NotImplementedException();
 }
Example #6
0
        public override Span GetOffset(Span span, int amount, Pointer.Type pointer)
        {
            var direction = (pointer == Pointer.Type.Future) ? 1 : -1;

            return(span.Add(direction * amount * RepeaterWeek.WEEK_SECONDS));
        }
Example #7
0
        protected override Span NextSpan(Pointer.Type pointer)
        {
            var now = Now.Value;

            if (_currentMonthBegin == null)
            {
                var index = GetMonthIndex();

                if (pointer == Pointer.Type.Future)
                {
                    if (now.Month < index)
                    {
                        _currentMonthBegin = Time.New(Now.Value.Year, index);
                    }
                    else if (now.Month > index)
                    {
                        _currentMonthBegin = Time.New(Now.Value.Year + 1, index);
                    }
                }
                else if (pointer == Pointer.Type.None)
                {
                    if (now.Month <= index)
                    {
                        _currentMonthBegin = Time.New(Now.Value.Year, index);
                    }
                    else if (now.Month > index)
                    {
                        _currentMonthBegin = Time.New(Now.Value.Year + 1, index);
                    }
                }
                else if (pointer == Pointer.Type.Past)
                {
                    if (now.Month >= index)
                    {
                        _currentMonthBegin = Time.New(Now.Value.Year, index);
                    }
                    else if (now.Month < index)
                    {
                        _currentMonthBegin = Time.New(Now.Value.Year - 1, index);
                    }
                }
                else
                {
                    throw new ArgumentException(
                              "Unable to handle pointer " + pointer + ".");
                }
                if (_currentMonthBegin == null)
                {
                    throw new IllegalStateException(
                              "Current month should be set by now.");
                }
            }
            else
            {
                if (pointer == Pointer.Type.Future)
                {
                    _currentMonthBegin = Time.New(_currentMonthBegin.Value.Year + 1, _currentMonthBegin.Value.Month);
                }
                else if (pointer == Pointer.Type.Past)
                {
                    _currentMonthBegin = Time.New(_currentMonthBegin.Value.Year - 1, _currentMonthBegin.Value.Month);
                }
                else
                {
                    throw new ArgumentException(
                              "Unable to handle pointer " + pointer + ".");
                }
            }

            var cur_month_year   = _currentMonthBegin.Value.Year;
            var cur_month_month  = _currentMonthBegin.Value.Month;
            var next_month_year  = 0;
            var next_month_month = 0;

            if (cur_month_month == 12)
            {
                next_month_year  = cur_month_year + 1;
                next_month_month = 1;
            }
            else
            {
                next_month_year  = cur_month_year;
                next_month_month = cur_month_month + 1;
            }

            return(new Span(_currentMonthBegin.Value,
                            Time.New(next_month_year, next_month_month)));
        }
Example #8
0
        public override Span GetOffset(Span span, int amount, Pointer.Type pointer)
        {
            int direction = (pointer == Pointer.Type.Future) ? 1 : -1;

            return(span.Add(direction * amount * RepeaterMinute.MINUTE_SECONDS));
        }
        public static Span GetAnchor(this IEnumerable <Token> @this,
                                     Options options)
        {
            var grabber = new Grabber(Grabber.Type.This);

            Pointer.Type pointer = Pointer.Type.Future;
            List <Token> tokens  = @this.ToList();

            IList <IRepeater> repeaters = tokens.GetRepeaters();

            for (int i = 0; i < repeaters.Count; i++)
            {
                tokens.RemoveAt(tokens.Count - 1);
            }

            if (tokens.Count > 0 && tokens[0].IsTaggedAs <Grabber>())
            {
                grabber = tokens[0].GetTag <Grabber>();
                tokens.RemoveAt(tokens.Count - 1);
            }

            IRepeater head = repeaters[0];

            repeaters.RemoveAt(0);

            head.Now = options.Clock();

            Span outerSpan;

            Grabber.Type grabberType = grabber.Value;
            if (grabberType == Grabber.Type.Last)
            {
                outerSpan = head.GetNextSpan(Pointer.Type.Past);
            }
            else if (grabberType == Grabber.Type.This)
            {
                if (repeaters.Count > 0)
                {
                    outerSpan = head.GetCurrentSpan(Pointer.Type.None);
                }
                else
                {
                    outerSpan = head.GetCurrentSpan(options.Context);
                }
            }
            else if (grabberType == Grabber.Type.Next)
            {
                outerSpan = head.GetNextSpan(Pointer.Type.Future);
            }
            else
            {
                throw new ArgumentException("Invalid grabber type " +
                                            grabberType + ".");
            }

            Logger.Log(() => "Handler-class: " + head.GetType().Name);
            Logger.Log(() => "--" + outerSpan.ToString());
            Span anchor = repeaters.FindWithin(outerSpan, pointer, options);

            return(anchor);
        }
Example #10
0
 public override Span GetOffset(Span span, int amount, Pointer.Type pointer)
 {
     throw new IllegalStateException("Not implemented.");
 }
Example #11
0
        protected override Span CurrentSpan(Pointer.Type pointer)
        {
            var now = Now.Value;

            return(new Span(now, now.AddSeconds(1)));
        }
Example #12
0
 protected override Span NextSpan(Pointer.Type pointer)
 {
     throw new System.NotImplementedException();
 }
Example #13
0
        protected override Span NextSpan(Pointer.Type pointer)
        {
            var      range = GetRange(Value);
            DateTime rangeStart;
            DateTime rangeEnd;

            if (_currentSpan == null)
            {
                var now        = Now.Value;
                var nowSeconds = (long)Math.Truncate(now.TimeOfDay.TotalSeconds);

                if (nowSeconds < range.StartSecond)
                {
                    if (pointer == Pointer.Type.Future)
                    {
                        rangeStart = now.Date.AddSeconds(range.StartSecond);
                    }
                    else if (pointer == Pointer.Type.Past)
                    {
                        rangeStart = now.Date.AddDays(-1).AddSeconds(range.StartSecond);
                    }
                    else
                    {
                        throw new ArgumentException("Unable to handle pointer type " + pointer, "pointer");
                    }
                }
                else if (nowSeconds > range.EndSecond)
                {
                    if (pointer == Pointer.Type.Future)
                    {
                        rangeStart = now.Date.AddDays(1).AddSeconds(range.StartSecond);
                    }
                    else if (pointer == Pointer.Type.Past)
                    {
                        rangeStart = now.Date.AddSeconds(range.StartSecond);
                    }
                    else
                    {
                        throw new ArgumentException("Unable to handle pointer type " + pointer, "pointer");
                    }
                }
                else
                {
                    if (pointer == Pointer.Type.Future)
                    {
                        rangeStart = now.Date.AddDays(1).AddSeconds(range.StartSecond);
                    }
                    else if (pointer == Pointer.Type.Past)
                    {
                        rangeStart = now.Date.AddSeconds(range.StartSecond);
                    }
                    else
                    {
                        throw new ArgumentException("Unable to handle pointer type " + pointer, "pointer");
                    }
                }

                _currentSpan = new Span(rangeStart, rangeStart.AddSeconds(range.Width));
            }
            else
            {
                if (pointer == Pointer.Type.Future)
                {
                    _currentSpan = _currentSpan.Add(FULL_DAY_SECONDS);
                }
                else if (pointer == Pointer.Type.Past)
                {
                    _currentSpan = _currentSpan.Add(-FULL_DAY_SECONDS);
                }
                else
                {
                    throw new ArgumentException("Unable to handle pointer type " + pointer, "pointer");
                }
            }
            return(_currentSpan);
        }
Example #14
0
 protected abstract Span CurrentSpan(Pointer.Type pointer);
 protected override Span NextSpan(Pointer.Type pointer)
 {
     throw new IllegalStateException("Not implemented.");
 }
Example #16
0
 public abstract Span GetOffset(Span span, int amount, Pointer.Type pointer);
Example #17
0
        public override Span GetOffset(Span span, int amount, Pointer.Type pointer)
        {
            var direction = pointer == Pointer.Type.Future ? 1 : -1;

            return(span.Add(direction * amount * MINUTE_SECONDS));
        }