X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FGraph.cpp;h=036bb38857359e6d8a6f78b8c568b97ca6d8c89e;hb=908afb8e971d210202b883480968305e30ae0699;hp=874bbb7f08d6223137011db510414f57da6122a0;hpb=2cd88f07b3a7c862584a20d6b1050ce71f8d42e1;p=lyx.git diff --git a/src/Graph.cpp b/src/Graph.cpp index 874bbb7f08..036bb38857 100644 --- a/src/Graph.cpp +++ b/src/Graph.cpp @@ -24,12 +24,13 @@ using namespace std; namespace lyx { -bool Graph::bfs_init(int s, bool clear_visited, queue* Q) +bool Graph::bfs_init(int s, bool clear_visited, queue & Q) { - if (s < 0 || !Q) + if (s < 0) return false; - *Q = queue(); + if (!Q.empty()) + Q = queue(); if (clear_visited) { vector::iterator it = vertices_.begin(); @@ -38,19 +39,19 @@ bool Graph::bfs_init(int s, bool clear_visited, queue* Q) it->visited = false; } if (!vertices_[s].visited) { - Q->push(s); + Q.push(s); vertices_[s].visited = true; } return true; } -vector const +Graph::EdgePath const Graph::getReachableTo(int target, bool clear_visited) { - vector result; + EdgePath result; queue Q; - if (!bfs_init(target, clear_visited, &Q)) + if (!bfs_init(target, clear_visited, Q)) return result; // Here's the logic, which is shared by the other routines. @@ -62,7 +63,7 @@ vector const while (!Q.empty()) { int const current = Q.front(); Q.pop(); - if (current != target || formats.get(target).name() != "lyx") + if (current != target || theFormats().get(target).name() != "lyx") result.push_back(current); vector::iterator it = vertices_[current].in_arrows.begin(); @@ -80,24 +81,24 @@ vector const } -vector const +Graph::EdgePath const Graph::getReachable(int from, bool only_viewable, - bool clear_visited) + bool clear_visited, set excludes) { - vector result; + EdgePath result; queue Q; - if (!bfs_init(from, clear_visited, &Q)) + if (!bfs_init(from, clear_visited, Q)) return result; while (!Q.empty()) { int const current = Q.front(); Q.pop(); - Format const & format = formats.get(current); + Format const & format = theFormats().get(current); if (!only_viewable || !format.viewer().empty()) result.push_back(current); else if (format.isChildFormat()) { Format const * const parent = - formats.getFormat(format.parentFormat()); + theFormats().getFormat(format.parentFormat()); if (parent && !parent->viewer().empty()) result.push_back(current); } @@ -110,7 +111,8 @@ vector const int const cv = (*cit)->to; if (!vertices_[cv].visited) { vertices_[cv].visited = true; - Q.push(cv); + if (excludes.find(cv) == excludes.end()) + Q.push(cv); } } } @@ -125,7 +127,7 @@ bool Graph::isReachable(int from, int to) return true; queue Q; - if (to < 0 || !bfs_init(from, true, &Q)) + if (to < 0 || !bfs_init(from, true, Q)) return false; while (!Q.empty()) { @@ -157,7 +159,7 @@ Graph::EdgePath const Graph::getPath(int from, int to) return EdgePath(); queue Q; - if (to < 0 || !bfs_init(from, true, &Q)) + if (to < 0 || !bfs_init(from, true, Q)) return EdgePath(); vector pathes;