]> git.lyx.org Git - lyx.git/blobdiff - src/Graph.cpp
listerrors.lyx : Update a link.
[lyx.git] / src / Graph.cpp
index 874bbb7f08d6223137011db510414f57da6122a0..97427bcf1a662566b720ca1a89612099523eb072 100644 (file)
@@ -24,12 +24,13 @@ using namespace std;
 namespace lyx {
 
 
-bool Graph::bfs_init(int s, bool clear_visited, queue<int>* Q)
+bool Graph::bfs_init(int s, bool clear_visited, queue<int> & Q)
 {
-       if (s < 0 || !Q)
+       if (s < 0)
                return false;
-
-       *Q = queue<int>();
+       
+       if (!Q.empty())
+               Q = queue<int>();
 
        if (clear_visited) {
                vector<Vertex>::iterator it = vertices_.begin();
@@ -38,19 +39,19 @@ bool Graph::bfs_init(int s, bool clear_visited, queue<int>* Q)
                        it->visited = false;
        }
        if (!vertices_[s].visited) {
-               Q->push(s);
+               Q.push(s);
                vertices_[s].visited = true;
        }
        return true;
 }
 
 
-vector<int> const
+Graph::EdgePath const
        Graph::getReachableTo(int target, bool clear_visited)
 {
-       vector<int> result;
+       EdgePath result;
        queue<int> 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.
@@ -80,13 +81,13 @@ vector<int> const
 }
 
 
-vector<int> const
+Graph::EdgePath const
        Graph::getReachable(int from, bool only_viewable,
-               bool clear_visited)
+               bool clear_visited, set<int> excludes)
 {
-       vector<int> result;
+       EdgePath result;
        queue<int> Q;
-       if (!bfs_init(from, clear_visited, &Q))
+       if (!bfs_init(from, clear_visited, Q))
                return result;
 
        while (!Q.empty()) {
@@ -110,7 +111,8 @@ vector<int> 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<int> 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<int> Q;
-       if (to < 0 || !bfs_init(from, true, &Q))
+       if (to < 0 || !bfs_init(from, true, Q))
                return EdgePath();
 
        vector<EdgePath> pathes;