source: trunk/lib/Stats.cc @ 34

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

Started implementing gnuplot into Stats.

File size: 2.8 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<u_int> Stats::accumulated(void) const
23  {
24    std::vector<u_int> sum;
25    if (map_.empty())
26      return sum;
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<u_int> accum(sum.size());
34    std::partial_sum(sum.begin(),sum.end(),accum.begin());   
35    return accum;
36  }
37
38  std::vector<u_int> Stats::accumulated(const std::string& user)
39  {
40    std::vector<u_int> vec=map_[user];
41    if (vec.empty())
42      return vec;
43    std::vector<u_int> accum(vec.size());
44    std::partial_sum(vec.begin(),vec.end(),accum.begin());
45    return accum;
46  }
47
48  void Stats::add(const std::string& user, const u_int& rev)
49  {
50    std::vector<u_int> vec = map_[user];
51    if (vec.size() < rev+1){
52      u_int i=vec.size();
53      vec.resize(rev+1);
54      for (; i<rev; i++)
55        vec[i]=0;
56      vec[rev]=1;
57    }
58    else
59      vec[rev]++;
60    map_[user]=vec;
61
62  }
63
64  std::string Stats::plot(void) const
65  {
66    char name[]="svnstatXXXXXX";
67    if (mkstemp(name) == -1) {
68      std::cerr << "Failed to get unique filename: " << name << std::endl;
69      exit(-1);
70    }
71    // Jari, temporary empty files are created that needs to be removed.
72    std::string cmd=std::string("set term png; set output '")+name+".png'";
73    gnuplot_pipe_.command(cmd);
74    cmd="plot sin(x) t 'ddd' w lines";
75    gnuplot_pipe_.command(cmd);
76    return std::string(name)+".png";
77  }
78
79  void Stats::print(std::ostream& os) const
80  {
81    std::vector<std::pair<std::string, std::vector<u_int> > > accum;
82    for (MapConstIter_ i= map_.begin(); i != map_.end(); i++){
83      std::pair<std::string, std::vector<u_int> > element(*i);
84      std::partial_sum(element.second.begin(),element.second.end(),
85                       element.second.begin());
86      accum.push_back(element);
87    }
88    sort(accum.begin(),accum.end(), CodingMore());
89    os << "<table>\n";
90    for (size_t i = 0; i<accum.size(); i++){
91      os << "<tr><td>\n" << accum[i].first << "</td><td>" 
92         << accum[i].second.back() << "</td></tr>"; 
93    }
94    os << "</table>\n";
95
96    os << "<p><img src='" << plot() << "' alt='[svnstat plot]' border=0></p>\n";
97  }
98
99  Stats& Stats::operator+=(const Stats& other)
100  {
101    for (MapConstIter_ o_i= other.map_.begin(); o_i != other.map_.end(); ++o_i)
102    {
103      std::pair<MapIter_,bool> result = map_.insert(*o_i);
104      if (!result.second)
105        map_[(*(result.first)).first] = 
106          VectorPlus<u_int>()( (*(result.first)).second, (*o_i).second );
107 
108    }
109    return *this;
110  }
111
112}} // end of namespace svnstat and namespace theplu
Note: See TracBrowser for help on using the repository browser.