void StatisticsHistory::TimeAndValueQueue::ResizeSampleSet( int maxSamples, DataStructures::Queue<StatisticsHistory::TimeAndValue> &histogram, SHDataCategory dataCategory, Time timeClipStart, Time timeClipEnd ) { histogram.Clear(_FILE_AND_LINE_); if (maxSamples==0) return; Time timeRange = GetTimeRange(); if (timeRange==0) return; if (maxSamples==1) { StatisticsHistory::TimeAndValue tav; tav.time = timeRange; tav.val = GetRecentSum(); histogram.Push(tav, _FILE_AND_LINE_); return; } Time interval = timeRange / maxSamples; if (interval==0) interval=1; unsigned int dataIndex; Time timeBoundary; StatisticsHistory::TimeAndValue currentSum; Time currentTime; SHValueType numSamples; Time endTime; numSamples=0; endTime = values[values.Size()-1].time; dataIndex=0; currentTime=values[0].time; currentSum.val=0; currentSum.time=values[0].time + interval / 2; timeBoundary = values[0].time + interval; while (timeBoundary <= endTime) { while (dataIndex < values.Size() && values[dataIndex].time <= timeBoundary) { currentSum.val += values[dataIndex].val; dataIndex++; numSamples++; } if (dataCategory==DC_CONTINUOUS) { if (dataIndex > 0 && dataIndex < values.Size() && values[dataIndex-1].time < timeBoundary && values[dataIndex].time > timeBoundary) { SHValueType interpolatedValue = Interpolate(values[dataIndex-1], values[dataIndex], timeBoundary); currentSum.val+=interpolatedValue; numSamples++; } if (numSamples > 1) { currentSum.val /= numSamples; } } histogram.Push(currentSum, _FILE_AND_LINE_); currentSum.time=timeBoundary + interval / 2; timeBoundary += interval; currentSum.val=0; numSamples=0; } if ( timeClipStart!=0 && histogram.Size()>=1) { timeClipStart = histogram.Peek().time+timeClipStart; if (histogram.PeekTail().time < timeClipStart) { histogram.Clear(_FILE_AND_LINE_); } else if (histogram.Size()>=2 && histogram.Peek().time < timeClipStart) { StatisticsHistory::TimeAndValue tav; do { tav = histogram.Pop(); if (histogram.Peek().time == timeClipStart) { break; } else if (histogram.Peek().time > timeClipStart) { StatisticsHistory::TimeAndValue tav2; tav2.val = StatisticsHistory::TimeAndValueQueue::Interpolate(tav, histogram.Peek(), timeClipStart); tav2.time=timeClipStart; histogram.PushAtHead(tav2, 0, _FILE_AND_LINE_); break; } } while (histogram.Size()>=2); } } if ( timeClipEnd!=0 && histogram.Size()>=1) { timeClipEnd = histogram.PeekTail().time-timeClipEnd; if (histogram.Peek().time > timeClipEnd) { histogram.Clear(_FILE_AND_LINE_); } else if (histogram.Size()>=2 && histogram.PeekTail().time > timeClipEnd) { StatisticsHistory::TimeAndValue tav; do { tav = histogram.PopTail(); if (histogram.PeekTail().time == timeClipEnd) { break; } else if (histogram.PeekTail().time < timeClipEnd) { StatisticsHistory::TimeAndValue tav2; tav2.val = StatisticsHistory::TimeAndValueQueue::Interpolate(tav, histogram.PeekTail(), timeClipEnd); tav2.time=timeClipEnd; histogram.Push(tav2, _FILE_AND_LINE_); break; } } while (histogram.Size()>=2); } } }