void connected_components(Graph& g, ComponentMap& result) { #pragma mta noalias g #pragma mta noalias result typedef typename graph_traits<Graph>::size_type size_type; typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor; typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor; typedef typename graph_traits<Graph>::thread_vertex_iterator thread_vertex_iterator; typedef typename graph_traits<Graph>::thread_edge_iterator thread_edge_iterator; size_type order = num_vertices(g); size_type size = num_edges(g); vertex_id_map<Graph> vid_map = get(_vertex_id_map, g); size_type stream_id = 0; size_type num_streams = 1; // Initialize each vertex to have itself as its leader. #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) { put(result, *verts, start_pos); } } // Find the highest degree vertex. size_type* degrees = new size_type[order]; #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) { degrees[start_pos] = out_degree(*verts, g); } } size_type max_deg_vert_id = 0; size_type maxdeg = degrees[0]; #pragma mta assert nodep for (size_type i = 1; i < order; i++) { if (degrees[i] > maxdeg) { maxdeg = degrees[i]; max_deg_vert_id = i; } } delete [] degrees; vertex_descriptor max_deg_vert = *(thread_vertices(max_deg_vert_id, g)); // Search from the highest degree vertex to label the giant component (GCC). detail::news_visitor<Graph, ComponentMap> nvis(result, max_deg_vert); breadth_first_search(g, max_deg_vert, nvis); size_type orphan_edges = 0; #pragma mta for all streams stream_id of num_streams { size_type start_pos = begin_block_range(size, stream_id, num_streams); size_type end_pos = end_block_range(size, stream_id, num_streams); size_type my_orphan_edges = 0; thread_edge_iterator tedgs = thread_edges(start_pos, g); for ( ; start_pos != end_pos; ++start_pos, ++tedgs) { edge_descriptor e = *tedgs; vertex_descriptor u = source(e, g); vertex_descriptor v = target(e, g); if (result[u] != max_deg_vert_id || result[v] != max_deg_vert_id) { ++my_orphan_edges; } } mt_incr(orphan_edges, my_orphan_edges); } size_type next_index = 0; size_type* srcs = new size_type[orphan_edges]; size_type* dests = new size_type[orphan_edges]; #pragma mta for all streams stream_id of num_streams { size_type start_pos = begin_block_range(size, stream_id, num_streams); size_type end_pos = end_block_range(size, stream_id, num_streams); thread_edge_iterator tedgs = thread_edges(start_pos, g); for ( ; start_pos != end_pos; ++start_pos, ++tedgs) { edge_descriptor e = *tedgs; vertex_descriptor u = source(e, g); vertex_descriptor v = target(e, g); if (result[u] != max_deg_vert_id || result[v] != max_deg_vert_id) { size_type my_ind = mt_incr(next_index, 1); srcs[my_ind] = get(vid_map, u); dests[my_ind] = get(vid_map, v); } } } edge_array_adapter<size_type> eaa(srcs, dests, order, orphan_edges); vertex_property_map<edge_array_adapter<size_type>, size_type> eaa_components(eaa); #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) { vertex_descriptor v = *verts; eaa_components[v] = result[v]; } } shiloach_vishkin_no_init(eaa, eaa_components); #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) { vertex_descriptor v = *verts; result[v] = eaa_components[v]; } } delete [] srcs; delete [] dests; }
void DockWnd::timer() { if (++m_state >= 4) m_state = 0; ShowIcon needIcon = State; bool bBlinked = pClient->isConnecting(); unsigned short msgType = 0; if (pMain->messages.size()) msgType = pMain->messages.back().type(); switch (m_state){ case 1: if (msgType){ needIcon = Message; }else if (bBlinked){ needIcon = Blinked; } break; case 2: if (msgType && bBlinked) needIcon = Blinked; break; case 3: if (msgType){ needIcon = Message; }else if (bBlinked){ needIcon = Blinked; } break; } if (needIcon == showIcon) return; showIcon = needIcon; switch (showIcon){ case State: setIcon(Pict(pClient->getStatusIcon())); break; case Message: setIcon(Pict(SIMClient::getMessageIcon(msgType))); break; case Blinked: setIcon(Pict(SIMClient::getStatusIcon(ICQ_STATUS_ONLINE))); break; default: break; } #ifndef WIN32 if (inTray) return; const char *icon = pClient->getStatusIcon(); const char *msg = NULL; const char *bmsg = NULL; if (msgType) bmsg = SIMClient::getMessageIcon(msgType); if (bBlinked){ if (m_state & 1){ icon = SIMClient::getStatusIcon(ICQ_STATUS_ONLINE); }else{ msg = bmsg; } }else{ if (!(m_state & 1)){ msg = bmsg; } } if (wharfIcon){ wharfIcon->set(icon, msg); return; } const QIconSet &icons = Icon(icon); QPixmap nvis(icons.pixmap(QIconSet::Large, QIconSet::Normal)); if (!bEnlightenment){ resize(nvis.width(), nvis.height()); if (msg){ QPixmap msgPict = Pict(msg); QRegion *rgn = NULL; if (nvis.mask() && msgPict.mask()){ rgn = new QRegion(*msgPict.mask()); rgn->translate(nvis.width() - msgPict.width() - SMALL_PICT_OFFS, nvis.height() - msgPict.height() - SMALL_PICT_OFFS); *rgn += *nvis.mask(); } QPainter p; p.begin(&nvis); p.drawPixmap(nvis.width() - msgPict.width() - SMALL_PICT_OFFS, nvis.height() - msgPict.height() - SMALL_PICT_OFFS, msgPict); p.end(); if (rgn){ setMask(*rgn); delete rgn; } }else{ const QBitmap *mask = nvis.mask(); if (mask) setMask(*mask); } } drawIcon = nvis; repaint(); #endif }