Hi,
I want to store pointers in a graph. Can I somehow use their pointers as indexes?
Here's the code I'm trying to execute. It does not work correctly, however;
apparently graph add other nodes in the vector storage (to fill the holes?).
I suppose I could use listS instead of vecS, but then I can't get the
topological_sort code to work (I know I have to provide some form of indices, but I don't
understand how to do that). Any suggestions to solve this?
Thanks!
#include <iostream>
#include
#include
#include
class Plugin {
public:
// some data here
int x;
Plugin(int a) : x(a) {}
};
typedef std::list< std::pair > EdgeList;
typedef boost::adjacency_list
PipelineGraph;
typedef boost::graph_traits<PipelineGraph>::vertex_descriptor PipelineVertex;
void graph(EdgeList edges) {
PipelineGraph graph;
for (EdgeList::iterator it(edges.begin()); it != edges.end(); it++) {
PipelineVertex a(boost::vertex(reinterpret_cast<unsigned long>
(it->first), graph));
PipelineVertex b(boost::vertex(reinterpret_cast<unsigned long>
(it->second), graph));
boost::add_edge(a, b, graph);
}
// sort by topology, so we run the plugins in the correct order
std::vector<PipelineVertex> sorted;
boost::topological_sort(graph, std::back_inserter(sorted));
std::cout << sorted.size() << std::endl;
// REVERSE topological order
std::vector<PipelineVertex> vl(sorted.rbegin(), sorted.rend());
// loop
for (std::vector<PipelineVertex>::iterator it(vl.begin());
it != vl.end(); it++) {
Plugin *p = reinterpret_cast(*it);
std::cout << p->x << std::endl;
}
}
int main() {
EdgeList edges;
Plugin *a = new Plugin(1);
Plugin *b = new Plugin(2);
Plugin *c = new Plugin(3);
Plugin *d = new Plugin(4);
edges.push_back(std::pair(a, b));
edges.push_back(std::pair(b, c));
edges.push_back(std::pair(b, d));
graph(edges);
return 0;
}