protected override TMath GetFirst() { Interval <TMath, TSize> interval = _interval; // When anchor is set, start the interval at the next anchor position. if (_isAnchorSet) { TSize anchorDiff = Operator <TMath, TSize> .Subtract(_interval.Start, _anchor); double stepSize = Interval <TMath, TSize> .ConvertSizeToDouble(_step); double diff = Math.Abs(Interval <TMath, TSize> .ConvertSizeToDouble(anchorDiff)) % stepSize; if (diff > 0) { if (_anchor.CompareTo(_interval.Start) < 0) { diff = stepSize - diff; } TSize addition = Interval <TMath, TSize> .ConvertDoubleToSize(diff); interval = new Interval <TMath, TSize>( Operator <TMath, TSize> .AddSize(_interval.Start, addition), true, _interval.End, _interval.IsEndIncluded); } } // When first value doesn't lie in interval, immediately step. return(interval.IsStartIncluded ? interval.Start : Operator <TMath, TSize> .AddSize(interval.Start, _step)); }
protected override bool HasMoreElements(int enumeratedAlready, TMath previous) { if (Interval <TMath, TSize> .ConvertSizeToDouble(_step) == 0 && enumeratedAlready == 1) { return(false); } return(_interval.LiesInInterval(Operator <TMath, TSize> .AddSize(previous, _step))); }
protected override bool HasElements() { bool nextInInterval = _interval.LiesInInterval(Operator <TMath, TSize> .AddSize(_interval.Start, _step)); return(_interval.IsStartIncluded || nextInInterval); }
protected override TMath GetNext(int enumeratedAlready, TMath previous) { return(Operator <TMath, TSize> .AddSize(previous, _step)); }
static T AddSize <T, TSize>(T start, TSize addition) { return(Operator <T, TSize> .AddSize(start, addition)); }