Ignore:
Timestamp:
Jun 4, 2008, 12:05:22 AM (13 years ago)
Author:
Jari Häkkinen
Message:

Merged trunk changes r608:645 to replacing_gnuplot branch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/replacing_gnuplot/lib/Stats.cc

    r589 r646  
    5757    revision_=svn_info.rev();
    5858    last_changed_rev_=svn_info.last_changed_rev();
     59    reset();
    5960  }
    6061
     
    6869  {
    6970    if (vec.empty()){
    70       vec.resize(last_changed_rev(),0);
    71       return;
    72     }
    73     std::partial_sum(vec.begin(),vec.end(),vec.begin());
     71      // just to allow call to vec.back() below
     72      vec.resize(1,0);
     73    }
     74    else
     75      std::partial_sum(vec.begin(),vec.end(),vec.begin());
    7476    // static_cast to remove annoying compiler warning
    7577    if (vec.size() < static_cast<size_t>(revision()+1))
    76       vec.insert(vec.end(), revision()+1-vec.size(), vec.back());
     78      vec.resize(revision()+1, vec.back());
    7779  }
    7880
     
    100102    add_author(user);
    101103
    102     // FIXME: Peter, remove repeat
    103     std::vector<unsigned int>& code = code_stats()[user];
    104     if (code.size() < rev+1){
    105       code.reserve(rev+1);
    106       code.resize(rev);
    107       if (lt == LineTypeParser::code)
    108         code.push_back(n);
    109       else
    110         code.push_back(0);
     104    add(code_stats()[user], rev, lt==LineTypeParser::code, n);
     105    add(comment_stats()[user], rev, lt==LineTypeParser::comment, n);
     106    add(other_stats()[user], rev, lt==LineTypeParser::other, n);
     107    add(copyright_stats()[user], rev, lt==LineTypeParser::copyright, n);
     108  }
     109
     110
     111  void Stats::add(std::vector<unsigned int>& vec, unsigned int rev, bool x,
     112                  unsigned int n)
     113  {
     114    if (vec.size() < rev+1){
     115      vec.reserve(rev+1);
     116      vec.resize(rev);
     117      if (x) {
     118        assert(vec.size()+1<vec.max_size());
     119        vec.push_back(n);
     120      }
     121      else {
     122        assert(vec.size()+1<vec.max_size());
     123        vec.push_back(0);
     124      }
    111125    }
    112     else if (lt == LineTypeParser::code)
    113       code[rev]+=n;
    114 
    115     std::vector<unsigned int>& comments = comment_stats()[user];
    116     if (comments.size() < rev+1){
    117       comments.reserve(revision() + 1);
    118       comments.insert(comments.end(), rev - comments.size(), 0);
    119       if (lt == LineTypeParser::comment)
    120         comments.push_back(n);
    121       else
    122         comments.push_back(0);
    123     }
    124     else if (lt == LineTypeParser::comment)
    125       comments[rev]+=n;
    126 
    127     std::vector<unsigned int>& other = other_stats()[user];
    128     if (other.size() < rev+1){
    129       other.reserve(revision() + 1);
    130       other.insert(other.end(), rev - other.size(), 0);
    131       if (lt == LineTypeParser::other)
    132         other.push_back(n);
    133       else
    134         other.push_back(0);
    135     }
    136     else if (lt == LineTypeParser::other)
    137       other[rev]+=n;
    138 
    139     std::vector<unsigned int>& copy = copyright_stats()[user];
    140     if (copy.size() < rev+1){
    141       copy.reserve(revision() + 1);
    142       copy.insert(copy.end(), rev - copy.size(), 0);
    143       if (lt == LineTypeParser::copyright)
    144         copy.push_back(n);
    145       else
    146         copy.push_back(0);
    147     }
    148     else if (lt == LineTypeParser::copyright)
    149       copy[rev]+=n;
    150   }
     126    else if (x)
     127      vec[rev]+=n;
     128  }
    151129
    152130
     
    279257      std::string name;
    280258      std::getline(is, name);
    281       if (name.empty())
    282         continue;
    283259      std::vector<unsigned int>& vec=m[name];
    284       svn_revnum_t rev=0;
    285       while (rev < last_changed_rev() && is.good()) {
    286         unsigned int count;
    287         is >> count;
    288         if ( rev+1 > static_cast<svn_revnum_t>(vec.size()) )
     260      std::string line;
     261      std::getline(is, line);
     262      std::stringstream ss(line);
     263      while (ss.good()) {
     264        svn_revnum_t rev=0;
     265        unsigned int count=0;
     266        ss >> rev;
     267        ss >> count;
     268        if (!count)
     269          break;
     270        if (rev+1 < static_cast<svn_revnum_t>(vec.size()) )
    289271          vec.resize(rev+1);
    290         vec[rev] = count;
    291         is >> rev;
    292       }
     272        vec[rev]=count;
     273      }
     274      accumulate(vec);
    293275    }
    294276  }
     
    359341    calc_total();
    360342    calc_all();
     343    assert(total_stats().size());
     344    assert(code_stats().size());
     345    assert(comment_or_copy_stats().size());
     346    assert(other_stats().size());
    361347  }
    362348
     
    364350                          const std::string& linetype) const
    365351  {
     352    assert(total_stats().size());
    366353    plot_init(filename);
    367354    GnuplotFE* gp=GnuplotFE::instance();
     
    490477    os << cache_check_str() << "\n";
    491478    os << last_changed_rev() << " ";
    492     os << authors().size() << " ";
     479    os << authors().size() << "\n";
    493480
    494481    std::copy(authors().begin(), authors().end(),
     
    506493    for (A2VConstIter i(m.begin()); i!=m.end(); ++i){
    507494      os << i->first << "\n";
    508       os << i->second.front() << " ";
    509       for (size_t j=1; j<i->second.size(); ++j)
    510         if (i->second[j] != i->second[j-1])
     495      assert(i->second.size());
     496      if (i->second[0])
     497        os << 0 << " " << i->second[0] << " ";
     498      for (size_t j=1; j<i->second.size(); ++j) {
     499        // only print if stats changes in this rev
     500        if (i->second[j] != i->second[j-1]) {
    511501          os << j << " " << i->second[j] - i->second[j-1] << " ";
    512       os << last_changed_rev()+1 << " ";
     502        }
     503      }
     504      os << "\n";
    513505    }
    514506  }
     
    518510    for (size_t i=0; i<stats_.size(); ++i){
    519511      stats_[i].clear();
    520       std::vector<unsigned int> vec;
    521       stats_[i]["all"] = vec;
     512      stats_[i]["all"]=std::vector<unsigned int>(revision_+1);
    522513    }
    523514    authors_.clear();
     
    538529
    539530 
    540   size_t Stats::operator()(int linetype, std::string author, size_t rev) const
     531  size_t Stats::operator()(int linetype, std::string author,
     532                           svn_revnum_t rev) const
    541533  {
    542534    assert(linetype<=LineTypeParser::total);
     535    assert(static_cast<size_t>(linetype) < stats_.size());
     536    assert(rev>=0);
    543537    A2VConstIter i = stats_[linetype].find(author);
    544     if (i==stats_[linetype].end())
    545       throw std::runtime_error(author + " does not exist");
     538    if (i==stats_[linetype].end()){
     539      std::stringstream msg;
     540      msg << __FILE__ << ": author: " << author << " does not exist"; 
     541      throw std::runtime_error(msg.str());
     542    }
     543    assert(rev < static_cast<svn_revnum_t>(i->second.size()));
    546544    return i->second[rev];
    547545  }
Note: See TracChangeset for help on using the changeset viewer.