diff --git a/src/util/graph.h b/src/util/graph.h index def3ace1258..e5277ada414 100644 --- a/src/util/graph.h +++ b/src/util/graph.h @@ -312,6 +312,7 @@ class grapht std::list topsort() const; + std::vector get_predecessors(const node_indext &n) const; std::vector get_successors(const node_indext &n) const; void output_dot(std::ostream &out) const; void for_each_successor( @@ -934,6 +935,19 @@ void output_dot_generic( }); } +template +std::vector::node_indext> +grapht::get_predecessors(const node_indext &n) const +{ + std::vector result; + std::transform( + nodes[n].in.begin(), + nodes[n].in.end(), + std::back_inserter(result), + [&](const std::pair &edge) { return edge.first; }); + return result; +} + template std::vector::node_indext> grapht::get_successors(const node_indext &n) const diff --git a/unit/util/graph.cpp b/unit/util/graph.cpp index aef27d2250b..40ff2a4fc59 100644 --- a/unit/util/graph.cpp +++ b/unit/util/graph.cpp @@ -310,3 +310,25 @@ SCENARIO("graph-connected-subgraphs", } } } + +SCENARIO("predecessors-successors-graph", "[core][util][graph]") +{ + GIVEN("A graph") + { + simple_grapht graph; + simple_grapht::node_indext indices[2]; + + for(int i = 0; i < 2; ++i) + indices[i] = graph.add_node(); + + graph.add_edge(indices[0], indices[1]); + + THEN("Nodes should have correct successors and predecessors") + { + REQUIRE(graph.get_predecessors(indices[0]).size() == 0); + REQUIRE(graph.get_successors(indices[0]).size() == 1); + REQUIRE(graph.get_predecessors(indices[1]).size() == 1); + REQUIRE(graph.get_successors(indices[1]).size() == 0); + } + } +}