#ifndef __statistics_h__
#define __statistics_h__ 1

namespace utils {

class statistics {
  unsigned int N;
  double A;
  double varL;
  double varH;
public:
  statistics() {clear();}
  void clear() {N=0; A=varL=varH=0.0;}
  double count() {return N;}
  double mean() {return A;}
  void add(double t) {
    ++N;
    double diff=t-A;
    A += diff/N;
    double v=diff*(t-A);
    if(diff < 0.0)
      varL += v;
    else
      varH += v;
  }
  double stdev(double var, double f) {
    double factor=N > f ? f/(N-f) : 0.0;
    return sqrt(var*factor);
  }
  double stdev() {
    return stdev(varL+varH,1.0);
  }
  double stdevL() {
    return stdev(varL,2.0);
  }
  double stdevH() {
    return stdev(varH,2.0);
  }
  void output(const char *text, unsigned int m) {
    std::cout << text << ":\n"
              << m << "\t"
              << A << "\t"
              << stdevL() << "\t"
              << stdevH() << std::endl;
  }
};

}

#endif
