Changeset 118 for trunk/lib/Stats.cc


Ignore:
Timestamp:
Jul 3, 2006, 9:44:49 AM (15 years ago)
Author:
Peter Johansson
Message:

fixes #46 #45 #26 #40

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Stats.cc

    r113 r118  
    5858
    5959
    60   std::vector<u_int> Stats::accumulated(void) const
     60  std::vector<u_int> Stats::accumulated(const Map_& map) const
    6161  {
    6262    // sum of all users
    63     std::vector<u_int> sum(revision_+1, 0);
    64     sum=std::accumulate(map_.begin(), map_.end(), sum,
     63    std::vector<u_int> sum(revision_+1);
     64    sum=std::accumulate(map.begin(), map.end(), sum,
    6565                        PairValuePlus<std::string,u_int>());
    6666
     
    7272  }
    7373
    74   std::vector<u_int> Stats::accumulated(const std::string& user) const
    75   {
    76     if (!map_.count(user))
     74  std::vector<u_int> Stats::accumulated(const Map_& map,
     75                                        const std::string& user) const
     76  {
     77    if (!map.count(user))
    7778      return std::vector<u_int>();
    78     std::vector<u_int> vec=(map_.find(user))->second;
     79    std::vector<u_int> vec=(map.find(user))->second;
    7980 
    8081    if (vec.size() < revision_+1)
     
    8687  }
    8788
    88   void Stats::add(const std::string& user, const u_int& rev)
    89   {
    90     std::vector<u_int>* vec = &(map_[user]);
    91     if (vec->size() < rev+1){
    92       vec->reserve(revision_ + 1);
    93       vec->insert(vec->end(), rev - vec->size(),0);
    94       vec->push_back(1);
     89  void Stats::add(const std::string& user, const u_int& rev,
     90                  const Parser::line_type lt)
     91  {
     92    authors_.insert(user);
     93
     94    std::vector<u_int>* total = &(total_[user]);
     95    if (total->size() < rev+1){
     96      total->reserve(revision_ + 1);
     97      total->insert(total->end(), rev - total->size(), 0);
     98      total->push_back(1);
    9599    }
    96100    else
    97       (*vec)[rev]++;
     101      (*total)[rev]++;
     102
     103    std::vector<u_int>* code = &(code_[user]);
     104    if (code->size() < rev+1){
     105      code->reserve(revision_ + 1);
     106      code->insert(code->end(), rev - code->size(), 0);
     107      if (lt == Parser::code)
     108        code->push_back(1);
     109      else
     110        code->push_back(0);
     111    }
     112    else if (lt == Parser::code)
     113      (*code)[rev]++;
     114
     115    std::vector<u_int>* comments = &(comments_[user]);
     116    if (comments->size() < rev+1){
     117      comments->reserve(revision_ + 1);
     118      comments->insert(comments->end(), rev - comments->size(), 0);
     119      if (lt == Parser::comment)
     120        comments->push_back(1);
     121      else
     122        comments->push_back(0);
     123    }
     124    else if (lt == Parser::comment)
     125      (*comments)[rev]++;
    98126  }
    99127
     
    106134
    107135    // Check if file is binary
    108     std::ifstream is("svnstat.tmp");
     136    std::ifstream is("/tmp/svnstat.tmp");
    109137    std::string line;
    110138    getline(is,line,' ');
     
    118146    is.close();
    119147
    120     is.open("svnstat.tmp");
     148    Parser parser(path);
     149    std::vector<Parser::line_type>::const_iterator count=parser.type().begin();
     150
     151    is.open("/tmp/svnstat.tmp");
    121152    while (getline(is,line, '\n')){
    122153      if (!line.size()) // skip empty line
     
    127158      ss >> revision;
    128159      ss >> user;
    129       add(user, revision);
     160      // to handle symbolic links
     161      if (count==parser.type().end())
     162        add(user, revision, Parser::empty);
     163      else
     164        add(user, revision, *count);
     165      count++;
    130166    }
    131167    is.close();
     168   
    132169    return false;
    133170  }
     
    146183    gp->command("set key left Left reverse");
    147184    gp->command("set multiplot");
    148     std::vector<u_int> total=accumulated();   
     185    std::vector<u_int> total=accumulated(total_);   
    149186    double yrange_max=1.03*total.back()+1;
    150187    gp->yrange(yrange_max);
    151188    size_t plotno=1;
    152189    std::stringstream ss;
    153     for (MapConstIter_ i= map_.begin(); i != map_.end(); i++) {
     190    for (MapConstIter_ i= total_.begin(); i != total_.end(); i++) {
    154191      ss.str("");
    155192      ss << "set key height " << 2*plotno;
    156193      gp->command(ss.str());
    157       std::vector<u_int> x=accumulated(i->first);
     194      std::vector<u_int> x=accumulated(total_, i->first);
    158195      ss.str("");
    159196      ss << x.back() << " " << i->first;
     
    178215  }
    179216
     217
    180218  Stats& Stats::operator+=(const Stats& other)
    181219  {
    182     for (MapConstIter_ o_i= other.map_.begin(); o_i != other.map_.end(); ++o_i)
     220    for (MapConstIter_ o_i= other.code_.begin();
     221         o_i != other.code_.end(); ++o_i)
    183222    {
    184       std::pair<MapIter_,bool> result = map_.insert(*o_i);
     223      std::pair<MapIter_,bool> result = code_.insert(*o_i);
    185224      if (!result.second)
    186         map_[(*(result.first)).first] =
     225        code_[(*(result.first)).first] =
    187226          VectorPlus<u_int>()( (*(result.first)).second, (*o_i).second );
    188227 
    189228    }
     229 
     230    for (MapConstIter_ o_i= other.comments_.begin();
     231         o_i != other.comments_.end(); ++o_i)
     232    {
     233      std::pair<MapIter_,bool> result = comments_.insert(*o_i);
     234      if (!result.second)
     235        comments_[(*(result.first)).first] =
     236          VectorPlus<u_int>()( (*(result.first)).second, (*o_i).second );
     237 
     238    }
     239   
     240    for (MapConstIter_ o_i= other.total_.begin();
     241         o_i != other.total_.end(); ++o_i)
     242    {
     243      std::pair<MapIter_,bool> result = total_.insert(*o_i);
     244      if (!result.second)
     245        total_[(*(result.first)).first] =
     246          VectorPlus<u_int>()( (*(result.first)).second, (*o_i).second );
     247 
     248    }
     249   
     250    if (!other.authors().empty())
     251      authors_.insert(other.authors().begin(), other.authors().end());
    190252    return *this;
    191253  }
Note: See TracChangeset for help on using the changeset viewer.