# # patch "ChangeLog" # from [80ee6926d234f46a341bcc4c874056b57d5ebdbd] # to [57d565f3778c1c511828115215cbd8fd7e2555d7] # # patch "change_set.cc" # from [c9554a69662fecf70ead4b8fec54eab5c355118a] # to [f45da9e6d6bc784324d6f606a12d21c34a6f306d] # # patch "smap.hh" # from [8fb308c5059d3d572a078c96a6937ed989b425ec] # to [d4acf13bff4208cfe2d87cb93fcb182a290d77f8] # --- ChangeLog +++ ChangeLog @@ -1,3 +1,10 @@ +2005-04-15 Matt Johnston + + * change_set.cc (confirm_proper_tree): use bitsets rather than maps + for tracking set membership. + * smap.hh: return reverse iterators properly, iterate over the vector + rather than self in ensure_sort() + 2005-04-14 Derek Scherger * database_check.cc (check_db): fail with N(...) when problems are --- change_set.cc +++ change_set.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include "basic_io.hh" #include "change_set.hh" @@ -513,19 +514,30 @@ static void confirm_proper_tree(path_state const & ps) { - std::map confirmed; - I(ps.find(root_tid) == ps.end()); + if (ps.empty()) + return; + + I(ps.find(root_tid) == ps.end()); // Note that this find() also ensures + // sortedness of ps. + + tid min_tid = ps.begin()->first; + tid max_tid = ps.rbegin()->first; + size_t tid_range = max_tid - min_tid + 1; + + boost::dynamic_bitset<> confirmed(tid_range); + boost::dynamic_bitset<> ancs(tid_range); + for (path_state::const_iterator i = ps.begin(); i != ps.end(); ++i) { tid curr = i->first; path_item item = i->second; - std::map ancs; + ancs.reset(); - while (confirmed.find(curr) == confirmed.end()) + while (confirmed.test(curr - min_tid) == false) { sanity_check_path_item(item); - I(ancs.find(curr) == ancs.end()); - ancs.insert(std::make_pair(curr,true)); + I(ancs.test(curr - min_tid) == false); + ancs.set(curr - min_tid); if (path_item_parent(item) == root_tid) break; else @@ -542,10 +554,8 @@ I(path_item_type(item) == ptype_directory); } } - std::copy(ancs.begin(), ancs.end(), - inserter(confirmed, confirmed.begin())); + confirmed |= ancs; } - I(confirmed.find(root_tid) == confirmed.end()); } static void --- smap.hh +++ smap.hh @@ -86,11 +86,11 @@ std::sort(vec.begin(), vec.end(), val_cmp); // make sure we don't have any duplicate entries const_iterator leader, lagged; - lagged = begin(); - leader = begin(); - I(leader != end()); + lagged = vec.begin(); + leader = vec.begin(); + I(leader != vec.end()); ++leader; - for (; leader != end(); ++lagged, ++leader) + for (; leader != vec.end(); ++lagged, ++leader) I(lagged->first != leader->first); damaged = false; } @@ -165,13 +165,13 @@ iterator begin() { return vec.begin(); } iterator end() { return vec.end(); } - iterator rbegin() { return vec.rbegin(); } - iterator rend() { return vec.rend(); } + reverse_iterator rbegin() { return vec.rbegin(); } + reverse_iterator rend() { return vec.rend(); } const_iterator begin() const { return vec.begin(); } const_iterator end() const { return vec.end(); } - const_iterator rbegin() const { return vec.rbegin(); } - const_iterator rend() const { return vec.rend(); } + const_reverse_iterator rbegin() const { return vec.rbegin(); } + const_reverse_iterator rend() const { return vec.rend(); } bool empty() const { return vec.empty(); } size_type size() const { return vec.size(); }