Changeset 529 for trunk/lib/Stats.cc


Ignore:
Timestamp:
Dec 25, 2007, 2:10:25 PM (14 years ago)
Author:
Peter Johansson
Message:

moving stuff to base class, Stats

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Stats.cc

    r528 r529  
    5656    revision_=svn_info.rev();
    5757    last_changed_rev_=svn_info.last_changed_rev();
    58     std::vector<u_int> vec(last_changed_rev_+1, 0);
    59     code_["all"] = vec;
    60     comments_["all"] = vec;
    61     other_["all"] = vec;
    62     total_["all"] = vec;
    6358  }
    6459
     
    164159
    165160
     161  svn_revnum_t Stats::last_changed_rev(void) const
     162  {
     163    return last_changed_rev_;
     164  }
     165
     166
     167  u_int Stats::lines(const std::string& user) const
     168  {
     169    return get_back(total_, user);
     170  }
     171
     172
     173  void Stats::load(std::istream& is, Author2Vector& m)
     174  {
     175    while (m.size() < authors().size()+1 && is.good()) {
     176      std::string name;
     177      std::getline(is, name);
     178      if (name.empty())
     179        continue;
     180      std::vector<u_int>& vec=m[name];
     181      size_t revs=0;
     182      is >> revs;
     183      vec.reserve(revs);
     184      while (vec.size() < revs && is.good()) {
     185        u_int tmp;
     186        is >> tmp;
     187        vec.push_back(tmp);
     188      }
     189    }
     190  }
     191
     192
    166193  bool Stats::load_cache(std::istream& is)
    167194  {
    168 
    169195    svn_revnum_t rev;
    170196    is >> rev;
    171     if (rev<last_changed_rev_){
     197    if (rev<last_changed_rev()){
    172198      return false; // cache is not up to date
    173199    }
     200    reset();
    174201    size_t a_size=0;
    175     authors_.clear();
    176202    is >> a_size;
    177203    std::string str;
    178     getline(is, str);
    179     while (authors_.size()<a_size){
     204    while (authors().size()<a_size && is.good()){
    180205      getline(is, str);
    181       assert(str.size());
    182       authors_.insert(str);
    183     }
    184     return do_load_cache(is);
    185   }
    186 
    187 
    188   svn_revnum_t Stats::last_changed_rev(void) const
    189   {
    190     return last_changed_rev_;
    191   }
    192 
    193 
    194   u_int Stats::lines(const std::string& user) const
    195   {
    196     return get_back(total_, user);
     206      if (str.size())
     207        add_author(str);
     208    }
     209    getline(is, str);
     210    if (str!=code_cache()){
     211      return false;
     212    }
     213    load(is, code_);
     214    getline(is, str);
     215    getline(is, str);
     216    if (str!=comments_cache()){
     217      return false;
     218    }
     219    load(is, comments_);
     220    getline(is, str);
     221    getline(is, str);
     222    if (str!=other_cache()){
     223      return false;
     224    }
     225    load(is, other_);
     226    getline(is, str);
     227    getline(is, str);
     228    if (str!=total_cache()){
     229      return false;
     230    }
     231    load(is, total_);
     232    getline(is,str);
     233    getline(is,str);
     234    return str==end_of_cache();
    197235  }
    198236
     
    233271                          const std::string& linetype) const
    234272  {
    235     return do_plot(filename, linetype);
     273    plot_init(filename);
     274    GnuplotFE* gp=GnuplotFE::instance();
     275    const Author2Vector* stat=NULL;
     276    if (linetype=="total")
     277      stat = &total_;
     278    else if (linetype=="code")
     279      stat = &code_;
     280    else if (linetype=="comments")
     281      stat = &comments_;
     282    else if (linetype=="empty")
     283      stat = &other_;
     284    assert(stat);
     285    assert(stat->size());
     286    std::vector<u_int> total=get_vector(*stat, "all");   
     287    double yrange_max=1.03*total.back()+1;
     288    gp->yrange(yrange_max);
     289
     290    typedef std::vector<std::pair<std::string, std::vector<u_int> > > vec_type;
     291    vec_type author_cont;
     292    author_cont.reserve(stat->size());
     293    for (std::set<std::string>::const_iterator i=authors_.begin();
     294         i != authors_.end(); ++i) {
     295      if (lines(*i))
     296        author_cont.push_back(std::make_pair(*i,get_vector(*stat,*i)));
     297    }
     298
     299    LessReversed<std::vector<u_int> > lr;
     300    PairSecondCompare<std::string, std::vector<u_int>,
     301      LessReversed<std::vector<u_int> > > compare(lr);
     302    std::sort(author_cont.begin(), author_cont.end(), compare);
     303
     304    size_t plotno=author_cont.size();
     305    std::stringstream ss;
     306    vec_type::iterator end(author_cont.end());
     307    for (vec_type::iterator i(author_cont.begin()); i!=end; ++i) {
     308      ss.str("");
     309      ss << "set key height " << 2*plotno;
     310      gp->command(ss.str());
     311      ss.str("");
     312      ss << get_back(*stat, i->first) << " " << i->first;
     313      gp->yrange(yrange_max);
     314      gp->linetitle(ss.str());
     315      ss.str("");
     316      ss << "steps " << --plotno+2;
     317      gp->linestyle(ss.str());
     318      gp->plot(i->second);
     319    }
     320    ss.str("");
     321    ss << get_back(*stat, "all") << " total";
     322    gp->command("set key height 0");
     323    gp->linetitle(ss.str());
     324    gp->linestyle("steps 1");
     325    gp->plot(total);
     326
     327    gp->command("unset multiplot");
     328    gp->yrange();
     329
     330    return filename;
    236331  }
    237332
     
    297392  void Stats::print(std::ostream& os) const
    298393  {
    299     os << last_changed_rev_ << " ";
    300     os << authors_.size() << "\n";
    301 
    302     std::copy(authors_.begin(), authors_.end(),
     394    os << last_changed_rev() << " ";
     395    os << authors().size() << " ";
     396
     397    std::copy(authors().begin(), authors().end(),
    303398              std::ostream_iterator<std::string>(os, "\n"));
    304     do_print(os);
    305   }
    306 
     399    os << code_cache() << "\n";
     400    print(os, code_);
     401    os << "\n" << comments_cache() << "\n";
     402    print(os, comments_);
     403    os << "\n" << other_cache() << "\n";
     404    print(os, other_);
     405    os << "\n" << total_cache() << "\n";
     406    print(os, total_);
     407    os << "\n" << end_of_cache() << "\n";
     408  }
     409
     410
     411  void Stats::print(std::ostream& os, const Author2Vector& m) const
     412  {
     413    for (A2VConstIter i(m.begin()); i!=m.end(); ++i){
     414      os << i->first << "\n";
     415      os << i->second.size() << " ";
     416      std::copy(i->second.begin(), i->second.end(),
     417                std::ostream_iterator<u_int>(os, " "));
     418    }
     419  }
    307420
    308421  void Stats::reset(void)
    309422  {
    310     assert("implement me");
     423    total_.clear();
     424    code_.clear();
     425    comments_.clear();
     426    other_.clear();
     427    authors_.clear();
     428    std::vector<u_int> vec;
     429    code_["all"] = vec;
     430    comments_["all"] = vec;
     431    other_["all"] = vec;
     432    total_["all"] = vec;
    311433  }
    312434
Note: See TracChangeset for help on using the changeset viewer.