X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FGraph.cpp;h=86694eea585da9f5006da496ede63615a24c9f7e;hb=125ed160d625368520074f2898c0487d30d46b98;hp=874bbb7f08d6223137011db510414f57da6122a0;hpb=2cd88f07b3a7c862584a20d6b1050ce71f8d42e1;p=lyx.git diff --git a/src/Graph.cpp b/src/Graph.cpp index 874bbb7f08..86694eea58 100644 --- a/src/Graph.cpp +++ b/src/Graph.cpp @@ -17,19 +17,18 @@ #include "support/debug.h" #include "support/lassert.h" -#include - 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 +37,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::getReachableTo(int target, bool clear_visited) +Graph::EdgePath const + Graph::getReachableTo(int to, bool clear_visited) { - vector result; + EdgePath result; queue Q; - if (!bfs_init(target, clear_visited, &Q)) + if (!bfs_init(to, clear_visited, Q)) return result; // Here's the logic, which is shared by the other routines. @@ -62,7 +61,7 @@ vector const while (!Q.empty()) { int const current = Q.front(); Q.pop(); - if (current != target || formats.get(target).name() != "lyx") + if (current != to || theFormats().get(to).name() != "lyx") result.push_back(current); vector::iterator it = vertices_[current].in_arrows.begin(); @@ -80,24 +79,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 +109,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 +125,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 +157,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;