86 const std::set<T> & nodes,
87 std::function<std::set<T>(
const T &)> getEdges,
88 std::function<
void(
const T &)> processNode)
92 std::map<T, std::set<T>> refs, rrefs;
95 Sync<Graph> graph_(Graph{nodes, {}, {}});
97 std::function<void(
const T &)> worker;
103 worker = [&](
const T & node) {
106 auto graph(graph_.lock());
107 auto i = graph->refs.find(node);
108 if (
i == graph->refs.end())
115 auto refs = getEdges(node);
119 auto graph(graph_.lock());
120 for (
auto &
ref : refs)
121 if (graph->left.count(
ref)) {
122 graph->refs[node].insert(
ref);
123 graph->rrefs[
ref].insert(node);
125 if (graph->refs[node].empty())
138 auto graph(graph_.lock());
139 for (
auto & rref : graph->rrefs[node]) {
140 auto & refs(graph->refs[rref]);
141 auto i = refs.find(node);
142 assert(
i != refs.end());
145 pool.
enqueue(std::bind(worker, rref));
147 graph->left.erase(node);
148 graph->refs.erase(node);
149 graph->rrefs.erase(node);
153 for (
auto & node : nodes) {
155 pool.
enqueue(std::bind(worker, std::ref(node)));
156 }
catch (ThreadPoolShutDown &) {
166 if (!graph_.lock()->left.empty())
167 throw Error(
"graph processing incomplete (cyclic reference?)");
void processGraph(const std::set< T > &nodes, std::function< std::set< T >(const T &)> getEdges, std::function< void(const T &)> processNode)
Definition thread-pool.hh:85