+ statistics()
+ : count(0)
+ , min(std::numeric_limits<double>::infinity())
+ , max(-std::numeric_limits<double>::infinity())
+ , sum(0.0)
+ , mean(0.0)
+ , sqdiff_sum(0.0)
+ { }
+
+ void push(double x) {
+ double delta = x - mean;
+ ++count;
+ if (x < min)
+ min = x;
+ if (x > max)
+ max = x;
+ sum += x;
+ mean = sum / count;
+ sqdiff_sum += delta * (x - mean);
+ }
+
+ unsigned get_count() const { return count; }
+ double get_min() const { return min; }
+ double get_max() const { return max; }
+ double get_sum() const { return sum; }
+ double get_mean() const { return mean; }
+ double get_variance() const { return sqdiff_sum / count; }
+ double get_stddev() const { return std::sqrt(get_variance()); }