source: trunk/lib/Stats.cc @ 35

Last change on this file since 35 was 35, checked in by Jari Häkkinen, 16 years ago

Continued fixing gnuplot.

File size: 2.9 KB
Line 
1//$Id$
2
3#include "Stats.h"
4#include "utility.h"
5
6#include <cstdio>
7#include <fstream>
8
9#include <map>
10#include <numeric>
11#include <string>
12#include <utility>
13#include <vector>
14
15#include <iostream>
16
17namespace theplu{
18namespace svnstat{
19
20  Gnuplot Stats::gnuplot_pipe_;
21
22  std::vector<double> Stats::accumulated(void) const
23  {
24    std::vector<u_int> sum;
25    if (map_.empty())
26      return std::vector<double>();
27
28    // sum of all users
29    std::accumulate(map_.begin(), map_.end(), sum, 
30        PairValuePlus<std::string,u_int>());
31
32    // calculate accumulated sum
33    std::vector<double> accum(sum.size());
34    std::partial_sum(sum.begin(),sum.end(),accum.begin());   
35    return accum;
36  }
37
38  std::vector<double> Stats::accumulated(const std::string& user) const
39  {
40    if (!map_.count(user))
41      return std::vector<double>();
42    std::vector<u_int> vec=(map_.find(user))->second;
43
44    std::vector<double> accum(vec.size());
45    std::partial_sum(vec.begin(),vec.end(),accum.begin());
46    return accum;
47  }
48
49  void Stats::add(const std::string& user, const u_int& rev)
50  {
51    std::vector<u_int> vec = map_[user];
52    if (vec.size() < rev+1){
53      u_int i=vec.size();
54      vec.resize(rev+1);
55      for (; i<rev; i++)
56        vec[i]=0;
57      vec[rev]=1;
58    }
59    else
60      vec[rev]++;
61    map_[user]=vec;
62
63  }
64
65  std::string Stats::plot(void) const
66  {
67    char name[]="svnstatXXXXXX";
68    if (!strlen(mktemp(name))) {
69      std::cerr << "Failed to get unique filename: " << name << std::endl;
70      exit(-1);
71    }
72    // Jari, temporary empty files are created that needs to be removed.
73    std::string cmd=std::string("set term png; set output '")+name+".png'";
74    gnuplot_pipe_.command(cmd);
75    std::vector<double> x=accumulated();
76    gnuplot_pipe_.plot_y(x);
77    for (MapConstIter_ i= map_.begin(); i != map_.end(); i++) {
78      x=accumulated(i->first);
79      gnuplot_pipe_.plot_y(x);
80    }
81    return std::string(name)+".png";
82  }
83
84  void Stats::print(std::ostream& os) const
85  {
86    std::vector<std::pair<std::string, std::vector<u_int> > > accum;
87    for (MapConstIter_ i= map_.begin(); i != map_.end(); i++){
88      std::pair<std::string, std::vector<u_int> > element(*i);
89      std::partial_sum(element.second.begin(),element.second.end(),
90                       element.second.begin());
91      accum.push_back(element);
92    }
93    sort(accum.begin(),accum.end(), CodingMore());
94    os << "<table>\n";
95    for (size_t i = 0; i<accum.size(); i++){
96      os << "<tr><td>\n" << accum[i].first << "</td><td>" 
97         << accum[i].second.back() << "</td></tr>"; 
98    }
99    os << "</table>\n";
100
101    os << "<p><img src='" << plot() << "' alt='[svnstat plot]' border=0></p>\n";
102  }
103
104  Stats& Stats::operator+=(const Stats& other)
105  {
106    for (MapConstIter_ o_i= other.map_.begin(); o_i != other.map_.end(); ++o_i)
107    {
108      std::pair<MapIter_,bool> result = map_.insert(*o_i);
109      if (!result.second)
110        map_[(*(result.first)).first] = 
111          VectorPlus<u_int>()( (*(result.first)).second, (*o_i).second );
112 
113    }
114    return *this;
115  }
116
117}} // end of namespace svnstat and namespace theplu
Note: See TracBrowser for help on using the repository browser.