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();
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.
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<Arrow *>::iterator it = vertices_[current].in_arrows.begin();
}
-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()) {
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);
}
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);
}
}
}
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()) {
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;