From: Arnaud Giersch Date: Tue, 7 Nov 2017 22:28:10 +0000 (+0100) Subject: DijkstraZone: replace xbt_heap_t with std::priority_queue. X-Git-Tag: v3.18~242^2~71 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/1de2a885e88668e88949f76ce2ca26516e1046b9?ds=sidebyside DijkstraZone: replace xbt_heap_t with std::priority_queue. --- diff --git a/src/kernel/routing/DijkstraZone.cpp b/src/kernel/routing/DijkstraZone.cpp index 0c5123d599..71789001f0 100644 --- a/src/kernel/routing/DijkstraZone.cpp +++ b/src/kernel/routing/DijkstraZone.cpp @@ -8,6 +8,8 @@ #include "src/surf/network_interface.hpp" #include +#include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf -- dijkstra routing logic"); @@ -167,7 +169,8 @@ void DijkstraZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cb int nr_nodes = xbt_dynar_length(nodes); std::vector cost_arr(nr_nodes); /* link cost from src to other hosts */ pred_arr.resize(nr_nodes); /* predecessors in path from src */ - xbt_heap_t pqueue = xbt_heap_new(nr_nodes, nullptr); + typedef std::pair Qelt; + std::priority_queue, std::greater> pqueue; /* initialize */ cost_arr[src_node_id] = 0.0; @@ -180,14 +183,14 @@ void DijkstraZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cb pred_arr[i] = 0; /* initialize priority queue */ - int* nodeid = new int(i); - xbt_heap_push(pqueue, nodeid, cost_arr[i]); + pqueue.emplace(cost_arr[i], i); } /* apply dijkstra using the indexes from the graph's node array */ - while (xbt_heap_size(pqueue) > 0) { - int* v_id = static_cast(xbt_heap_pop(pqueue)); - xbt_node_t v_node = xbt_dynar_get_as(nodes, *v_id, xbt_node_t); + while (not pqueue.empty()) { + int v_id = pqueue.top().second; + pqueue.pop(); + xbt_node_t v_node = xbt_dynar_get_as(nodes, v_id, xbt_node_t); xbt_edge_t edge = nullptr; unsigned int cursor; @@ -198,18 +201,13 @@ void DijkstraZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cb sg_platf_route_cbarg_t tmp_e_route = static_cast(xbt_graph_edge_get_data(edge)); int cost_v_u = tmp_e_route->link_list->size(); /* count of links, old model assume 1 */ - if (cost_v_u + cost_arr[*v_id] < cost_arr[u_id]) { - pred_arr[u_id] = *v_id; - cost_arr[u_id] = cost_v_u + cost_arr[*v_id]; - int* nodeid = new int(u_id); - xbt_heap_push(pqueue, nodeid, cost_arr[u_id]); + if (cost_v_u + cost_arr[v_id] < cost_arr[u_id]) { + pred_arr[u_id] = v_id; + cost_arr[u_id] = cost_v_u + cost_arr[v_id]; + pqueue.emplace(cost_arr[u_id], u_id); } } - - /* free item popped from pqueue */ - delete v_id; } - xbt_heap_free(pqueue); } /* compose route path with links */