protected SlidingWindow(TimeSpan slidingWindowLength, TimeSpan bucketLength, Func <DateTime> currentTimeProvider) { SlidingWindow.ValidateSlidingWindowAndBucketLength(slidingWindowLength, bucketLength); ExAssert.RetailAssert(currentTimeProvider != null, "Current time provider should not be null."); this.BucketLength = bucketLength; this.currentTimeProvider = currentTimeProvider; this.creationTime = this.currentTimeProvider(); this.NumberOfBuckets = (int)(slidingWindowLength.Ticks / this.BucketLength.Ticks); this.filled = new bool[this.NumberOfBuckets]; }
internal SegmentedSlidingCounter(TimeSpan[] segments, TimeSpan bucketLength, Func <DateTime> currentTimeProvider) { if (segments == null) { throw new ArgumentNullException("segments"); } if (segments.Length == 0) { throw new ArgumentException("segments cannot be empty"); } this.bucketLength = bucketLength; if (currentTimeProvider == null) { this.currentTimeProvider = new Func <DateTime>(this.GetCurrentTime); this.creationTime = this.RoundToBucketLength(DateTime.UtcNow); this.currentTime = this.creationTime; } else { this.currentTimeProvider = currentTimeProvider; this.creationTime = this.RoundToBucketLength(this.currentTimeProvider()); } this.numSegments = (long)segments.Length; this.numBucketsPerSegment = new long[this.numSegments]; this.segmentValues = new long[this.numSegments + 1L]; this.numBuckets = 0L; for (long num = 0L; num < this.numSegments; num += 1L) { long num2; checked { TimeSpan slidingWindowLength = segments[(int)((IntPtr)num)]; SlidingWindow.ValidateSlidingWindowAndBucketLength(slidingWindowLength, bucketLength); num2 = slidingWindowLength.Ticks / this.bucketLength.Ticks; this.numBucketsPerSegment[(int)((IntPtr)num)] = num2; } this.numBuckets += num2; } this.bucketValues = new long[this.numBuckets]; }