Slot allocate_slot(Id id) { if (id > id_to_slot_map_.length()) id_to_slot_map_.resize(id); const Slot slot = (Slot) slot_to_id_map_.length(); slot_to_id_map_.emplace_back(id); id_to_slot_map_[id - 1] = slot; return slot; }
void component_leaders( Graph& g, const ComponentMap& C, dynamic_array<typename graph_traits<Graph>::vertex_descriptor>& leaders) { #pragma mta noalias g #pragma mta noalias C #pragma mta noalias leaders typedef typename graph_traits<Graph>::size_type size_type; typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor; typedef typename graph_traits<Graph>::thread_vertex_iterator thread_vertex_iterator; size_type order = num_vertices(g); size_type* rcount = (size_type*) malloc(order * sizeof(size_type)); for (size_type i = 0; i < order; ++i) rcount[i] = 0; size_type stream_id = 0; size_type num_streams = 1; // Count the number of vertices in each component. #pragma mta for all streams stream_id of num_streams { size_type start_pos = begin_block_range(order, stream_id, num_streams); size_type end_pos = end_block_range(order, stream_id, num_streams); thread_vertex_iterator verts = thread_vertices(start_pos, g); for ( ; start_pos != end_pos; ++start_pos, ++verts) { mt_incr(rcount[C[*verts]], 1); } } size_type num_components = 0; // Count the number of components. #pragma mta assert nodep for (size_type i = 0; i < order; ++i) { if (rcount[i] > 0) mt_incr(num_components, 1); } // Resize the leaders array. leaders.resize(num_components); num_components = 0; // Put the leaders for each component in the leaders array. #pragma mta for all streams stream_id of num_streams { size_type start_pos = begin_block_range(order, stream_id, num_streams); size_type end_pos = end_block_range(order, stream_id, num_streams); thread_vertex_iterator verts = thread_vertices(start_pos, g); for ( ; start_pos != end_pos; ++start_pos, ++verts) { if (rcount[start_pos] > 0) { size_type pos = mt_incr(num_components, 1); leaders[pos] = *verts; } } } free(rcount); }