void Converters::buildGraph()
{
+ // clear graph's data structures
G_.init(formats.size());
ConverterList::iterator beg = converterlist_.begin();
ConverterList::iterator const end = converterlist_.end();
+ // each of the converters knows how to convert one format to another
+ // so, for each of them, we create an arrow on the graph, going from
+ // the one to the other
for (ConverterList::iterator it = beg; it != end ; ++it) {
- int const s = formats.getNumber(it->from);
- int const t = formats.getNumber(it->to);
- G_.addEdge(s,t);
+ int const from = formats.getNumber(it->from);
+ int const to = formats.getNumber(it->to);
+ G_.addEdge(from, to);
}
}
if (from == to)
return true;
- int const s = bfs_init(from);
- if (s < 0 || to < 0)
+ if (to < 0 || bfs_init(from) < 0)
return false;
while (!Q_.empty()) {
}
-Graph::EdgePath const
-Graph::getPath(int from, int t)
+Graph::EdgePath const Graph::getPath(int from, int to)
{
EdgePath path;
- if (from == t)
+ if (from == to)
return path;
int const s = bfs_init(from);
- if (s < 0 || t < 0)
+ if (s < 0 || to < 0)
return path;
vector<int> prev_edge(formats.size());
while (!Q_.empty()) {
int const i = Q_.front();
Q_.pop();
- if (i == t) {
+ if (i == to) {
found = true;
break;
}
if (!found)
return path;
- while (t != s) {
- path.push_back(prev_edge[t]);
- t = prev_vertex[t];
+ while (to != s) {
+ path.push_back(prev_edge[to]);
+ to = prev_vertex[to];
}
reverse(path.begin(), path.end());
return path;
}
+
void Graph::init(int size)
{
vertices_ = vector<Vertex>(size);
numedges_ = 0;
}
-void Graph::addEdge(int s, int t)
+
+void Graph::addEdge(int from, int to)
{
- vertices_[t].in_vertices.push_back(s);
- vertices_[s].out_vertices.push_back(t);
- vertices_[s].out_edges.push_back(numedges_++);
+ vertices_[to].in_vertices.push_back(from);
+ vertices_[from].out_vertices.push_back(to);
+ vertices_[from].out_edges.push_back(numedges_++);
}
+
vector<Graph::Vertex> Graph::vertices_;
Graph() : numedges_(0) {};
///
typedef std::vector<int> EdgePath;
- ///
- std::vector<int> const
- getReachableTo(int, bool clear_visited);
- ///
+ /// \return a vector of the vertices from which "to" can be reached
+ std::vector<int> const getReachableTo(int to, bool clear_visited);
+ /// \return a vector of the vertices that can be reached from "from"
std::vector<int> const
- getReachable(int, bool only_viewable,
- bool clear_visited);
- ///
- bool isReachable(int, int);
- ///
- EdgePath const getPath(int, int);
- ///
- void addEdge(int s, int t);
- ///
+ getReachable(int from, bool only_viewable, bool clear_visited);
+ /// Can "from" be reached from "to"?
+ bool isReachable(int from, int to);
+ /// Find a path from "from" to "to".
+ EdgePath const getPath(int from, int to);
+ /// Called repeatedly to build the graph.
+ void addEdge(int from, int to);
+ /// Reset the internal data structures.
void init(int size);
private:
std::vector<int> out_edges;
};
///
- static
- std::vector<Vertex> vertices_;
+ static std::vector<Vertex> vertices_;
///
std::vector<bool> visited_;
///