Changeset 528 for trunk/lib/Stats.cc


Ignore:
Timestamp:
Dec 25, 2007, 11:23:04 AM (15 years ago)
Author:
Peter Johansson
Message:

fixes #280 - keep on refactoring of Stats class

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Stats.cc

    r527 r528  
    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;
    5863  }
    5964
     
    6469
    6570
    66   void Stats::base_add(v_map::const_iterator first1,
    67                        v_map::const_iterator last1, v_map& map)
    68   {
    69     v_map::iterator first2(map.begin());
    70     v_map::key_compare compare;
    71     while ( first1 != last1) {
    72       // key of first1 less than key of first2
    73       if (first2==map.end() || compare(first1->first,first2->first)) {
    74         first2 = map.insert(first2, *first1);
    75         ++first1;
    76       }
    77       // key of first2 less than key of first1
    78       else if ( compare(first2->first, first1->first)) {
    79         ++first2;
    80       }
    81       // keys are equivalent
    82       else {
    83         VectorPlus<v_map::mapped_type::value_type> vp;
    84         first2->second = vp(first1->second, first2->second);
    85         ++first1;
    86         ++first2;
    87       }
    88     }
     71  void Stats::accumulate(std::vector<u_int>& vec) const
     72  {
     73    if (vec.empty()){
     74      vec.resize(last_changed_rev(),0);
     75      return;
     76    }
     77    std::partial_sum(vec.begin(),vec.end(),vec.begin());
     78    // static_cast to remove annoying compiler warning
     79    if (vec.size() < static_cast<size_t>(revision()+1))
     80      vec.insert(vec.end(), revision()+1-vec.size(), vec.back());
     81  }
     82
     83
     84  void Stats::accumulate_stats(void)
     85  {
     86    for (std::set<std::string>::const_iterator iter(authors().begin());
     87         iter!=authors().end(); ++iter) {
     88      std::vector<u_int>& code = code_[*iter];
     89      accumulate(code);
     90      std::vector<u_int>& comments = comments_[*iter];
     91      accumulate(comments);
     92      std::vector<u_int>& other = other_[*iter];
     93      accumulate(other);
     94
     95      VectorPlus<u_int> vp;
     96      total_[*iter] = vp(vp(code, comments),other);
     97    }
     98    std::vector<u_int> init(revision()+1);
     99    code_["all"]=std::accumulate(code_.begin(), code_.end(), init,
     100                                 PairValuePlus<std::string,u_int>());
     101    comments_["all"]=std::accumulate(comments_.begin(), comments_.end(), init,
     102                                     PairValuePlus<std::string,u_int>());
     103    other_["all"]=std::accumulate(other_.begin(), other_.end(), init,
     104                                  PairValuePlus<std::string,u_int>());
     105    VectorPlus<u_int> vp;
     106    total_["all"] = vp(vp(code_["all"], comments_["all"]), other_["all"]);
    89107  }
    90108
     
    109127
    110128
    111   void Stats::base_add(const Stats& rhs)
    112   {
    113     revision_ = std::max(revision_, rhs.revision_);
    114     last_changed_rev_ = std::max(last_changed_rev_, rhs.last_changed_rev_);
    115     add_authors(rhs.authors().begin(), rhs.authors().end());
    116     base_add(rhs.code_.begin(), rhs.code_.end(), code_);
    117     base_add(rhs.comments_.begin(), rhs.comments_.end(), comments_);
    118     base_add(rhs.other_.begin(), rhs.other_.end(), other_);
    119     base_add(rhs.total_.begin(), rhs.total_.end(), total_);
    120   }
    121 
    122 
    123129  u_int Stats::code(const std::string& user) const
    124130  {
    125     return get_vector(code_, "all").back();
     131    return get_back(code_, user);
    126132  }
    127133
     
    129135  u_int Stats::comments(const std::string& user) const
    130136  {
    131     return get_vector(comments_, "all").back();
     137    return get_back(comments_, user);
    132138  }
    133139
     
    135141  u_int Stats::empty(const std::string& user) const
    136142  {
    137     return get_vector(other_, "all").back();
    138   }
    139 
    140 
    141   const std::vector<u_int>& Stats::get_vector(const v_map& m,
     143    return get_back(other_, user);
     144  }
     145
     146
     147  u_int Stats::get_back(const Author2Vector& m, std::string user) const
     148  {
     149    A2VConstIter iter(m.find(std::string(user)));
     150    if (iter==m.end() || iter->second.empty())
     151      return 0;
     152    return iter->second.back();
     153  }
     154
     155
     156  const std::vector<u_int>& Stats::get_vector(const Author2Vector& m,
    142157                                              std::string user) const
    143158  {
    144     v_map::const_iterator iter(m.find(std::string(user)));
     159    A2VConstIter iter(m.find(std::string(user)));
    145160    if (iter==m.end())
    146161      throw std::runtime_error(user+std::string(" not found i Stats"));
    147162    return iter->second;
    148163  }
     164
    149165
    150166  bool Stats::load_cache(std::istream& is)
     
    178194  u_int Stats::lines(const std::string& user) const
    179195  {
    180     return get_vector(total_, "all").back();
     196    return get_back(total_, user);
     197  }
     198
     199
     200  void Stats::map_add(A2VConstIter first1, A2VConstIter last1,
     201                      Author2Vector& map)
     202  {
     203    A2VIter first2(map.begin());
     204    Author2Vector::key_compare compare;
     205    while ( first1 != last1) {
     206      // key of first1 less than key of first2
     207      if (first2==map.end() || compare(first1->first,first2->first)) {
     208        first2 = map.insert(first2, *first1);
     209        ++first1;
     210      }
     211      // key of first2 less than key of first1
     212      else if ( compare(first2->first, first1->first)) {
     213        ++first2;
     214      }
     215      // keys are equivalent
     216      else {
     217        VectorPlus<Author2Vector::mapped_type::value_type> vp;
     218        first2->second = vp(first1->second, first2->second);
     219        ++first1;
     220        ++first2;
     221      }
     222    }
    181223  }
    182224
     
    184226  void Stats::parse(const std::string& path)
    185227  {
    186     // First we let inherited class do parsing
    187228    do_parse(path);
    188     // then we fill up with statistics
    189 
    190     update_stats();
     229    accumulate_stats();
    191230  }
    192231
     
    269308  void Stats::reset(void)
    270309  {
    271     do_reset();
    272   }
    273 
    274 
    275   void Stats::update_stats(void)
    276   {
    277     for (std::set<std::string>::const_iterator iter(authors_.begin());
    278          iter!=authors_.end(); ++iter) {
    279       std::vector<u_int> code(vector("code", *iter));
    280       code_[*iter] = code;
    281       std::vector<u_int> comments(vector("comments", *iter));
    282       comments_[*iter] = comments;
    283       std::vector<u_int> other(vector("other", *iter));
    284       other_[*iter] = other;
    285       VectorPlus<u_int> vp;
    286       total_[*iter] = vp(vp(code, comments),other);
    287     }
    288     std::vector<u_int> init(revision()+1);
    289     code_["all"]=std::accumulate(code_.begin(), code_.end(), init,
    290                                  PairValuePlus<std::string,u_int>());
    291     comments_["all"]=std::accumulate(comments_.begin(), comments_.end(), init,
    292                                      PairValuePlus<std::string,u_int>());
    293     other_["all"]=std::accumulate(other_.begin(), other_.end(), init,
    294                                   PairValuePlus<std::string,u_int>());
    295     VectorPlus<u_int> vp;
    296     total_["all"] = vp(vp(code_["all"], comments_["all"]), other_["all"]);
    297   }
     310    assert("implement me");
     311  }
     312
     313
     314  Stats& Stats::operator+=(const Stats& rhs)
     315  {
     316    revision_ = std::max(revision_, rhs.revision_);
     317    last_changed_rev_ = std::max(last_changed_rev_, rhs.last_changed_rev_);
     318    add_authors(rhs.authors().begin(), rhs.authors().end());
     319    map_add(rhs.code_.begin(), rhs.code_.end(), code_);
     320    map_add(rhs.comments_.begin(), rhs.comments_.end(), comments_);
     321    map_add(rhs.other_.begin(), rhs.other_.end(), other_);
     322    map_add(rhs.total_.begin(), rhs.total_.end(), total_);
     323    assert(rhs.other_.size());
     324    assert(other_.size());
     325   
     326    return *this;
     327  }
    298328
    299329
Note: See TracChangeset for help on using the changeset viewer.