123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #pragma once
- #include "histogram.h"
- struct hdr_iter;
- namespace NHdr {
- /**
- * Used for iterating through histogram values.
- */
- class TBaseHistogramIterator {
- public:
- /**
- * Iterate to the next value for the iterator. If there are no more values
- * available return false.
- *
- * @return 'false' if there are no values remaining for this iterator.
- */
- bool Next();
- /**
- * @return Raw index into the counts array.
- */
- i32 GetCountsIndex() const;
- /**
- * @return Snapshot of the length at the time the iterator is created.
- */
- i32 GetTotalCount() const;
- /**
- * @return Value directly from array for the current countsIndex.
- */
- i64 GetCount() const;
- /**
- * @return Sum of all of the counts up to and including the count at
- * this index.
- */
- i64 GetCumulativeCount() const;
- /**
- * @return The current value based on countsIndex.
- */
- i64 GetValue() const;
- /**
- * @return The highest value that is equivalent to the current value
- * within the histogram's resolution.
- */
- i64 GetHighestEquivalentValue() const;
- /**
- * @return The lowest value that is equivalent to the current value
- * within the histogram's resolution.
- */
- i64 GetLowestEquivalentValue() const;
- /**
- * @return The value lies in the middle (rounded up) of the range of
- * values equivalent the current value.
- */
- i64 GetMedianEquivalentValue() const;
- /**
- * @return The actual value level that was iterated from by the iterator.
- */
- i64 GetValueIteratedFrom() const;
- /**
- * @return The actual value level that was iterated to by the iterator.
- */
- i64 GetValueIteratedTo() const;
- protected:
- // must not be instantiated directly
- TBaseHistogramIterator();
- ~TBaseHistogramIterator();
- protected:
- THolder<hdr_iter> Iter_;
- };
- /**
- * Used for iterating through histogram values using the finest granularity
- * steps supported by the underlying representation. The iteration steps
- * through all possible unit value levels, regardless of whether or not there
- * were recorded values for that value level, and terminates when all recorded
- * histogram values are exhausted.
- */
- class TAllValuesIterator: public TBaseHistogramIterator {
- public:
- /**
- * @param histogram The histogram this iterator will operate on
- */
- explicit TAllValuesIterator(const THistogram& histogram);
- };
- /**
- * Used for iterating through all recorded histogram values using the finest
- * granularity steps supported by the underlying representation. The iteration
- * steps through all non-zero recorded value counts, and terminates when all
- * recorded histogram values are exhausted.
- */
- class TRecordedValuesIterator: public TBaseHistogramIterator {
- public:
- /**
- * @param histogram The histogram this iterator will operate on
- */
- explicit TRecordedValuesIterator(const THistogram& histogram);
- /**
- * @return The count of recorded values in the histogram that were added
- * to the totalCount as a result on this iteration step. Since
- * multiple iteration steps may occur with overlapping equivalent
- * value ranges, the count may be lower than the count found at
- * the value (e.g. multiple linear steps or percentile levels can
- * occur within a single equivalent value range).
- */
- i64 GetCountAddedInThisIterationStep() const;
- };
- /**
- * Used for iterating through histogram values according to percentile levels.
- * The iteration is performed in steps that start at 0% and reduce their
- * distance to 100% according to the <i>percentileTicksPerHalfDistance</i>
- * parameter, ultimately reaching 100% when all recorded histogram
- * values are exhausted.
- */
- class TPercentileIterator: public TBaseHistogramIterator {
- public:
- /**
- * @param histogram The histogram this iterator will operate on
- * @param ticksPerHalfDistance The number of equal-sized iteration steps
- * per half-distance to 100%.
- */
- TPercentileIterator(const THistogram& histogram, ui32 ticksPerHalfDistance);
- /**
- * @return The number of equal-sized iteration steps per half-distance
- * to 100%.
- */
- i32 GetTicketsPerHalfDistance() const;
- double GetPercentileToIterateTo() const;
- /**
- * @return The percentile of recorded values in the histogram at values
- * equal or smaller than valueIteratedTo.
- *
- */
- double GetPercentile() const;
- };
- /**
- * Used for iterating through histogram values in linear steps. The iteration
- * is performed in steps of <i>valueUnitsPerBucket</i> in size, terminating
- * when all recorded histogram values are exhausted. Note that each iteration
- * "bucket" includes values up to and including the next bucket boundary value.
- */
- class TLinearIterator: public TBaseHistogramIterator {
- public:
- /**
- * @param histogram The histogram this iterator will operate on
- * @param valueUnitsPerBucket The size (in value units) of each bucket
- * iteration.
- */
- TLinearIterator(const THistogram& histogram, i64 valueUnitsPerBucket);
- /**
- * @return The size (in value units) of each bucket iteration.
- */
- i64 GetValueUnitsPerBucket() const;
- /**
- * @return The count of recorded values in the histogram that were added
- * to the totalCount as a result on this iteration step. Since
- * multiple iteration steps may occur with overlapping equivalent
- * value ranges, the count may be lower than the count found at
- * the value (e.g. multiple linear steps or percentile levels can
- * occur within a single equivalent value range).
- */
- i64 GetCountAddedInThisIterationStep() const;
- i64 GetNextValueReportingLevel() const;
- i64 GetNextValueReportingLevelLowestEquivalent() const;
- };
- /**
- * Used for iterating through histogram values in logarithmically increasing
- * levels. The iteration is performed in steps that start at
- * <i>valueUnitsInFirstBucket</i> and increase exponentially according to
- * <i>logBase</i>, terminating when all recorded histogram values are
- * exhausted. Note that each iteration "bucket" includes values up to and
- * including the next bucket boundary value.
- */
- class TLogarithmicIterator: public TBaseHistogramIterator {
- public:
- /**
- * @param histogram The histogram this iterator will operate on
- * @param valueUnitsInFirstBucket the size (in value units) of the first
- * value bucket step
- * @param logBase the multiplier by which the bucket size is expanded in
- * each iteration step.
- */
- TLogarithmicIterator(
- const THistogram& histogram, i64 valueUnitsInFirstBucket,
- double logBase);
- /**
- * @return The multiplier by which the bucket size is expanded in each
- * iteration step.
- */
- double GetLogBase() const;
- /**
- * @return The count of recorded values in the histogram that were added
- * to the totalCount as a result on this iteration step. Since
- * multiple iteration steps may occur with overlapping equivalent
- * value ranges, the count may be lower than the count found at
- * the value (e.g. multiple linear steps or percentile levels can
- * occur within a single equivalent value range).
- */
- i64 GetCountAddedInThisIterationStep() const;
- i64 GetNextValueReportingLevel() const;
- i64 GetNextValueReportingLevelLowestEquivalent() const;
- };
- }
|