X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=folly%2Fstats%2FHistogram.h;h=1f34d0e9a024bc5a61096e7612ee2966d5581393;hb=fc1af2c432ef4556cd4435093708d7e557f07191;hp=a6daa374b0f41948388f878be94a28728990c1e1;hpb=fa172175980b13569ba42008202a857af6e959dd;p=folly.git diff --git a/folly/stats/Histogram.h b/folly/stats/Histogram.h index a6daa374..1f34d0e9 100644 --- a/folly/stats/Histogram.h +++ b/folly/stats/Histogram.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace folly { @@ -53,8 +53,11 @@ class HistogramBuckets { * * (max - min) must be larger than or equal to bucketSize. */ - HistogramBuckets(ValueType bucketSize, ValueType min, ValueType max, - const BucketType& defaultBucket); + HistogramBuckets( + ValueType bucketSize, + ValueType min, + ValueType max, + const BucketType& defaultBucket); /* Returns the bucket size of each bucket in the histogram. */ ValueType getBucketSize() const { @@ -191,9 +194,10 @@ class HistogramBuckets { * percentage of the data points in the histogram are less than N. */ template - ValueType getPercentileEstimate(double pct, - CountFn countFromBucket, - AvgFn avgFromBucket) const; + ValueType getPercentileEstimate( + double pct, + CountFn countFromBucket, + AvgFn avgFromBucket) const; /* * Iterator access to the buckets. @@ -222,8 +226,7 @@ class HistogramBuckets { std::vector buckets_; }; -} // detail - +} // namespace detail /* * A basic histogram class. @@ -242,12 +245,12 @@ class Histogram { typedef detail::Bucket Bucket; Histogram(ValueType bucketSize, ValueType min, ValueType max) - : buckets_(bucketSize, min, max, Bucket()) {} + : buckets_(bucketSize, min, max, Bucket()) {} /* Add a data point to the histogram */ - void addValue(ValueType value) - FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER("signed-integer-overflow") - FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER("unsigned-integer-overflow") { + void addValue(ValueType value) FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER( + "signed-integer-overflow", + "unsigned-integer-overflow") { Bucket& bucket = buckets_.getByValue(value); // NOTE: Overflow is handled elsewhere and tests check this // behavior (see HistogramTest.cpp TestOverflow* tests). @@ -258,8 +261,9 @@ class Histogram { /* Add multiple same data points to the histogram */ void addRepeatedValue(ValueType value, uint64_t nSamples) - FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER("signed-integer-overflow") - FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER("unsigned-integer-overflow") { + FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER( + "signed-integer-overflow", + "unsigned-integer-overflow") { Bucket& bucket = buckets_.getByValue(value); // NOTE: Overflow is handled elsewhere and tests check this // behavior (see HistogramTest.cpp TestOverflow* tests). @@ -276,8 +280,8 @@ class Histogram { * requested value from the appropriate bucket's sum. */ void removeValue(ValueType value) FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER( - "signed-integer-overflow") - FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER("unsigned-integer-overflow") { + "signed-integer-overflow", + "unsigned-integer-overflow") { Bucket& bucket = buckets_.getByValue(value); // NOTE: Overflow is handled elsewhere and tests check this // behavior (see HistogramTest.cpp TestOverflow* tests). @@ -312,13 +316,11 @@ class Histogram { } /* Subtract another histogram data from the histogram */ - void subtract(const Histogram &hist) { + void subtract(const Histogram& hist) { // the two histogram bucket definitions must match to support // subtract. - if (getBucketSize() != hist.getBucketSize() || - getMin() != hist.getMin() || - getMax() != hist.getMax() || - getNumBuckets() != hist.getNumBuckets() ) { + if (getBucketSize() != hist.getBucketSize() || getMin() != hist.getMin() || + getMax() != hist.getMax() || getNumBuckets() != hist.getNumBuckets()) { throw std::invalid_argument("Cannot subtract input histogram."); } @@ -328,13 +330,11 @@ class Histogram { } /* Merge two histogram data together */ - void merge(const Histogram &hist) { + void merge(const Histogram& hist) { // the two histogram bucket definitions must match to support // a merge. - if (getBucketSize() != hist.getBucketSize() || - getMin() != hist.getMin() || - getMax() != hist.getMax() || - getNumBuckets() != hist.getNumBuckets() ) { + if (getBucketSize() != hist.getBucketSize() || getMin() != hist.getMin() || + getMax() != hist.getMax() || getNumBuckets() != hist.getNumBuckets()) { throw std::invalid_argument("Cannot merge from input histogram."); } @@ -344,12 +344,10 @@ class Histogram { } /* Copy bucket values from another histogram */ - void copy(const Histogram &hist) { + void copy(const Histogram& hist) { // the two histogram bucket definition must match - if (getBucketSize() != hist.getBucketSize() || - getMin() != hist.getMin() || - getMax() != hist.getMax() || - getNumBuckets() != hist.getNumBuckets() ) { + if (getBucketSize() != hist.getBucketSize() || getMin() != hist.getMin() || + getMax() != hist.getMax() || getNumBuckets() != hist.getNumBuckets()) { throw std::invalid_argument("Cannot copy from input histogram."); } @@ -416,7 +414,7 @@ class Histogram { * Get the bucket that the specified percentile falls into * * The lowest and highest percentile data points in returned bucket will be - * returned in the lowPct and highPct arguments, if they are non-NULL. + * returned in the lowPct and highPct arguments, if they are not nullptr. */ size_t getPercentileBucketIdx( double pct, @@ -480,4 +478,20 @@ class Histogram { detail::HistogramBuckets buckets_; }; -} // folly +} // namespace folly + +// MSVC 2017 Update 3/4 has an issue with explicitly instantiating templated +// functions with default arguments inside templated classes when compiled +// with /permissive- (the default for the CMake build), so we directly include +// the -defs as if it were -inl, and don't provide the explicit instantiations. +// https://developercommunity.visualstudio.com/content/problem/81223/incorrect-error-c5037-with-permissive.html +#if defined(_MSC_VER) && _MSC_FULL_VER >= 191125506 && \ + _MSC_FULL_VER <= 191125547 +#define FOLLY_MSVC_USE_WORKAROUND_FOR_C5037 1 +#else +#define FOLLY_MSVC_USE_WORKAROUND_FOR_C5037 0 +#endif + +#if FOLLY_MSVC_USE_WORKAROUND_FOR_C5037 +#include +#endif