void ThreadList::updateSorting() { switch(sort_column) { case COL_ID: sortByID(); break; case COL_LOCATION: sortByLocation(); break; case COL_CPUUSAGE: sortByCpuUsage(); break; } fillList(); }
void build(Node& node, int level = 0) { if (node.points.size() <= leaf_size || level >= max_level) { sortByRank(node.points); } else { const bool by_x = (level % 2) == 0; sortByLocation(node.points, by_x); int middle_idx = node.points.size() / 2; node.split = by_x ? node.points[middle_idx].x : node.points[middle_idx].y; node.left.reset(new Node(node.points.begin(), node.points.begin() + middle_idx)); node.right.reset(new Node(node.points.begin() + middle_idx, node.points.end())); node.left->rect = node.rect; node.right->rect = node.rect; if (by_x) { node.left->rect.hx = node.split; node.right->rect.lx = node.split; } else { node.left->rect.hy = node.split; node.right->rect.ly = node.split; } std::future<void> futures[2]; if (level <= min_level) { Points empty; node.points.swap(empty); } else { futures[0] = std::async(std::launch::async, [&node] { sortByRank(node.points); }); } futures[1] = std::async(std::launch::async, [&node, level] { build(*node.left, level + 1); }); build(*node.right, level + 1); for (auto& f: futures) if (f.valid()) f.wait(); } }