toposort: use lambda to obtain the neighbours of a vertex
MODIFY
include/vcpkg_Graphs.h
include/vcpkg_Graphs.h
@@ -20,20 +20,23 @@ namespace vcpkg::Graphs
template <class V>
class Graph
{
+ template <class Func>
static void find_topological_sort_internal(V vertex,
ExplorationStatus& status,
- const std::unordered_map<V, std::unordered_set<V>>& adjacency_list,
+ const Func adjacency_list_provider,
std::unordered_map<V, ExplorationStatus>& exploration_status,
std::vector<V>& sorted)
{
status = ExplorationStatus::PARTIALLY_EXPLORED;
- for (V neighbour : adjacency_list.at(vertex))
+ auto neighbours = adjacency_list_provider(vertex);
+
+ for (V neighbour : neighbours)
{
ExplorationStatus& neighbour_status = exploration_status[neighbour];
if (neighbour_status == ExplorationStatus::NOT_EXPLORED)
{
- find_topological_sort_internal(neighbour, neighbour_status, adjacency_list, exploration_status, sorted);
+ find_topological_sort_internal(neighbour, neighbour_status, adjacency_list_provider, exploration_status, sorted);
}
else if (neighbour_status == ExplorationStatus::PARTIALLY_EXPLORED)
{
@@ -85,7 +88,11 @@ namespace vcpkg::Graphs
ExplorationStatus& status = exploration_status[vertex];
if (status == ExplorationStatus::NOT_EXPLORED)
{
- find_topological_sort_internal(vertex, status, this->vertices, exploration_status, sorted);
+ find_topological_sort_internal(vertex,
+ status,
+ [this](const V& v) { return this->vertices.at(v); },
+ exploration_status,
+ sorted);
}
}
}

toposort: use lambda to obtain the neighbours of a vertex