From 612d941afc1339154354145f6fa5264d3c573cc0 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 10 Apr 2017 18:45:44 -0700 Subject: toposort: use lambda to obtain the neighbours of a vertex --- toolsrc/include/vcpkg_Graphs.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'toolsrc/include') diff --git a/toolsrc/include/vcpkg_Graphs.h b/toolsrc/include/vcpkg_Graphs.h index 933d9ac67..fb57a38db 100644 --- a/toolsrc/include/vcpkg_Graphs.h +++ b/toolsrc/include/vcpkg_Graphs.h @@ -20,20 +20,23 @@ namespace vcpkg::Graphs template class Graph { + template static void find_topological_sort_internal(V vertex, ExplorationStatus& status, - const std::unordered_map>& adjacency_list, + const Func adjacency_list_provider, std::unordered_map& exploration_status, std::vector& 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); } } } -- cgit v1.2.3