# # # patch "enumerator.cc" # from [a18e01367c2fd10e20c36995c0afc569feef69ab] # to [6f782f247962a77fae94823273cf195a89be333a] # # patch "enumerator.hh" # from [31c35c4a2d1e92eec3bb5f3659706e6bec8649fa] # to [f320216407b6b06b74fbb692f5bf7d24b73a1868] # ============================================================ --- enumerator.cc a18e01367c2fd10e20c36995c0afc569feef69ab +++ enumerator.cc 6f782f247962a77fae94823273cf195a89be333a @@ -14,6 +14,7 @@ #include "vocab.hh" using std::deque; +using std::make_pair; using std::map; using std::multimap; using std::pair; @@ -29,7 +30,7 @@ for (set::const_iterator i = initial.begin(); i != initial.end(); ++i) revs.push_back(*i); - app.db.get_revision_ancestry(graph); + load_graphs(); } revision_enumerator::revision_enumerator(enumerator_callbacks & cb, @@ -38,9 +39,36 @@ { revision_id root; revs.push_back(root); + load_graphs(); +} + +void +revision_enumerator::load_graphs() +{ app.db.get_revision_ancestry(graph); + for (multimap::const_iterator i = graph.begin(); + i != graph.end(); ++i) + { + inverse_graph.insert(make_pair(i->second, i->first)); + } } +bool +revision_enumerator::all_parents_enumerated(revision_id const & child) +{ + typedef multimap::const_iterator ci; + pair range = inverse_graph.equal_range(child); + for (ci i = range.first; i != range.second; ++i) + { + if (i->first == child) + { + if (enumerated_nodes.find(i->second) == enumerated_nodes.end()) + return false; + } + } + return true; +} + bool revision_enumerator::done() { @@ -57,6 +85,14 @@ revision_id r = revs.front(); revs.pop_front(); + if (!all_parents_enumerated(r)) + { + revs.push_back(r); + continue; + } + + enumerated_nodes.insert(r); + if (terminal_nodes.find(r) == terminal_nodes.end()) { typedef multimap::const_iterator ci; ============================================================ --- enumerator.hh 31c35c4a2d1e92eec3bb5f3659706e6bec8649fa +++ enumerator.hh f320216407b6b06b74fbb692f5bf7d24b73a1868 @@ -48,9 +48,11 @@ enumerator_callbacks & cb; app_state & app; std::set terminal_nodes; + std::set enumerated_nodes; std::deque revs; std::deque items; std::multimap graph; + std::multimap inverse_graph; revision_enumerator(enumerator_callbacks & cb, app_state & app, @@ -58,6 +60,8 @@ std::set const & terminal); revision_enumerator(enumerator_callbacks & cb, app_state & app); + void load_graphs(); + bool all_parents_enumerated(revision_id const & child); void step(); bool done(); };